好きな元素はイッテルビウム(元素記号:Yb)
・・・という設定になっているらしい1年目の新人、萩原です。よろしくお願いします。
大学院では化学を専攻しておりました。
今回アドベントカレンダーということで順番が回ってきましたのでExcelについて触れていこうと思います。
普段、CakePHPを使って仕事をしているのですが、その中でPHPでエクセルを出力すると言う場面によく出くわします。
弊社ではExcelの出力には、基本的にReviserを使用しているのですが、たまたまPHPexcelを使う機会もありましたので、今回、これら二つのPHP用のExcel出力機能について比較を行っていきたいと思います。
両者ともに、基本的にPHP5.2以上対応となっています。
PHP5.1でも使用することは可能ですが、PHPExcelの場合はExcel2007形式(.xlsx)の出力ができません。(体験済)
Reviserに至っては現在最新の0.33は動きません。(体験済)
私の開発環境(PHP5.1.6、CentOS5.5)では0.24であれば動くことを確認しています。
まぁそういった制限された環境で比較をしても仕方ないので、今回、勉強という意味も含めてPHP5.3.3を使用して比較を行いました。
機能の比較
機能において、PHPExcelとReviserの両者の一番大きな差は扱えるExcelの種類です。
PHPExcelはExcel2007(.xlsx)形式に対応しています。Excel5形式(.xls)形式も扱うことは可能ですが、こちらの方は色などに少々バグがあります。(体験済)
Reviserは.xlsx形式を扱うことはできません。.xlsのみの対応となっています。
数式については現在両方とも扱うことが可能です。
しかし、古いReviserを使用すると数式が扱えないものがあるので注意が必要です。
(上記に示した0.24は数式に対応していません。)
色や罫線も両方とも使用が可能ですが、使い方は大きく異なります。
PHPExcelは直接指定のセルに色や罫線を引くことが可能です。
一方、Reviserですが、直接指定をすることはできません。
かわりに指定したセルから情報をコピーして使用します。
指定したセル部分は後で削除することができるので、PHPExcelと出来ることは同等ということになります。
その他の特徴はPHPExcelはテンプレートのファイルがなくても出力をすることが可能ですが、Reviserはテンプレートファイルがないと出力することができません。
両者ともできないことはマクロの作成、出力です。
テンプレートファイルにマクロが含まれていた場合、私が見た限りだと、PHPExcelはマクロの後らしきものが一応出力されますが、クリック等しても反応しません。
Reviserの場合はマクロ自体が完全に削除される形になります。
ソースの書き方はPHPExcelよりReviserの方が簡単に書くことができます。
書き方の一例
PHPexcel
ini_set("memory_limit" , -1);
set_time_limit(0);
$this->layout = false;
Configure::write('debug', 0);
// 必要なクラスをインクルードする
set_include_path(get_include_path() . PATH_SEPARATOR . "./Classes/");
include APP . "vendors/phpexcel/Classes/PHPExcel.php";
include APP . "vendors/phpexcel/Classes/PHPExcel/IOFactory.php";
// PHPExcelオブジェクトを生成する
$objReader = PHPExcel_IOFactory::createReader("Excel2007");
$objPHPExcel = $objReader->load(APP . "vendors/templates/templete.xlsx");
$objPHPExcel->setActiveSheetIndex(0);
$sheet = $objPHPExcel->getActiveSheet();
//シート名
$sheet->setTitle('sheet_name');
//セルA2に文章入力
$sheet->setCellValueByColumnAndRow(0, 1, 'PHPExcel');
//セルに罫線を引く
$sheet->getStyleByColumnAndRow(0, 1)->getBorders()->getTop()->setBorderStyle(
PHPExcel_Style_Border::BORDER_THIN);
$sheet->getStyleByColumnAndRow(1, 1)->getBorders()->getLeft()->setBorderStyle(
PHPExcel_Style_Border::BORDER_MEDIUM);
//背景色の指定
$sheet->getStyleByColumnAndRow(0, 1)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyleByColumnAndRow(0, 1)->getFill()->getStartColor()->setRGB('336699');
$target_filepath = TMP . "PHPExcel.xlsx"; //ファイル名生成
$file_name = "PHPExcel.xlsx";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
//ファイルの保存
$objWriter->save($target_filepath);
$media_id = basename($file_name);
//保存したファイルの出力
$file = TMP . $media_id;
$file_length = filesize($file);
header("Content-Disposition: attachment; filename=$media_id");
header("Content-Length:$file_length");
header("Content-Type: application/octet-stream");
readfile ($file);
Reviser
Configure::write('debug', 0);
$this->layout = false;
ini_set("memory_limit" , -1);
set_time_limit(0);
App::import('Vendor', 'reviser/reviser');
$reviser = new Excel_Reviser();
$reviser->setInternalCharset('utf-8');
//1枚目のA1のセルデータを読み込んで1枚目のB1に文字を入力
//引数7つは前から順にシート番号、縦(数字)、横(英語),入力文字,コピーするセルの縦(数字)、横(英語),シート番号
$reviser->addString(0,0,1,'reviser',0,0,0);
//1枚目のA1のセルデータを読み込んで1枚目のB3に数字を入力
$reviser->addNumber(0,0,2,3,0,0,0);
//1枚目のB4に数式を入力
$reviser->addFormula(0,0,3,'A2+A3');
$readfile = APP . 'vendors/templates/templete.xls';
$outFile = 'reviser.xls';
// 出力
$reviser->reviseFile($readfile, $outFile);
まぁ実際のところ、PHPExcelはそのままでは書くのが煩わしくなってくるので私はコンポーネントにして使用しました。
reviserはそのままでも十分簡潔に書くことができると思います。
ここまで機能について簡単にまとめてきました。
機能についてみるとReviserも十分使用に耐えうるものはもっていますが、ReviserにできてPHPExcelにできないことはおそらくほとんどないと思われます。
単純にExcel2007が使えるかどうかだけでも使用可能な関数などに差があります。
長くなってきたので続きは次回に。
最後に役に立たない化学豆知識を。
今年正式に名前が発表されたコペルニシウム(Cn)という元素。
原子番号は112番なのですが、この金属、実は常温で液体だと言われています。
他に常温で液体の金属は水銀のみです。
また、原子番号が100を超えるような元素は基本的に半減期が数秒程度のものがほとんどなのですが、Cnは半減期が数分程度という実験結果も出ています。
それでは