2017-01-26 4 views
0

Я хотел бы объединить несколько файлов excel (file1.xls; file2.xls). Оба из них имеют одинаковое количество столбцов и заголовок столбца такого же типа.PHPExcel: объединить несколько файлов (или рабочих листов) со стилем в один рабочий лист

Я нашел решение для объединения данных (enter link description here). Но я хочу скопировать стили (у меня есть другой фон для разных файлов).

 $tempXlsFiles = [ 
      storage_path('exports') . "/file1.xls", 
      storage_path('exports') . "/file2.xls" 
     ]; 

     $objPHPExcel1 = PHPExcel_IOFactory::load($tempXlsFiles[0]); 

     for($i=1;$i < sizeof($tempXlsFiles); $i++){ 
      $objPHPExcelToCopy = PHPExcel_IOFactory::load($tempXlsFiles[$i]); 

      // Find the last cell in the second spreadsheet 
      $findEndDataRow = $objPHPExcelToCopy->getActiveSheet()->getHighestRow(); 
      $findEndDataColumn = $objPHPExcelToCopy->getActiveSheet()->getHighestColumn(); 
      $findEndData = $findEndDataColumn . $findEndDataRow; 

      $beeData = $objPHPExcelToCopy->getActiveSheet()->rangeToArray('A2:' . $findEndData); 

      // Identify the row in the first spreadsheet where we want to start 
      // adding merged bee data without overwriting any bird data 
      $appendStartRow = $objPHPExcel1->getActiveSheet()->getHighestRow() + 1; 
      // Add bee data from the PHP array into the bird data 
      $objPHPExcel1->getActiveSheet()->fromArray($beeData, null, 'A' . $appendStartRow); 


      // How can i to add the style ? 

     } 
     // Save the spreadsheet with the merged data 
     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel1, 'Excel2007'); 
     $objWriter->save(storage_path('exports').'/'.$outputFile); 

PS: Я использую LaravelExcel и PhpExcel.

РЕДАКТИРОВАТЬ:

  • file1.xls имеет 10 строк. Эти строки имеют фон RED
  • file2.xls имеет 5 строк. Имеет фоном BLUE

Я хочу: file_merge.xls: имеет 15 строк. 0 to 10: background RED С данными файла 1. От 10 до 15: данные файла 2 с синим фоном. (Например, я не знаю, какой фон имеет файл.)

ответ

0

Вы можете добавить этот стиль внутрь для цикла и добавить ячейку (A1, A2 ..., B1, B2 ...) согласно требованию.

// Пример стиля: стиль границы: BORDER_THIN $ objPHPExcel-> getActiveSheet() -> GetStyle (.. 'А' $ я '') -> getBorders() -> getAllBorders() -> setBorderStyle (PHPExcel_Style_Border :: BORDER_THIN);

Надеюсь, это поможет!

+0

Спасибо, но я хочу установить стиль с теми же стилями file1.xls и file2.xls. Я сделал Редактировать свой пост, чтобы объяснить –

0

Ваш код просто читает массив значений данных листа из одной книги и устанавливает эти значения в другом; он никогда не будет копировать стили.

PHPExcel имеет специальный метод (addExternalSheet()) именно для этой цели и даже обеспечивает an example of using it (43mergeWorkbooks.php in /Examples).

$objPHPExcel1 = PHPExcel_IOFactory::load("templates/43mergeBook1.xlsx"); 

$objPHPExcel2 = PHPExcel_IOFactory::load("templates/43mergeBook2.xlsx"); 

foreach($objPHPExcel2->getSheetNames() as $sheetName) { 
    $sheet = $objPHPExcel2->getSheetByName($sheetName); 
    $sheet->setTitle($sheet->getTitle() . ' copied'); 
    $objPHPExcel1->addExternalSheet($sheet); 
} 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel1, 'Excel2007'); 
$objWriter->save("merged_with_styles.xlsx"); 
+0

Извините, но я хочу включить все файлы на один лист. Я не хочу 1 файл = 1 лист. –

+0

Тогда вам нужно будет написать логику кода, чтобы скопировать информацию о стиле самостоятельно; PHPExcel не имеет никакой магии, чтобы обеспечить это конкретное требование. –

+0

И поскольку идентификаторы стилей могут отличаться между файлами, все же возможно лучше всего использовать подход, который я указал, чтобы все данные и стили синхронизировались в одной книге (через несколько рабочих листов), а затем объединить данные и стиль в один рабочий лист в качестве второго шага, используя duplicateStyle(), чтобы скопировать стили теперь, когда они были синхронизированы, и все они существуют в одной книге –

Смежные вопросы