簡體   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