Объединить в Excel с phpSpreadSheet - PullRequest
0 голосов
/ 09 мая 2018

Я хочу объединить 2 или более Excel с PhpSpreadsheet . Я пытаюсь сохранить стили для каждого листа, это мой код:

<?php

    require 'vendor/autoload.php';


    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

    $inputFileType = 'Xlsx';
    $inputFileNames = [
        'a.xlsx',
        'b.xlsx',
        'c.xlsx'
    ];
    $sheetnames = [
        'Worksheet',
        'Worksheet1',
        'Worksheet2'
        ];
    $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
    $reader->setLoadSheetsOnly($sheetnames);
    $inputFileName = array_shift($inputFileNames);
    $spreadsheetMain = $reader->load($inputFileName);
    $spreadsheetMain->getActiveSheet()->setTitle('page0');
    $contador = 1;
    foreach ($inputFileNames as $book => $inputFileName) {
        echo ('$inputFileName: ' . $inputFileName) . '</br>';
        $spreadsheet = $reader->load($inputFileName);
        $clonedWorksheet = clone $spreadsheet->getActiveSheet()->setTitle($inputFileName[0]);
        $clonedWorksheet->setTitle('page' . $contador);
        $spreadsheetMain->addSheet($clonedWorksheet);
        $contador++;
    }
    $writer = new Xlsx($spreadsheetMain);
    $writer->save('prueba1.xlsx');

чтобы делать то, что я хочу, мне нужно это изменить $spreadsheetMain->addSheet($clonedWorksheet);

для этого $spreadsheetMain->addExternalSheet($clonedWorksheet);

Но когда я выполняю этот код, я получаю сообщение об ошибке: «Лист не существует»

Я думал, что это еще не реализовано, но здесь на странице документации: https://phpspreadsheet.readthedocs.io/en/develop/topics/worksheets/#copying-worksheets

Здесь вы можете скачать мои экземпляры и код, чтобы попробовать, если хотите: https://drive.google.com/open?id=1qkI8jdYDuA6e5CW6z3k0r_7j1pTvW_6D

Ответы [ 2 ]

0 голосов
/ 08 января 2019
require 'vendor/autoload.php';

$lists = [
    'flie_01.xlsx',
    'flie_02.xlsx'
];

$outfile='/tmp/merge.xlsx';

$merge_spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();        
$merge_spreadsheet->getProperties()->setCreator("act");


foreach($lists as $file){

<pre><code>if(!file_exists($file)){
    continue;
}            

$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx");
$reader-&gt;setReadDataOnly(true);
$spreadsheet = $reader-&gt;load($file);

foreach($spreadsheet-&gt;getSheetNames() as $sheet_name ){
    $clonedWorksheet = clone $spreadsheet-&gt;getSheetByName($sheet_name);
    $clonedWorksheet-&gt;setTitle($sheet_name);
    $merge_spreadsheet-&gt;addSheet($clonedWorksheet);                
}
} $ Merge_spreadsheet-> removeSheetByIndex (0); $ writer = \ PhpOffice \ PhpSpreadsheet \ IOFactory :: createWriter ($ spreadsheet, 'Xlsx'); $ Писатель-> сохранить ($ выходной_файл);
0 голосов
/ 10 мая 2018

Проблема с addExternalSheet заключалась в том, что мне нужно было назвать оба листа (оригинал, который я загружаю, и клонированный лист) одним и тем же именем. (Все файлы здесь: https://drive.google.com/open?id=1qkI8jdYDuA6e5CW6z3k0r_7j1pTvW_6D, mergeSolved - правильный файл) Это код с решением:

require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$inputFileType = 'Xlsx';
$inputFileNames = [
    'a.xlsx',
    'b.xlsx',
    'c.xlsx'
];
$sheetnames = [
    'Worksheet',
    'Worksheet1',
    'Worksheet2'
];
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
$reader->setLoadSheetsOnly($sheetnames);
$inputFileName = array_shift($inputFileNames);
$spreadsheetMain = $reader->load($inputFileName);
$spreadsheetMain->getActiveSheet()->setTitle('page0');
$contador = 1;
foreach ($inputFileNames as $book => $inputFileName) {
    echo ('$inputFileName: ' . $inputFileName) . '</br>';
    $spreadsheet = $reader->load($inputFileName);
    $clonedWorksheet = clone $spreadsheet->getSheetByName('Worksheet'.$contador);
    $clonedWorksheet->setTitle('Worksheet'.$contador);
    $spreadsheetMain->addExternalSheet($clonedWorksheet);
    $contador++;
}
$writer = new Xlsx($spreadsheetMain);
$writer->save('prueba1.xlsx');`
...