[英]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 Baker答案的一部分,但这对我有用。 请注意,所有文件应具有相同数量的字段。
<?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.