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);