PHPExcel – Erstellen mehrerer Blätter durch Iteration

Lesezeit: 5 Minuten

Ich versuche, mehrere Blätter durch Iteration in phpexcel zu erstellen:

$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++;
}

Leider funktioniert das nicht. Ich bekomme nur einige Blätter dieser Iteration mit Daten gefüllt und umbenannt und etwa die Hälfte ist leer.

Das ist also das Ergebnis (Blatttitel):

0, 2, 4, 6, 8, 9 und 5 leere Blätter

Ich kann nicht herausfinden, warum nur gerade Zahlen (und Blatt 9) im Ergebnis korrekt sind.

Benutzer-Avatar
Safarow

Sie brauchen keinen Anruf addSheet() Methode. Nach dem Erstellen des Blattes wird es bereits zu Excel hinzugefügt. Hier habe ich einige Codes behoben:

    //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++;
    }

  • “Uncaught Error: Call to undefined method PHPExcel_Worksheet::createSheet()” erhalten

    – Rajesh Vishwakarma

    20. Juli 2017 um 9:50 Uhr

Ergänzend zum Kommentar von @Mark Baker.
Gehen Sie wie folgt vor:

$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++;
}  

Das hat bei mir funktioniert. Und hoffen, dass es für diejenigen funktioniert, die es brauchen! 🙂

  • createSheet() gibt das erstellte Blatt zurück, sodass Sie es direkt $sheet zuweisen können, ohne setActiveSheetIndex() zu verwenden

    – Björn Weinbrenner

    18. Oktober 2017 um 9:37 Uhr

Wenn Sie $objPHPExcel zum ersten Mal instanziieren, hat es bereits ein einzelnes Blatt (Blatt 0); Sie fügen dann ein neues Blatt hinzu (das zu Blatt 1 wird), setzen aber das aktive Blatt auf Blatt $i (wenn $i 0 ist) … also benennen Sie das ursprüngliche Arbeitsblatt um und füllen es aus, das erstellt wurde, als Sie $objPHPExcel instanziierten und nicht der, den Sie gerade hinzugefügt haben … das ist Ihr Titel “0”.

Sie verwenden auch die createSheet () -Methode, die sowohl ein neues Arbeitsblatt erstellt als auch der Arbeitsmappe hinzufügt … aber Sie fügen es auch selbst wieder hinzu, wodurch das Blatt effektiv an zwei Positionen hinzugefügt wird.

In der ersten Iteration haben Sie also bereits sheet0, fügen ein neues Blatt an beiden Indexen 1 und 2 hinzu und bearbeiten/betiteln Blatt 0. In der zweiten Iteration fügen Sie ein neues Blatt an beiden Indexen 3 und 4 hinzu und bearbeiten/betiteln Blatt 1, aber Da Sie dasselbe Blatt an den Indizes 1 und 2 haben, schreibt dies effektiv auf das Blatt an Index 2. In der dritten Iteration fügen Sie ein neues Blatt an den Indizes 5 und 6 hinzu und bearbeiten/betiteln Blatt 2, wodurch Ihre frühere Bearbeitung/Betitelung des Blatts überschrieben wird 1, die stattdessen gegen Blatt 2 vorgegangen ist … und so weiter

Falls Sie zu keinem Ergebnis gekommen sind … Ich habe Henriques Antwort genommen und eine bessere logische Lösung gegeben. Dies ist vollständig kompatibel mit PHPSpreadSheet, falls jemand PHPSpreadSheet oder PHPExcel verwendet.

$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;
}

Benutzer-Avatar
ABDUL JAMAL

Sie können verschiedene Blätter wie folgt schreiben

$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');

1195140cookie-checkPHPExcel – Erstellen mehrerer Blätter durch Iteration

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy