Gloynus_Aleos
@Gloynus_Aleos
Эльф

PhpSpreadsheet как сохранить изменения в тот же файл?

Как загрузить данные из XLSX-файла — знаю, практикую.
Как создать XLSX-файл с нужными данными — знаю, но не практикую.
Как загрузить данные из XLSX-файла, а потом в него же сохранить изменения (вот прям в конкретную ячейку, не трогая других) — не знаю и не могу понять.
Очень прошу разъяснить мне это.

Загружаю и работаю с данными так.
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;

$file1 = '123.xlsx';
$Reader = new Xlsx();

$deck_table = $Reader->load($file1);
$deck_table->setActiveSheetIndexByName('Страница 2');

$deck_base = $deck_table->getActiveSheet()->rangeToArray('A1:AO100', '0', true, true, true);

foreach ($deck_base as $key => $value)
{
 // в общем, тут длинный цикл, который по очереди меняет данные в нужных ячейках вот таким образом
 // $deck_table->getActiveSheet()->setCellValue($key . $result, $aaa);
 // и если обратиться к тем ячейкам, то там действительно есть данные
 //  echo $deck_table->getActiveSheet()->getCell($key . $result)->getValue() . '<br>';
}
// но что мне написать, чтобы потом все эти изменения сохранить в тот же файл, из которого я взял данные?


Попытки использовать методы из этой инструкции провалились: https://phpspreadsheet.readthedocs.io/en/stable/to.... Словно я могут либо только прочитать, либо только создать.

Код с их главной страницы тоже не позволяет сохранить изменения.
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');

$spreadsheet = $Reader;
$writer = new Xlsx($spreadsheet);
$writer->save('hello world.xlsx');

Файл-то создать запросто. Создаётся.
Но вот как мне сюда:
$writer = new Xlsx($spreadsheet); $writer->save('hello world.xlsx');
— передать мои данные?
Или что вообще надо сделать?
  • Вопрос задан
  • 2984 просмотра
Решения вопроса 1
Gloynus_Aleos
@Gloynus_Aleos Автор вопроса
Эльф
Оказалось, что ошибка в какой-то формуле (точнее, в типе некоторых формул из интерактивных таблиц).
Вот эта строка исключает обработку формул:
$writer->setPreCalculateFormulas(false);
и файл сохраняется.

В сумме сохранение изменений в тот же файл выглядит так:
$writer = IOFactory::createWriter($deck_table, "Xlsx");
$writer->setPreCalculateFormulas(false);
$writer->save($file1);


Но затрагивает всё. Все стили, все формулы, всё что есть.
Есть ли способ изменить данные только в конкретных ячейках, не трогая ничего больше?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Galdar
Web, JS, PHP, NGINX, Linux
К setCellValue() можно применить цикл и различные функции, вывод из БД из массива и т.д.
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1'), 'Text')->setCellValue('B1'), 'Text').....;
Ответ написан
ZXSpectrum48k
@ZXSpectrum48k
Вот здесь есть решение https://stackoverflow.com/questions/58213250/how-t...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы