私は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++;
}
残念ながら、これは機能しません。この反復のいくつかのシートだけがデータで満たされ、名前が変更され、約半分が空になります。
これが結果です(シートのタイトル):
0、2、4、6、8、9、および5枚の空のシート
なぜ偶数(およびシート9)だけが結果で正しいのかわかりません。
addSheet()
メソッドを呼び出す必要はありません。シートを作成した後、すでにExcelに追加されています。ここでいくつかのコードを修正しました:
//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++;
}
最初に$ objPHPExcelをインスタンス化するとき、すでに1つのシート(シート0)があります。次に、新しいシート(シート1になります)を追加しますが、アクティブシートをシート$ iに設定します($ iが0の場合)...追加したばかりではなく、これがタイトル「0」です。
また、createSheet()メソッドを使用しています。このメソッドは、新しいワークシートを作成し、ワークブックに追加します...
したがって、最初の反復では、すでにsheet0があり、インデックス1と2の両方に新しいシートを追加し、シート0を編集/タイトルします。2番目の反復では、インデックス3と4の両方に新しいシートを追加し、シート1を編集/タイトルにしますインデックス1と2に同じシートがあるため、インデックス2のシートに効果的に書き込まれます。3回目の繰り返しでは、インデックス5と6に新しいシートを追加し、シート2の編集/タイトルを上書きします。代わりにシート2に対して動作した1 ...など
@Mark Bakerのコメントを補完します。
次のようにします。
$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++;
}
これは私のために働いた。そして、それが必要な人に役立つことを願っています! :)
結論に至っていない場合... Henriqueの答えを取り、より良いロジックソリューションを提供しました。これは、誰かがPHPSpreadSheetまたはPHPExcelを使用している場合に、PHPSpreadSheetと完全に互換性があります。
$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;
}
次のように異なるシートを書くことができます
$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');