В 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".
Его блокировка всего рабочего листа. Можно ли заблокировать только конкретную ячейку и оставить доступными другие ячейки?
Наконец, я нашел правильный способ сделать это.
$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);
Это работает отлично!
sravis заставил меня на правильном пути, но все же остается один недостаток: если вы это сделаете, вы можете просто удалить блокировку листа с помощью Excel без ввода пароля (так же, как он сообщает вам, когда вы нажимаете на ячейку, не заблокирован с паролем).
Чтобы заблокировать лист Excel с паролем и снять защиту с нескольких ячеек, вам необходимо защитить лист (а не только пару ячеек), а затем снять защиту с некоторых ячеек:
$sheet->getProtection()->setPassword('password hare'); $sheet->getProtection()->setSheet(true); $sheet->getStyle('A1:B2')->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);
Таким образом, пользователь должен будет ввести пароль при попытке снять защиту с помощью Excel.
/* 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);