PHPExcel – создание нескольких листов по итерации

Я пытаюсь создать несколько листов по итерации в phpexcel:

$i=0; while ($i < 10) { // Add new sheet $objWorkSheet = $objPHPExcel->createSheet(); // Attach the newly-cloned sheet to the $objPHPExcel workbook $objPHPExcel->addSheet($objWorkSheet); // Add some data $objPHPExcel->setActiveSheetIndex($i); $sheet = $objPHPExcel->getActiveSheet(); $sheet->setCellValue('A1', 'Hello'.$i) ->setCellValue('B2', 'world!') ->setCellValue('C1', 'Hello') ->setCellValue('D2', 'world!'); // Rename sheet $sheet->setTitle($i); $i++; } 

К сожалению, это не работает. Я получаю только некоторые листы этой итерации, заполненные данными и переименованные, а половина – пустые.

Таким образом, это результат (названия листов):

0, 2, 4, 6, 8, 9 и 5 пустых листов

Я не могу понять, почему в результате верны только четные (и листы 9).

Вам не нужен метод addSheet() . Создав лист, он уже добавляет в excel. Здесь я исправил некоторые коды:

  //First sheet $sheet = $objPHPExcel->getActiveSheet(); //Start adding next sheets $i=0; while ($i < 10) { // Add new sheet $objWorkSheet = $objPHPExcel->createSheet($i); //Setting index when creating //Write cells $objWorkSheet->setCellValue('A1', 'Hello'.$i) ->setCellValue('B2', 'world!') ->setCellValue('C1', 'Hello') ->setCellValue('D2', 'world!'); // Rename sheet $objWorkSheet->setTitle("$i"); $i++; } 

Когда вы впервые создаете экземпляр $ objPHPExcel, он уже имеет один лист (лист 0); вы добавите новый лист (который станет листом 1), но установив активный лист на лист $ i (когда $ i равен 0) … поэтому вы переименовываете и заполняете исходный лист, созданный при создании экземпляра $ objPHPExcel а не тот, который вы только что добавили … это ваше название «0».

Вы также используете метод createSheet (), который создает новый рабочий лист и добавляет его в книгу … но вы также добавляете его снова, что эффективно добавляет лист в две позиции.

Итак, первая итерация, у вас уже есть sheet0, добавьте новый лист в оба индекса 1 и 2 и отредактируйте / запишите лист 0. Вторая итерация, вы добавляете новый лист как в индексы 3 и 4, так и в файл редактирования / заголовка 1, но потому что у вас есть один и тот же лист в индексах 1 и 2, это эффективно записывает на лист с индексом 2. Третья итерация, вы добавляете новый лист в индексы 5 и 6 и редактируете / заголовок 2, перезаписываете свое раннее редактирование / заголовок листа 1, который действовал против листа 2 вместо … и так далее

Дополняет комедию @Mark Baker.
Сделайте так:

 $titles = array('title 1', 'title 2'); $sheet = 0; foreach($array as $value){ if($sheet > 0){ $objPHPExcel->createSheet(); $sheet = $objPHPExcel->setActiveSheetIndex($sheet); $sheet->setTitle("$value"); //Do you want something more here }else{ $objPHPExcel->setActiveSheetIndex(0)->setTitle("$value"); } $sheet++; } 

Это сработало для меня. И надеюсь, что это работает для тех, кто нуждается! 🙂

Вы можете написать разные листы следующим образом

 $objPHPExcel = new PHPExcel(); $objPHPExcel->getProperties()->setCreator("creater"); $objPHPExcel->getProperties()->setLastModifiedBy("Middle field"); $objPHPExcel->getProperties()->setSubject("Subject"); $objWorkSheet = $objPHPExcel->createSheet(); $work_sheet_count=3//number of sheets you want to create $work_sheet=0; while($work_sheet<=$work_sheet_count){ if($work_sheet==0){ $objWorkSheet->setTitle("Worksheet$work_sheet"); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 1')->getStyle('A1')->getFont()->setBold(true); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed } if($work_sheet==1){ $objWorkSheet->setTitle("Worksheet$work_sheet"); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 2')->getStyle('A1')->getFont()->setBold(true); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed } if($work_sheet==2){ $objWorkSheet = $objPHPExcel->createSheet($work_sheet_count); $objWorkSheet->setTitle("Worksheet$work_sheet"); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 3')->getStyle('A1')->getFont()->setBold(true); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed } $work_sheet++; } в $objPHPExcel = new PHPExcel(); $objPHPExcel->getProperties()->setCreator("creater"); $objPHPExcel->getProperties()->setLastModifiedBy("Middle field"); $objPHPExcel->getProperties()->setSubject("Subject"); $objWorkSheet = $objPHPExcel->createSheet(); $work_sheet_count=3//number of sheets you want to create $work_sheet=0; while($work_sheet<=$work_sheet_count){ if($work_sheet==0){ $objWorkSheet->setTitle("Worksheet$work_sheet"); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 1')->getStyle('A1')->getFont()->setBold(true); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed } if($work_sheet==1){ $objWorkSheet->setTitle("Worksheet$work_sheet"); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 2')->getStyle('A1')->getFont()->setBold(true); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed } if($work_sheet==2){ $objWorkSheet = $objPHPExcel->createSheet($work_sheet_count); $objWorkSheet->setTitle("Worksheet$work_sheet"); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValue('A1', 'SR No. In sheet 3')->getStyle('A1')->getFont()->setBold(true); $objPHPExcel->setActiveSheetIndex($work_sheet)->setCellValueByColumnAndRow($col++, $row++, $i++);//setting value by column and row indexes if needed } $work_sheet++; } 

$filename='file-name'.'.xls'; //save our workbook as this file name header('Content-Type: application/vnd.ms-excel'); //mime type header('Content-Disposition: attachment;filename="'.$filename.'"'); //tell browser what's the file name header('Cache-Control: max-age=0'); //no cache

  $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output');