2012-03-24 15 views
22

Próbuję utworzyć wiele arkuszy przez iteracji w phpexcel:PHPExcel - tworzenie wielu arkuszy przez iteracja

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

Niestety to nie działa. Dostaję tylko kilka arkuszy tej iteracji wypełnionej danymi i zmieniam jej nazwę, a połowa jest pusta.

Więc to jest wynik (tytuły arkuszy):

0, 2, 4, 6, 8, 9 i 5 pustych arkuszy

nie mogę zrozumieć, dlaczego tylko parzyste (i arkusz 9) są poprawne w wyniku.

Odpowiedz

65

Nie musisz wywoływać metody addSheet(). Po utworzeniu arkusza, już go dodaje do programu Excel. Tutaj naprawiłem kilka kodów:

//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

Pierwsze "Uncaught Error: Call to metoda niezdefiniowany PHPExcel_Worksheet :: createSheet()" –

7

Kiedy po raz pierwszy tworzysz obiekt $ objPHPExcel, ma on już pojedynczy arkusz (arkusz 0); następnie dodajesz nowy arkusz (który stanie się arkuszem 1), ale ustawisz aktywny arkusz na arkusz $ i (gdy $ i ma wartość 0) ... więc zmieniasz nazwę i wypełniasz oryginalny arkusz roboczy utworzony podczas tworzenia instancji $ objPHPExcel zamiast tego, który właśnie dodałeś ... to jest twój tytuł "0".

Używasz również metody createSheet(), która zarówno tworzy nowy arkusz roboczy, jak i dodaje go do skoroszytu ... ale także dodajesz go ponownie, co skutecznie dodaje arkusz w dwóch pozycjach.

Pierwsza iteracja, masz już arkusz0, dodaj nowy arkusz zarówno w indeksach 1 i 2, jak i w arkuszu edycji/tytułów 0. Po drugiej iteracji dodajesz nowy arkusz zarówno do indeksów 3 i 4, jak i do edycji/tytułu arkusz 1, ale ponieważ w indeksach 1 i 2 jest ten sam arkusz, to faktycznie zapisuje się do arkusza w indeksie 2. Trzecia iteracja, dodajesz nowy arkusz w indeksach 5 i 6 oraz arkusz edycji/tytułu 2, zastępując wcześniejszą edycję/tytułowanie arkusza 1, który działał w przeciwieństwie do arkusza 2 zamiast ... i tak dalej:

6

Uzupełnienie komentarza @Mark Baker.
Do następująco:

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

Ten pracował dla mnie. I miej nadzieję, że to działa dla tych, którzy potrzebują! :)

+0

createSheet() zwraca utworzony arkusz, aby można było go przypisać bezpośrednio do arkusza $ bez użycia funkcji setActiveSheetIndex() –

0

Można pisać różne arkusze następująco

$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'); 
Powiązane problemy