トップ  >  2010年  >  2010.04.15 PHPExcel で Excelファイルをつくる
features
PHPExcel で Excelファイルをつくる
2010.04.15記
データベース(MySQL)のデータを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)
php_zip は、Excel2007 の読み書きや OpenOffice Calc の読み込みをしなければ必要ないようです。

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'には読み取れない内容が含まれています。このブックの内容を回復しますか?・・・・
このようなメッセージが出ました。(Excel2007形式だけ、Excel5では出なかった)


また、行見出し、列見出しが入力されている既存ファイルにデータを埋め込むというようなこともできます。
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つ借りたのですが最初から利用できる状態でした)
前
2010.05.15 jQuery.autopager スクロールでどんどん表示
カテゴリートップ
2010年
次
2010.03.15 JavaScript でカレンダー

PAGE TOP 
メニュー
サイト内検索
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
Copyright(C) 1999-2017 keibunsya all right reserved.