2014-02-13 6 views
0

У меня есть следующий скрипт.PHPexcel merge 9 xlsx to one

Я хочу совместить 9 (10000 строк на xlsx) 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'); 

ответ

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 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'); 
Смежные вопросы