自分用メモ。
環境は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に変換してテキストファイルとして読み込むのが吉みたい。