Как запретить редактирование содержимого ячейки, но разрешить удаление строк.
Контекст: электронная таблица должна быть загружена, обновлена и импортирована. Там, где может быть много много строк, но для импорта требуется только пара строк. Столбцы customer_email
и site_id
должны быть защищены, но доступ можно обновить до Yes
или No
, а строки удалить, чтобы импортировать только необходимые данные.
Начальная загрузка:
customer_email | site_id | access
alice@email.com | 1 | Yes
alice@email.com | 2 | No
alice@email.com | 3 | No
bob@email.com | 1 | No
bob@email.com | 2 | No
bob@email.com | 3 | Yes
Строки удалены и access
обновлены:
customer_email | site_id | access
alice@email.com | 1 | No
bob@email.com | 1 | No
Существует рецепт для защиты листа и полный список функций, которые можно увидеть на github , но я не получаю то, что хочу, и я не уверен в этом возможно. Рецепт гласит:
Excel предлагает 3 уровня «защиты»:
Документ: позволяет установить пароль в полной электронной таблице, позволяя вносить изменения только после ввода этого пароля.
Рабочий лист: предлагает другие параметры безопасности: вы можете запретить вставку строк на определенный лист, запретить сортировку, ...
Ячейка: предлагает возможность заблокировать / разблокировать ячейку, а также показать / скрыть внутреннюю формулу.
Но неясно, можно ли заблокировать содержимое ячеек, позволяя удалять строки. Я попытался сделать это с помощью следующего кода, но опция удаления остается серой, если щелкнуть правой кнопкой мыши строку.
После запуска composer require phpoffice/phpspreadsheet
добавить test.php
:
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'some data');
$sheet->setCellValue('A2', 'other data');
$sheet->setCellValue('A3', 'more data');
$spreadsheet->getActiveSheet()->getProtection()
->setSheet(true)
->setDeleteRows(true);
$writer = new Xlsx($spreadsheet);
$writer->save('test_delete_rows.xlsx');
Может кто-нибудь сообщить, возможно ли это, и если да, то чего мне не хватает в приведенном выше коде для достижения этой цели?