PHPExcel блокирует определенную ячейку

В phpexcel я смог заблокировать ячейку

$objPHPExcel->getActiveSheet()->protectCells('A1:D1', 'php');
$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);

Если я дважды щелкнул по любой ячейке между A1 и D1, она попросит пароль как следует.

Но если я дважды щелкнул по любой другой ячейке (например) A2, она говорит

"The cell or chart that you are trying to change is protected and therefore 
read-only".

Его блокировка всего рабочего листа. Можно ли заблокировать только конкретную ячейку и оставить доступными другие ячейки?

Ответ 1

Наконец, я нашел правильный способ сделать это.

$objPHPExcel = new PHPExcel;
$objSheet = $objPHPExcel->getActiveSheet();

//ЗАЩИТА ДАННЫХ КЛЕТОК

$objSheet->protectCells('A1:B1', 'PHP');

//УЛУЧШИТЬ ДИАПАЗОН КЛЕТОК

$objSheet->getStyle('A2:B2')->getProtection()
->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);

//ЗАЩИЩАЙТЕ РАБОЧИЙ ЛИСТ

$objSheet->getProtection()->setSheet(true);

Это прекрасно работает!

Ответ 2

sravis помог мне на правильном пути, но все еще остается один недостаток: если вы сделаете это так, вы можете просто удалить блокировку листа с помощью Excel без ввода пароля (так же, как он сообщает вам, когда вы нажимаете на ячейку, которая не заблокирована паролем).

Чтобы заблокировать лист Excel с паролем и снять защиту с нескольких ячеек, вам необходимо защитить лист (а не только пару ячеек), а затем снять защиту с некоторых ячеек:

$sheet->getProtection()->setPassword('password hare');
$sheet->getProtection()->setSheet(true);
$sheet->getStyle('A1:B2')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);

Таким образом, пользователь должен будет ввести пароль при попытке снять защиту с помощью Excel.

Ответ 3

/* this section lock for all sheet */
$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);

/*  and this section unlock cell rage('A2:Z2') from locked sheet */
$objPHPExcel->getActiveSheet()->getStyle('A2:Z500')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);