SQLよりデータを取得し、PHPExcelで礼状送付用の住所録を作成しています。
シートが1枚の時は問題ないのですが、礼状の種類によってシートを分けようとするとうまくいきません。
ファイルを作成後自動でダウンロードできますが、ファイルが不正ということで開けません。
どこが問題でしょうか。
エクセルを開こうとした時のエラーメッセージは以下です。
Excelでファイル'sample.xlsx'を開くことができません。ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。
保存するためのソースは以下の通りです。
header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment;filename="sample.xlsx"'); header('Cache-Control: max-age=0'); $writer = PHPExcel_IOFactory::createWriter($excel, "Excel2007"); $writer->save("../address.xlsx"); $result=download_file('../address.xlsx');
問題のソース部分はこちらです。
$category="礼状スタート";//礼状カテゴリの判定用 $excel = new PHPExcel(); $n=0;//最初のシート番号 foreach($stmt as $data){ if($data['礼状']!=$category){//見出し部分 if($n>0) $excel->createSheet();//2枚目のシートから必要 $excel->setActiveSheetIndex($n); $sheet = $excel->getActiveSheet(); $sheet->setTitle($data['礼状']); $sheet->setCellValueByColumnAndRow(0,1,'事業所名'); $sheet->setCellValueByColumnAndRow(1,1,'姓'); $sheet->setCellValueByColumnAndRow(2,1,'名'); $sheet->setCellValueByColumnAndRow(3,1,'住所1'); $sheet->setCellValueByColumnAndRow(4,1,'住所2'); $n++; //初期座標 $x=0; $y=2; $category=$data['礼状']; } $address1 = str_replace("東京都","",$data['住所1']); $sheet->setCellValueByColumnAndRow($x,$y,$data['事業所名']); $sheet->setCellValueByColumnAndRow($x+1,$y,$data['姓']); $sheet->setCellValueByColumnAndRow($x+2,$y,$data['名']); $sheet->setCellValueByColumnAndRow($x+3,$y,$address1); $sheet->setCellValueByColumnAndRow($x+4,$y,$data['住所2']); $y++; } //---------------------------------------------- // Excel2007形式で出力する //---------------------------------------------- header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment;filename="sample.xlsx"'); header('Cache-Control: max-age=0'); $writer = PHPExcel_IOFactory::createWriter($excel, "Excel2007"); $writer->save("../address.xlsx"); $result=download_file('../address.xlsx');
シンプルにまとめますと、かなり初心者的な内容となりますが、
$excel = new PHPExcel(); $excel->setActiveSheetIndex(0); $sheet = $excel->getActiveSheet(); $sheet->setTitle("礼状1"); $sheet->setCellValueByColumnAndRow(0,1,'名前'); $excel->createSheet();//2枚目のシートから必要 $excel->setActiveSheetIndex(1); $sheet2 = $excel->getActiveSheet(); $sheet2->setTitle("礼状2"); $sheet2->setCellValueByColumnAndRow(0,1,'名前');
これをforeachでやりたいです。
$sheet[$n]などとしてもエラーになるので、要するには$sheet,$sheet2の増やし方だと思います。2つなら問題ないですが、数が増えるとループさせる必要ががあります。おそらくすごく基本的なことがわかってないと思います。よろしくお願いいたします。

回答3件
あなたの回答
tips
プレビュー