プロが教える店舗&オフィスのセキュリティ対策術

初めてPHPExcelを利用してExcel出力を行ってみましたが

$writer->save('php://output');

で保存せずブラウザ経由で直接出力させようとすると
出力されたExcelな中身がおかしくなります。
文字化けされた内容で出力処理を記載したスクリプトファイルの中身が
表示されたような感じです。
事前にheaderでファイル名も指定していますが指定したファイル名ではなく、
スクリプトを実行しているPHPファイルの名前のxlsになります。

原因等わかる方いたら教えて下さい。


ちなみに以下の出力では正常にファイルが出力されました。
$writer->save('test.xls');

【環境】
PHPExcel 1.7.6
PHP 5.3.8

A 回答 (3件)

PHPExcelではありませんが、サーバにExcelが


インストールされているならOLEを使う方法が
あります。

//Excelをインスタンス化する
$app = new COM("Excel.Application");
//警告を出さない
$app->DisplayAlerts = false;
//Workbooksコレクションを取得する
$wbs = $app->Workbooks;
//Workbookオブジェクトを追加する
$wkb = $wbs->Add();
//WorkSheetsコレクションを取得する
$wss = $wkb->WorkSheets;
//1番目のWorkSheetオブジェクトを取得する
$wks = $wss->_Default(1);
//シート名を日本語にする
$n = mb_convert_encoding("名前","SJIS","UTF-8");
$wks->Name = $n;
//セル(Range)オブジェクトを取得する
$rng = $wks->Cells(1,1);
//セルに日本語を記入する
$n = mb_convert_encoding("内容","SJIS","UTF-8");
$rng->Value = $n;
//Workbookを名前を付けて保存する
$wkb->SaveAs("D:\\~");
//Excelを終了する
$app.Quit();

その他の操作はVBAによるマクロと同じです。
滅多に使わないプロパティの一部に日本語を使うと
オカシクなるものがありますが、よく使うものは
日本語対応はできています。
Excelのバージョンが上がっても、マクロの変更が
なければ修正無しで使えます。
    • good
    • 0

>おそらくシート名の文字コードがおかしいのかと思い、シート名をSJISにしてみましたが


解決できておりません。

まずシート名を半角英数にしてみてエラーがでるかどうか確認
エラーがでないなら、シート名のSJISがうまくいっていない
エラーが出るならべつの理由

この回答への補足

ご回答有難うございます。

>まずシート名を半角英数にしてみてエラーがでるかどうか確認
>エラーがでないなら、シート名のSJISがうまくいっていない
>エラーが出るならべつの理由

シート名を半角にしたところ、
出力されたExcelは文字化けされた内容(エラーメッセージ)が表示されてしまいました。

補足日時:2012/06/16 12:54
    • good
    • 0

PHPソースの文字コードがSJIS以外では?


私はDUALモデルをインスタンス化、つまり
OLEオートメーションでやっていますが、
PHPはEUC-JPなので、漢字はSJISにして
プロパティやメソッドに渡しています。

この回答への補足

ご回答有難うございます。
おっしゃる通りPHPソースはUTF-8になります。
とりあえずファイル名をSJISにして再度出力してみたところExcelの
ファイル名は指定通り出力されましたが今度は出力されたExcelに以下のような
内容が表示されていましました。
おそらくシート名の文字コードがおかしいのかと思い、シート名をSJISにしてみましたが
解決できておりません。

<br />
<b>Fatal error</b>: Uncaught exception 'Exception' with message 'Invalid character found in sheet title' in D:\php5\PHPExcel\Classes\PHPExcel\Worksheet.php:401
Stack trace:
#0 D:\php5\PHPExcel\Classes\PHPExcel\Worksheet.php(657): PHPExcel_Worksheet::_checkSheetTitle('?V?[?g')
#1 D:\Apache\Apache2.2\htdocs\test.php(119): PHPExcel_Worksheet-&gt;setTitle('?V?[?g')
#2 {main}thrown in <b>D:\php5\PHPExcel\Classes\PHPExcel\Worksheet.php</b> on line <b>401</b><br />

補足日時:2012/06/15 09:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!