« あけましておめでとうございます。 | メイン | ボーダー/ボーダレス »

PHPでExcelファイルの入出力

自分用メモ。
環境はOSX10.4+php5+PEARです。

■Excelファイルを出力する場合

Spreadsheet_Excel_Writer(PEAR版)を使用。PEAR版はOLEというパッケージ依存。PHP_Class版もあるらしいけど、ファイルの容量に7MBの制限あるらしい。

・インストール

php5をインストールしていると、新しく別のPEARが勝手にインストールされてしまう。なのでphp.ini内のinclude_pathを変えるか、新しい方のPEARを使用する。(ここではまりました。)

※デフォルトのPEARのパス
/usr/bin/pear
※php5のPEARのパス
/usr/local/php5/bin/pear

先にOLEをインストール。

# sudo pear install OLE

次に、Spreadsheet_Excel_Writerをインストール。

# sudo pear install Spreadsheet_Excel_Writer
# pear list

としてインストールされているのを確認。

Archive_Tar              1.1     stable
Console_Getopt           1.2     stable
DB                       1.6.2   stable

      〜 中略 〜

OLE 0.5 beta
Spreadsheet_Excel_Writer 0.9.0 beta

どちらもBeta版なので注意。

・サンプル
ここに載っていたのを参考に。
『ふたつのしっぽ』

ただし、文字コードを変換する際にmb_convert_encodingを使用するとき3つ目の引数に"auto"を指定する必要があった。

<?php
//PEARクラスのインクルード
include_once 'Spreadsheet/Excel/Writer.php';
//ワークブックの生成
$workbook = new Spreadsheet_Excel_Writer();
//ワークシートの生成
$worksheet =& $workbook->addWorksheet(mb_convert_encoding("シート01","SJIS","auto"));
//列幅の設定
$worksheet->setColumn(0,0,5);    //1列目幅5
$worksheet->setColumn(1,1,10);   //2列目幅10
$worksheet->setColumn(2,5,2);    //3-6列目幅2
//書式の設定
$format1 =& $workbook->addFormat();
$format1->setColor("red");
$format1->setBold(1);
$format1->setItalic(1);
$format1->setBorder(1);
$format1->setBorderColor("blue");
//値を定義
$worksheet->write(0,0,"001");
$worksheet->writeString(0,1,mb_convert_encoding("ほげほげ","SJIS","auto"),$format1);
$worksheet->writeNumber(1,0,"001",$format1);
//式を定義
$worksheet->writeFormula(2,0,"=SUM(A1:A2)");
//HTTPヘッダー出力
$workbook->send("sample.xls");
//excel出力
$workbook->close();
exit;
?>

ファイルを出力する際はSpreadsheet_Excel_Writerをnewするときに引数にファイル名を渡すとExcelファイルが生成される。

$workbook = new Spreadsheet_Excel_Writer("sample2.xls");

その場合、sendメソッドは不要。echo文を含めるとファイルが壊れるので注意。print文はokだった。


■Excelファイルから入力する場合

Spreadsheet_Excel_Reader(SourceForge)を使用。ファイルをダウンロードしてきてphp.iniに記載されているinclude_path内にコピー。

が、Mac版のExcelファイルだとブラウザがハングアップしてしまった。
headerのフォーマットがwindows版と違うためで、"Root Entry"となっている所がMac版だと"R"になってためらしい。

Spreadsheet_Excel_Readerを解凍して/Excel/oleread.incの、204行目付近の

if ($name == "Root Entry") {

if ($name == "Root Entry" || $name == "R"){

とする。(参考

サンプルソースはこんな感じ。

<?php
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
   // エンコーディングの設定(shift-jis)
   // mb_convert_encodingを使用iconvも使用可
$data->setUTFEncoder('mb');
$data->setOutputEncoding('sjis');
$data->read('sample.xls');
error_reporting(E_ALL ^ E_NOTICE);
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
	for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
		echo "¥"".$data->sheets[0]['cells'][$i][$j]."¥"¥t";
	}
	echo "<br />¥n";
}
?>


これでも、大量の日本語テキストがあると、あんまし上手くいかなくて、excelのシートの右下のセルにダミーで数字を入れたらなぜか動いた。
セルのフォーマット指定の読み込みとかも挙動がおかしい。

やはり、素直にCSVに変換してテキストファイルとして読み込むのが吉みたい。

トラックバック

このエントリーのトラックバックURL:
http://www.minfish.jp/blog/mt-tb.cgi/84