繁体   English   中英

PHPexcel将9 xlsx合并为一个

[英]PHPexcel merge 9 xlsx to one

我有以下脚本。

我想将9个(每个xlsx 10000行)xlsx合并为一个。

我找到了此脚本,并在前三个运行一次,然后在前四个运行一次,但是没有扩展到9。

现在有一个添加setREadDataOnly,但这也不起作用。 还有另一种合并方式或我会错过一些设置吗?

脚本:require_once'PHPExcel.php'; require_once'PHPExcel / Writer / Excel2007.php'; require_once'PHPExcel / IOFactory.php';

    $objReader = PHPExcel_IOFactory::createReaderForFile("big.xlsx");
    $objReader->setReadDataOnly(true);
    $objPHPExcel1 = $objReader->load("big.xlsx");

for( $x=1; $x <= 9;$x++  ){

    $objReader2 = PHPExcel_IOFactory::createReaderForFile("000$x.xlsx");
    $objReader2->setReadDataOnly(true);
    $objPHPExcel2 = $objReader2->load("000$x.xlsx");

    $findEndDataRow2        = $objPHPExcel2->getActiveSheet()->getHighestRow();
    $findEndDataColumn2     = $objPHPExcel2->getActiveSheet()->getHighestColumn();
    $findEndData2 = $findEndDataColumn2 . $findEndDataRow2;

    $data2 = $objPHPExcel2->getActiveSheet()->rangeToArray('A2:' . $findEndData2);

    $appendStartRow = $objPHPExcel1->getActiveSheet()->getHighestRow() + 1;
    $objPHPExcel1->getActiveSheet()->fromArray($data2, null, 'A' . $appendStartRow);

}

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel1, 'Excel2007');
    $objWriter->save('big.xlsx');

不要在循环的每次迭代中打开并保存目标文件(“ big.xlsx”)...在循环之前将其打开一次,仅在循环的最后一次迭代完成后才保存目标文件。将更快并节省内存:

并确保刷新较小的单个文件,否则垃圾回收不会完全从内存中清除它们

require_once 'PHPExcel.php';
require_once 'PHPExcel/Writer/Excel2007.php';
require_once 'PHPExcel/IOFactory.php';

$objReader = PHPExcel_IOFactory::createReaderForFile("big.xlsx");
$objReader->setReadDataOnly(true);
$objPHPExcel1 = $objReader->load("big.xlsx");

$appendStartRow = $objPHPExcel1->getActiveSheet()->getHighestRow() + 1;

for( $x=1; $x <= 9;$x++  ){

    $objReader2 = PHPExcel_IOFactory::createReaderForFile("000$x.xlsx");
    $objReader2->setReadDataOnly(true);
    $objPHPExcel2 = $objReader2->load("000$x.xlsx");

    $findEndDataRow2        = $objPHPExcel2->getActiveSheet()->getHighestRow();
    $findEndDataColumn2     = $objPHPExcel2->getActiveSheet()->getHighestColumn();
    $findEndData2 = $findEndDataColumn2 . $findEndDataRow2;

    $data2 = $objPHPExcel2->getActiveSheet()->rangeToArray('A2:' . $findEndData2);

    $objPHPExcel2->disconnectWorksheets();
    unset($objPHPExcel2);

    $objPHPExcel1->getActiveSheet()->fromArray($data2, null, 'A' . $appendStartRow);
    $appendStartRow += count($data2);

    unset($data2);
}

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel1, 'Excel2007');
$objWriter->save('big.xlsx');

但是,如果它只运行3或4次循环而不是9次循环,请检查为什么日志失败,达到内存限制或超时是最有可能的问题

我的方法是使用循环并分别设置单元格值。 我想我本可以使用@Mark Ba​​ker答案的一部分,但这对我有用。 请注意,所有文件应具有相同数量的字段。

<?php
@author: Winston Hope
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="merged.xls"');
header('Cache-Control: max-age=0');

//error_reporting(E_ALL);
set_time_limit(0);
date_default_timezone_set('America/Belize');

set_include_path('Classes/');
include 'PHPExcel/IOFactory.php';

$inputFileName = 'hub-project-assignment-Example.xlsx';
$inputFileName2 = 'hub-project-assignment-Example-2.xlsx';

$files = array();
$files[] = 'hub-project-assignment-Example.xlsx';
$files[] = 'hub-project-assignment-Example-2.xlsx';
$files[] = 'hub-project-assignment-Example-3.xlsx';
$files[] = 'hub-project-assignment-Example-4.xlsx';
$files[] = 'hub-project-assignment-Example-5.xlsx';

$objPHPExcel = PHPExcel_IOFactory::load($files[0]);
$sheetData = $objPHPExcel->getSheet(0)->toArray(null,true,true,true);
$firstSheetSize = count($sheetData);
$index = $firstSheetSize;
$activeFirstSheet = $objPHPExcel->getSheet(0);
unset($files[0]);
$total = $firstSheetSize;

foreach($files as $file) {

    $objPHPExcel2 = PHPExcel_IOFactory::load($file);
    $sheetData2 = $objPHPExcel2->getSheet(0)->toArray(null,true,true,true);

    $secondSheetSize = count($sheetData2);
    $total += $secondSheetSize-1;
    $pos = 2;

    for(; $index<$total; $index++) {
        $row = $sheetData2[$pos];
        foreach($row as $letter => $value) {
            $cell =  $letter.($index+1);
            $activeFirstSheet->setCellValue($cell, $value);
        }
        $pos++;
    }
}

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output'); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM