Después de tanto batallar pudimos encontrar la solución de este atolladero que tantos lectores de esta web presentan. Si deseas compartir algo no dejes de aportar tu información.
Solución:
Finalmente, encontré la manera correcta de hacerlo.
$objPHPExcel = new PHPExcel;
$objSheet = $objPHPExcel->getActiveSheet();
//PROTEGE LA GAMA CELULAR
$objSheet->protectCells('A1:B1', 'PHP');
// DESPROTEGE LA GAMA CELULAR
$objSheet->getStyle('A2:B2')->getProtection()
->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);
// PROTEGER LA HOJA DE TRABAJO
$objSheet->getProtection()->setSheet(true);
¡Esto está funcionando perfectamente!
sravis me puso en el camino correcto, pero aún queda una falla: si lo hace de esa manera, aún puede eliminar el bloqueo de la hoja usando Excel sin ingresar una contraseña (tal como le indica cuando hace clic en una celda que es no bloqueado con una contraseña).
Para bloquear una hoja de Excel con una contraseña y desproteger un par de celdas, debe proteger la hoja (en lugar de solo un par de celdas) y luego desproteger algunas celdas:
$sheet->getProtection()->setPassword('password hare');
$sheet->getProtection()->setSheet(true);
$sheet->getStyle('A1:B2')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);
De esa forma el usuario tendrá que ingresar la contraseña cuando intente desproteger la hoja usando Excel.
Si está utilizando PhpSpreadsheet, que es el sucesor de PHPExcel por ahora,
$sheet->getStyle('A1:B2')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED)
dará error de clase no encontrada.
Solución:
use PhpOfficePhpSpreadsheetStyleProtection;
$sheet->getProtection()->setSheet(true);
$sheet->getStyle('A1:A10')->getProtection()
->setLocked(Protection::PROTECTION_UNPROTECTED);
Esto funcionará.
Recuerda compartir este ensayo si te fue de ayuda.