Как использовать phpSpreadSheet для объединения файлов xlsx/xls в один?

Каким образом можно объединить несколько Excel файлов, извлекая листы из каждого файла и добавляя их в один общий файл?
  • 16 января 2024 г. 16:28
Ответы на вопрос 2
Для объединения нескольких файлов Excel (XLSX/XLS) в один с использованием библиотеки PhpSpreadsheet, вам нужно поочередно открыть каждый файл, извлекать из него листы и добавлять их в целевой файл Excel. Ниже привожу пример кода, который делает это:

```php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

// Создаем новый экземпляр Spreadsheet - он будет нашим итоговым файлом
$spreadsheet = new Spreadsheet();

// Массив с названиями файлов, которые нужно объединить
$filesToMerge = ['file1.xlsx', 'file2.xls', 'file3.xlsx'];

// Перебираем файлы для объединения
foreach ($filesToMerge as $file) {
    // Загружаем файл
    $reader = IOFactory::createReaderForFile($file);
    $reader->setReadDataOnly(true); // Опционально, если нам не нужны стили и форматирование
    $loadedSheet = $reader->load($file);

    // Перебираем все листы в загруженном файле
    foreach ($loadedSheet->getWorksheetIterator() as $worksheet) {
        // Создаем новый лист в целевом файле Spreadsheet
        $newSheet = $spreadsheet->createSheet();

        // Копируем данные из текущего листа загруженного файла в новый лист
        $newSheet->fromArray(
            $worksheet->toArray(null, true, true, true) // Получаем данные с форматированием
        );

        // Устанавливаем заголовок нового листа, как в исходном файле
        $sheetTitle = $worksheet->getTitle();
        $newSheet->setTitle($sheetTitle);
    }
}

// Удалите первоначальный пустой лист, который PhpSpreadsheet создает по умолчанию
$sheetIndex = $spreadsheet->getIndex($spreadsheet->getSheetByName('Worksheet'));
$spreadsheet->removeSheetByIndex($sheetIndex);

// Устанавливаем активным первый лист в новом файле
$spreadsheet->setActiveSheetIndex(0);

// Записываем итоговый файл на диск
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('merged_file.xlsx');
```

Обратите внимание, что для запуска данного примера кода у вас должна быть установлена библиотека PhpSpreadsheet и ее зависимости через Composer. Вы можете установить ее с помощью команды:

```bash
composer require phpoffice/phpspreadsheet
```

После выполнения скрипта у вас должен получиться файл `merged_file.xlsx`, в который будут объединены все листы из указанных файлов Excel.
Переписал метод мерджа на 

Но ошибка с некорректным форматированием ячеек все равно осталась, пришлось изменить метод garbageCollect класса Spreadsheet библиотеки phpOffice .
Понимаю, что это неправильно, но так файл начал создаваться (как для xls, так и для xlsx) и все стили подтянулись. Ну и не пишет, что файл поврежден.
Похожие вопросы