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