PHPExcel lock particular cell
Finally, i found the right way to do it..
$objPHPExcel = new PHPExcel;
$objSheet = $objPHPExcel->getActiveSheet();
//PROTECT THE CELL RANGE
$objSheet->protectCells('A1:B1', 'PHP');
// UNPROTECT THE CELL RANGE
$objSheet->getStyle('A2:B2')->getProtection()
->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);
// PROTECT THE WORKSHEET SHEET
$objSheet->getProtection()->setSheet(true);
This is working perfectly!
If you are using PhpSpreadsheet which is successor of PHPExcel by now,
$sheet->getStyle('A1:B2')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED)
will give class not found error.
Solution:
use PhpOffice\PhpSpreadsheet\Style\Protection;
$sheet->getProtection()->setSheet(true);
$sheet->getStyle('A1:A10')->getProtection()
->setLocked(Protection::PROTECTION_UNPROTECTED);
This will work.
sravis got me on the right track, but still one flaw remains: if you do it that way, you can still just remove the locking of the sheet using Excel without entering a password (just as it tells you when you click on a cell that's not locked with a password).
To lock an Excel-sheet with a password and unprotect a couple of cells, you need to protect the sheet (instead of just a couple of cells) and then unprotect some cells:
$sheet->getProtection()->setPassword('password hare');
$sheet->getProtection()->setSheet(true);
$sheet->getStyle('A1:B2')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);
That way the user will have to enter the password when trying to unprotect the sheet using Excel.