web-dev-qa-db-fra.com

PHPExcel - créer plusieurs feuilles par itération

J'essaie de créer plusieurs feuilles par itération dans 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++;
}

Malheureusement ça ne marche pas. Je ne reçois que quelques feuilles de cette itération remplies de données et renommées, et environ la moitié sont vides.

Voici donc le résultat (titres de la feuille):

0, 2, 4, 6, 8, 9 et 5 feuilles vides

Je n'arrive pas à comprendre pourquoi seul le numéro (et la feuille 9) est correct dans le résultat.

24
Chris

Vous n'avez pas besoin d'appeler la méthode addSheet(). Après avoir créé la feuille, celle-ci est déjà ajoutée à Excel. Ici j'ai corrigé quelques codes:

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

La première fois que vous instanciez $ objPHPExcel, il possède déjà une seule feuille (feuille 0); vous ajoutez ensuite une nouvelle feuille (qui deviendra la feuille 1), mais définissez la feuille active sur la feuille $ i (lorsque $ i vaut 0) ... afin de renommer et de remplir la feuille de calcul originale créée lors de l'instanciation de $ objPHPExcel. plutôt que celui que vous venez d'ajouter ... c'est votre titre "0".

Vous utilisez également la méthode createSheet (), qui crée une nouvelle feuille de calcul et l'ajoute au classeur ... mais vous l'ajoutez à nouveau vous-même, ce qui revient à ajouter la feuille à deux positions.

Ainsi, la première itération, vous avez déjà la feuille0, ajoutez une nouvelle feuille aux index 1 et 2 et la feuille d'édition/de titre 0. La seconde itération, vous ajoutez une nouvelle feuille aux index 3 et 4, et la feuille d'édition/de titre 1, mais parce que vous avez la même feuille aux index 1 et 2, cela écrit dans la feuille à l'index 2. Troisième itération, vous ajoutez une nouvelle feuille aux index 5 et 6 et vous éditez/feuille de titre 2, en remplaçant votre édition précédente/titre de la feuille. 1 qui a agi contre la feuille 2 à la place ... et ainsi de suite

8
Mark Baker

En complément du commentaire de @Mark Baker.
Faites comme suit: 

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

Cela a fonctionné pour moi. Et espérons que cela fonctionne pour ceux qui en ont besoin! :)

6
AD Henrique

Vous pouvez écrire différentes feuilles comme suit

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