[英]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.