2012-03-24 22 views
22

Tôi đang cố gắng để tạo ra nhiều sheet bằng cách lặp đi lặp lại trong phpexcel:PHPExcel - tạo ra nhiều tấm bằng lặp

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

Thật không may này không hoạt động. Tôi chỉ nhận được một số tờ lần lặp này chứa đầy dữ liệu và được đổi tên và khoảng một nửa là trống.

Vì vậy, đây là kết quả (tiêu đề tờ):

0, 2, 4, 6, 8, 9, và 5 tấm trống

tôi không thể tìm ra lý do tại sao chỉ chẵn (và trang 9) là chính xác trong kết quả.

Trả lời

65

Bạn không cần gọi phương thức addSheet(). Sau khi tạo trang tính, nó đã được thêm vào excel. Ở đây tôi đã sửa một số mã:

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

Bắt "Lỗi chưa gặp: Gọi phương pháp xác định PHPExcel_Worksheet :: createSheet()" –

7

Khi bạn khởi tạo $ objPHPExcel, nó đã có một trang tính (trang tính 0); sau đó bạn thêm một trang tính mới (sẽ trở thành trang tính 1), nhưng đặt trang tính hoạt động thành trang tính $ i (khi $ i là 0) ... vì vậy bạn đang đổi tên và điền trang tính ban đầu được tạo khi bạn khởi tạo $ objPHPExcel thay vì cái bạn vừa thêm ... đây là tiêu đề của bạn "0". Bạn cũng đang sử dụng phương thức createSheet(), cả hai đều tạo một trang tính mới và thêm nó vào sổ làm việc ... nhưng bạn cũng tự thêm lại nó, điều này đang thêm bảng ở hai vị trí một cách hiệu quả.

Vì vậy, lần lặp đầu tiên, bạn đã có trang tính 0, thêm trang tính mới ở cả chỉ mục 1 và 2 và bảng chỉnh sửa/tiêu đề 0. Lần lặp thứ hai, bạn thêm trang tính mới ở cả chỉ mục 3 và 4 và chỉnh sửa/tiêu đề trang 1, nhưng vì bạn có cùng một trang tính ở chỉ mục 1 và 2, điều này có hiệu quả ghi vào trang tính ở chỉ mục 2. Lần lặp thứ ba, bạn thêm trang tính mới tại chỉ mục 5 và 6 và chỉnh sửa/tiêu đề trang 2, ghi đè chỉnh sửa trước đó của bạn/tiêu đề của tờ 1 có tác dụng chống lại tờ 2 thay vì .... và như vậy trên

6

Bổ sung cho sự hài lòng của @Maker Baker.
Làm như sau:

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

Điều này làm việc cho tôi. Và hy vọng nó hoạt động cho những ai cần! :)

+0

createSheet() trả về tạo để bạn có thể gán nó trực tiếp cho $ sheet mà không cần sử dụng setActiveSheetIndex() –

0

Bạn có thể viết tờ khác nhau như sau

$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'); 
Các vấn đề liên quan