PhpSpreadSheet: запись в конкретный рабочий лист - PullRequest
0 голосов
/ 01 ноября 2018

Я новичок в PhpSpreadSheet, и я хотел бы знать, есть ли способ загрузить CSV в конкретный WorkSheet?

Я попробовал приведенный ниже код, но он, похоже, сохраняет загрузку CSV-файлов в первом рабочем листе: /.

<?php

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Csv;

$spreadsheet = new Spreadsheet();
$spreadsheet->setActiveSheetIndex(0);

$pathToCsv1 = 'files/csv_files/1.csv';
$pathToCsv2 = 'files/csv_files/2.csv';
$pathToCsv3 = 'files/csv_files/3.csv';
$pathToCsv4 = 'files/csv_files/4.csv';

$aCsvFiles = array($pathToCsv1, $pathToCsv2, $pathToCsv3, $pathToCsv4);

foreach ($aCsvFiles as $index => $csvFile) {
    $reader = new Csv();
    $reader->setDelimiter(';');
    $reader->loadIntoExisting($csvFile, $spreadsheet);
    $workSheet = $spreadsheet->createSheet();
    $spreadsheet->setActiveSheetIndex($index + 1);
}

$writer = new Xlsx($spreadsheet);
$writer->save('files/xls_files/all.xlsx');

Я получаю только 4.csv в all.xlsx, но у меня есть созданные рабочие таблицы

enter image description here

1 Ответ

0 голосов
/ 07 ноября 2018

Объединение нескольких файлов в один объект электронной таблицы

Хотя вы можете ограничить количество рабочих листов, которые читаются из файл книги, используя метод setLoadSheetsOnly(), некоторые читатели также позволяют комбинировать несколько отдельных «листов» из разных файлов в один Spreadsheet объект, где каждый отдельный файл является один лист в этой книге. Для каждого файла, который вы читаете, вы необходимо указать, какой индекс рабочего листа должен быть загружен в setSheetIndex() метод $reader, затем используйте loadIntoExisting() метод, а не load() метод для фактического чтения файл в эту таблицу.

Пример:

$inputFileType = 'Csv';
$inputFileNames = [
    './sampleData/example1.csv',
    './sampleData/example2.csv'
    './sampleData/example3.csv'
];

/**  Create a new Reader of the type defined in $inputFileType  **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);

/**  Extract the first named file from the array list  **/
$inputFileName = array_shift($inputFileNames);
/**  Load the initial file to the first worksheet in a `Spreadsheet` Object  **/
$spreadsheet = $reader->load($inputFileName);
/**  Set the worksheet title (to the filename that we've loaded)  **/
$spreadsheet->getActiveSheet()
    ->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));

/**  Loop through all the remaining files in the list  **/
foreach($inputFileNames as $sheet => $inputFileName) {
    /**  Increment the worksheet index pointer for the Reader  **/
    $reader->setSheetIndex($sheet+1);
    /**  Load the current file into a new worksheet in Spreadsheet  **/
    $reader->loadIntoExisting($inputFileName,$spreadsheet);
    /**  Set the worksheet title (to the filename that we've loaded)  **/
    $spreadsheet->getActiveSheet()
        ->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME));
}

Обратите внимание, что использование одного и того же индекса листа для нескольких листов не добавит файлы на один лист, но перезапишет результаты предыдущей загрузки. Вы не можете загрузить несколько файлов CSV в один лист.

https://phpspreadsheet.readthedocs.io/en/develop/topics/reading-files/#combining-multiple-files-into-a-single-spreadsheet-object

...