2012-03-24 169 views
22

Estoy intentando crear varias hojas de iteración en PHPExcel:PHPExcel - la creación de varias hojas por iteración

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

Desafortunadamente esto no funciona. Solo obtengo algunas hojas de esta iteración llenas de datos y renombradas, y la mitad están vacías.

Así que este es el resultado (títulos hoja):

0, 2, 4, 6, 8, 9 y 5 hojas vacías

I no puede averiguar qué sólo numerada incluso (y hoja 9) son correctos en el resultado.

Respuesta

65

No necesita llamar al método addSheet(). Después de crear la hoja, ya se agrega a excel. Aquí i fijo algunos códigos:

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

Conseguir "error no detectada: La llamada al método definido PHPExcel_Worksheet :: createSheet()" –

7

La primera vez que una instancia del $ objPHPExcel, que ya tiene una sola hoja (hoja 0); a continuación, agrega una hoja nueva (que se convertirá en la hoja 1), pero establece la hoja activa en hoja $ i (cuando $ i es 0) ... por lo que está cambiando el nombre y llenando la hoja de trabajo original creada al crear $ objPHPExcel en lugar del que acabas de agregar ... este es tu título "0".

También está utilizando el método createSheet(), que crea una nueva hoja de cálculo y la agrega al libro ... pero también la está agregando nuevamente, lo que efectivamente agrega la hoja en dos posiciones.

Así que la primera iteración, ya tiene sheet0, agrega una nueva hoja en ambos índices 1 y 2, y edita/hoja de título 0. Segunda iteración, agrega una nueva hoja en ambos índices 3 y 4, y edita/título hoja 1, pero debido a que tiene la misma hoja en los índices 1 y 2, esto efectivamente escribe en la hoja en el índice 2. Tercera iteración, agrega una nueva hoja en los índices 5 y 6, y edita/hoja de título 2, sobrescribiendo su edición anterior/título de la hoja 1 que actuó contra la hoja 2 en su lugar .... y así sucesivamente

6

Complementando el comentario de @Mark Baker.
Do de la siguiente manera:

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

Esto funcionó para mí. ¡Y espero que funcione para aquellos que lo necesitan! :)

+0

createSheet() devuelve el creado hoja para que pueda asignarlo directamente a $ hoja sin usar setActiveSheetIndex() –

0

Puede escribir diferentes hojas de la siguiente manera

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