質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

7192閲覧

PHPExcelで複数シートにデータを入力したい

natlpush

総合スコア32

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/04/19 01:28

編集2018/04/20 06:38

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つなら問題ないですが、数が増えるとループさせる必要ががあります。おそらくすごく基本的なことがわかってないと思います。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/04/19 01:29

「うまく動作しない」「うまくいかない」では何が起きているか伝わりません。「○○のようになるはずなのに××となってしまう」のような形で「ゴール」と「現象」を明確にしてください。https://teratail.com/help/question-tips#questionTips3-4-1
m.ts10806

2018/04/19 01:30

そういえばPHPExcelは非推奨となり、phpspreadsheetへの移行がすすめられています。その面から再度アプローチされてみては?
m.ts10806

2018/04/19 01:31

download_file()メソッドもご提示ください。PHPExcelでファイルが正常に作られているのであれば、PHPExcelだけが問題のようには思えません。
natlpush

2018/04/19 01:32

ファイルを作成後自動でダウンロードできますが、ファイルが不正ということで開けません。ということです。要するに真っ白の状態です。
m.ts10806

2018/04/19 01:35

実際に作成したファイルを直にも開こうとしても同じですか?
yoorwm

2018/04/19 01:45

エディタなどで開くとphpのエラーが紛れ込んでるとかないでしょうか?
natlpush

2018/04/19 12:26

実際に作成したファイルでも同じです。質問を修正いたしましたが、PHP自体の問題かもしれません。
guest

回答3

0

自己解決

SQLのデータに問題があったようです。
「礼状」に空白のものがあり、それが原因でした。

$sheet->setTitle には空白だとエラーになってしまうので、以下のようにしたところ問題なくできました。

if($data['礼状']=="") $letter_name="その他"; else $letter_name=$data['礼状']; $sheet->setTitle($letter_name);//空白だとエラーになる

単純な内容でしたが、なかなか気づけずお手数をおかけしました。

投稿2018/04/20 07:45

natlpush

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

進展してなさそうなので、動かしてないけど考えてみたことを寄せてみます。

PHPExcelに含まれる、
public function addExternalSheet(PHPExcel_Worksheet $pSheet, $iSheetIndex = null)
って使えませんかね。

ただし、ソースを読むとわかりますが、
同じシート名のを追加しようとすると
throw new PHPExcel_Exception("Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename the external sheet first.");
なので、手間ではあるのですが都度テンプレ側ワークブックのシート名を書き換えてから
保存する方のワークブックにaddExternalSheet()するのって、どうでしょう?

投稿2018/04/20 06:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natlpush

2018/04/20 07:50

addExternalSheet()というのを調べていて、たまたま解決に至りました。解決のきっかけとなりました、ありがとうございました。
guest

0

気になる点が1つ。

$stmt の中身は、間違いなく「礼状の種類」順に並んでいるのでしょうか?

例えば

php

1$stmt = [ 2 0 => ['礼状' => 'タイプA', /*以下データ略*/], 3 1 => ['礼状' => 'タイプB', /*以下データ略*/], 4 2 => ['礼状' => 'タイプA', /*以下データ略*/], 5];

のようになっていた場合、
3つ目は、1つ目とシート名が重複して作られることになります。

シート名重複は、Excel的にはアウトですが、
PHPExcel の setTitle で名前重複はエラーになりましたっけ・・??

もしデータを「礼状の種類」順に並べられないのであれば、
新しいシートを作成する前に、同じ名前のシートが存在していないか確認し、
既に存在しているならば、既存シートに対して【追記】をしていくよう、
処理を変更する必要があるのではないかと思います。

投稿2018/04/19 07:18

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natlpush

2018/04/19 07:42

ありがとうございます。データは順番通りに並んでいます。要するにシートを追加して書き込んでいきたいです。今わかりやすく要点をまとめていますので、しばらくお時間くださいませ。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問