2014-02-13 28 views
0

我有以下脚本。PHPexcel将9 xlsx合并为一个

我想结合9(10000行/ xlsx)xlsx到一个。

我发现这个脚本并运行一个时间的前三个,然后其他时间,第4位,但不延长到9

现在有加setREadDataOnly但是,这并不工作。 还有另一种合并方式,或者我错过了一些设置吗?

脚本: require_once'PHPExcel.php'; require_once'PHPExcel/Writer/Excel2007.php'; require_once'PHPExcel/Writer/Excel2007.php'; require_once'PHPExcel/IOFactory.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'); 

回答

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次,检查它为什么失败日志,打内存限制或超时是最可能出现的问题

+0

好吧,我会试试这个。日Thnx!我让你知道它的作品! – Bas

+0

该脚本仍在运行并且没有数据被追加。还有其他小费吗? Tnx – Bas

+0

查看日志,看看是否有错误产生!我提到超时或内存问题的可能性,找出是否发生了什么 –

0

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