Подтвердить что ты не робот

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).

4b9b3361

Ответ 1

Вам не нужен метод вызова 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++;
    }

Ответ 2

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

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

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

Ответ 3

Дополнение к комманду @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++;
}  

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

Ответ 4

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

$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 the file name
header('Cache-Control: max-age=0'); //no cach

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

Ответ 5

Если вы еще не пришли к выводу... Я взял ответ энрике и дал лучшее логическое решение. Это полностью совместимо с PHPSpreadSheet в случае, если кто-то использует PHPSpreadSheet или PHPExcel.

$spreadOrPhpExcel = new SpreadSheet(); // or new PHPExcel();
print_in_sheet($spreadOrPhpExcel);

function print_in_sheet($spread)
{
    $sheet = 0;

    foreach( getData() as $report => $value ){
        # If number of sheet is 0 then no new worksheets are created
        if( $sheet > 0 ){
            $spread->createSheet();
        }

        # Index for the worksheet is setted and a title is assigned
        $wSheet = $spread->setActiveSheetIndex($sheet)->setTitle($report);

        # Printing data
        $wSheet->setCellValue("A1", "Hello World!");

        # Index number is incremented for the next worksheet
        $sheet++;
    }

    return $spread;
}