Защитите содержимое ячейки, но разрешите удаление строк с помощью PHPSpreadSheet - PullRequest
0 голосов
/ 16 ноября 2018

Как запретить редактирование содержимого ячейки, но разрешить удаление строк.

Контекст: электронная таблица должна быть загружена, обновлена ​​и импортирована. Там, где может быть много много строк, но для импорта требуется только пара строк. Столбцы 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');

Может кто-нибудь сообщить, возможно ли это, и если да, то чего мне не хватает в приведенном выше коде для достижения этой цели?

...