【问题标题】:PHPexcel merge 9 xlsx to onePHPexcel将9个xlsx合并为一个
【发布时间】:2014-02-13 07:20:02
【问题描述】:

我有以下脚本。

我想将 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');

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    不要在循环的每次迭代中打开并保存您的目标文件(“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 次,请检查它在日志中失败的原因,最有可能出现的问题是达到内存限制或超时

    【讨论】:

    • 好的,我会试试这个。谢谢!我让你知道它是否有效!
    • 脚本仍在运行,没有附加数据。还有其他提示吗? Tnx
    • 查看日志,看看是否有任何错误产生!我提到了超时或内存问题作为可能性,看看是否发生了这种情况
    • 循环不工作,手动工作。所以我通过cron解决它。 Tnx!
    【解决方案2】:

    我的方法是使用循环并单独设置单元格值。我想我本可以使用@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'); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多