PHPExcel-通过迭代创建多个工作表


PHPExcel - creating multiple sheets by iteration

我试图在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++;
    }

补充@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时,它已经有一个工作表(工作表0);然后添加一个新工作表(将成为工作表1),但将活动工作表设置为工作表$i(当$i为0时)。。。因此,您正在重命名和填充实例化$objPHPExcel时创建的原始工作表,而不是刚刚添加的工作表。。。这是您的标题"0"。

您还使用了createSheet()方法,该方法创建一个新的工作表并将其添加到工作簿中。。。但你自己也在添加,这实际上是在两个位置添加纸张。

因此,在第一次迭代中,您已经有了工作表0,在索引1和2处添加了一个新的工作表,并编辑/标题工作表0。第二次迭代,在索引3和4处添加一个新工作表,并编辑/标题工作表1,但由于在索引1和2处有相同的工作表,这实际上会写入索引2处的工作表。第三次迭代,在索引5和6处添加一个新的工作表,并编辑/标题工作表2,覆盖您之前对工作表1的编辑/标题,而工作表1对工作表2起作用。。。。依此类推

如果你还没有得出结论。。。我接受了Henrique的回答,给出了一个更好的逻辑解决方案。这与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;
}

您可以按照以下编写不同的表单

$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 cach
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');