PHPExcel で Excelファイルをつくる 2010.04.15記 |
データベース(MySQL)のデータをExcelファイルで書き出す必要があったので、PHPExcelというライブラリを使ってみたので、備忘録として書いておきます。
phpMyAdmin を使ってエクスポートすればExcelファイルで保存することもできるのですが、若干加工したデータを保存したかったのでPHPExcelを利用しました。
phpMyAdmin を使ってエクスポートすればExcelファイルで保存することもできるのですが、若干加工したデータを保存したかったのでPHPExcelを利用しました。
PHPExcel
http://phpexcel.codeplex.com/
ここのダウンロードより
PHPExcel 1.7.2 をダウンロード
(PEAR版もあるようです)(2010-4-15現在 1.7.2)
ダウンロードした圧縮ファイルを展開すると、Classes、Documentation、Testsなどのフォルダがあり、Classes フォルダの中に PHPExcel があります。
利用するときは、Classes フォルダごと配置しておくのがよいでしょう。
(このフォルダ名は変えてもよいです)
Tests フォルダの中にサンプルが入っているので、サンプルを試したい場合は、Classes フォルダ名も変更せずそのまま配置しておきましょう。
必要条件は以下のようになっています。
引用:
* PHP version 5.2.0 or higher
* PHP extension php_zip enabled
* PHP extension php_xml enabled
* PHP extension php_gd2 enabled (if not compiled in)
XAMPP1.7.3で試しました(XAMPPでは問題なく使えます)。
まずは、Tests フォルダのサンプルを見ながら、以下のようなテストファイルをつくってみました
- A1 セルに文字を書き込み
- シートに名前を付け
- Excel2007 フォーマットでファイルを保存します
<?php // この2つのファイルを読み込みます require_once './Classes/PHPExcel.php'; require_once './Classes/PHPExcel/IOFactory.php'; $objPHPExcel = new PHPExcel(); $sheet = $objPHPExcel->setActiveSheetIndex(0); $sheet->setCellValue('A1', 'A1セルに書き込むヨ'); $sheet->setTitle('テストシート'); // Excel2007でファイルに保存 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('test.xlsx');日本語を書き込む場合は、ファイルをUTF-8(BOMなし)で保存するか、書き込む文字列を mb_convert_encoding で UTF-8 に変換します。 (ブラウザ上には何も表示されません)
setCellValue()メソッドでA1, A2, A3, B1, C1 などのようにセルを指定してデータをセットしますが、プログラムでデータを連続でセットしにくいので、setCellValueByColumnAndRow()メソッドを使って、列番号と行番号でデータをセットしていきます。
$data = 1; for ($row_num = 1; $row_num <= 20; $row_num++) { for ($col_num = 0; $col_num < 20; $col_num++) { $sheet->setCellValueByColumnAndRow($col_num, $row_num, $data++); } }こんな風にすると、20行20列のセル(A1〜T20)に1〜400の数字が入れます。
行番号は 0 から、列番号は 1 からはじまります。
(シートをR1C1参照形式に変更するものではありません)
関数なんかもデータ('=sum(A1:C3)', '=A1*B1'等)としてセットできるようですが、R1C1参照形式の '=sum(R[-20]C:R[-1]C)' はエラーになりました。なにかやりかたあるのだろうか?
上記では「Excel2007」形式で保存していますが
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
↓
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
このように変えることで「Excel5」形式で保存します。
(その場合の拡張子は .xls )
ダウンロードする場合は以下のようにします。
// Excel2007 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="test.xlsx"'); header('Cache-Control: max-age=0'); $writer = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $writer->save('php://output'); exit;
// Excel5 header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="test.xls"'); header('Cache-Control: max-age=0'); $writer = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $writer->save('php://output'); exit;出力した後は exit() でスクリプトを止めておいた方がよいです。
今回のテスト時に echo, var_dump で変数をチェックしていたのが残っていて、ファイル自体は出力されるのですが、
引用:
'text.xlsx'には読み取れない内容が含まれています。このブックの内容を回復しますか?・・・・
また、行見出し、列見出しが入力されている既存ファイルにデータを埋め込むというようなこともできます。
require_once './Classes/PHPExcel.php'; require_once './Classes/PHPExcel/IOFactory.php'; // テンプレートのエクセルファイルを読み込みます $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $excel = $objReader->load('template.xlsx'); $excel->setActiveSheetIndex(0); $sheet = $excel->getActiveSheet(); $data = 1; for ($row_num = 2; $row_num <= 20; $row_num++) { for ($col_num = 0; $col_num < 20; $col_num++) { $sheet->setCellValueByColumnAndRow($col_num, $row_num, $data++); } } $sheet->setTitle('テンプレートテスト'); $objWriter = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); $objWriter->save('test2.xlsx');テンプレートファイルのセルの色、行幅、列幅、フォント種、文字サイズなどは保持されたままデータを埋め込んだ新しいファイルができました。
しかし、セルに埋め込んだコメントが「Excel5」形式での保存で失われていました(Excel2007では大丈夫)。だから、まだ他にも保持できないデータがあるかもしれません。
プログラムでコメントを埋め込むのはこんな感じです。
// コメント $sheet->getComment('A1')->getText()->createTextRun('コメントを書き込む'); // または $sheet->getCommentByColumnAndRow(0, 1)->getText()->createTextRun('コメントを書き込む');やはり、Excel5では保存されません。
文字サイズ・セル色等もいろいろ変更できるようですが、今回はセルのスタイルにこだわりがなかったので調べていません(^^ゞ
当サイトのさくらインターネットには、php_zip が入ってなかったので、サポートに問い合わせしたら利用できるようにしてもらえました。
どうもありがとうございます。m(_ _)m
(最近個人的に1つ借りたのですが最初から利用できる状態でした)
当サイトのさくらインターネットには、php_zip が入ってなかったので、サポートに問い合わせしたら利用できるようにしてもらえました。
どうもありがとうございます。m(_ _)m
(最近個人的に1つ借りたのですが最初から利用できる状態でした)
2010.05.15 jQuery.autopager スクロールでどんどん表示 |
2010年 |
2010.03.15 JavaScript でカレンダー |