アーカイブ

‘php’ タグのついている投稿

[PEAR] Spreadsheet_Excel_Writerを使ってサーバ内にExcelファイルを保存する方法

GB-Scatterplot
Creative Commons License photo credit: briansuda

PHPからExcelファイルを出力するためのPEARライブラリ「Spreadsheet_Excel_Writer」を使って、PHPプログラムが動作するサーバ内にExcelファイルを出力する方法を調べたのでまとめておきます。

何が問題?

Spreadsheet_Excel_Writerを使ってExcelファイルを出力する場合、通常だと以下のようなコードを記述します。

1
2
3
4
5
6
7
8
9
$workbook = new Spreadsheet_Excel_Writer();
$worksheet = &$workbook->addWorksheet();
 
...
(中略)
...
 
$workbook->send(); // HTTPヘッダを標準出力に出力
$workbook->close(); // Excelファイルのデータを標準出力に出力

ですが、上記の方法だとExcelファイルのデータが標準出力に出力されてしまい、ブラウザからExcelファイルをダウンロードするような形になってしまいます。
実現したいのは「PHPプログラムが動作するサーバ内にxlsファイルを保存する」ということなので、ちょっと違いますね。

解決策 – 出力バッファリングを使う

PHPには標準出力をバッファすることができる「出力制御関数」というものが用意されています。

出力バッファリングを使うことで、上記のコードでは標準出力に出力されていたExcelファイルのデータを、標準出力に出力することなく何らかの変数に格納することができます。
データを変数に格納できればこっちのもの、好きなようにExcelファイルのデータが扱えます!

というわけで出力制御関数を使って、サーバ内にExcelファイルを保存できるように上記コードを修正してみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$workbook = new Spreadsheet_Excel_Writer();
$worksheet = &$workbook->addWorksheet();
 
...
(中略)
...
 
ob_start(); // 出力バッファリング開始
$workbook->close(); // バッファにExcelファイルのデータが格納される
$excelData = ob_get_contents(); // バッファからExcelファイルのデータを取得し変数に格納
ob_end_clean(); // 出力バッファリング終了
 
$fp = fopen('./hoge.xls', 'w'); // xlsファイル作成
fwrite($fp, $excelData); // Excelファイルのデータを書き込む
fclose($fp); // ファイルを閉じる

このようにすることで、ブラウザからExcelファイルをダウンロードする形式ではなく、サーバ内に生成されたExcelファイルが保存されるようになりました。
めでたしめでたし。

まとめ

今回使った出力制御関数ですが、他にもいろいろと使えるシーンがありそうですね!

実は以前に何度か使ったことがあったんですけど、すっかり存在を忘れてしまっていました。
ずいぶん昔のことだったので。。

やっぱり復習は大事。
それでは!

カテゴリー: プログラミング タグ: , ,

[PEAR] Spreadsheet_Excel_Writerをインストール

Volta: Seckel Pear Almond Cakes
Creative Commons License photo credit: DaseinDesign

PHPからExcelファイルを出力することができるPEARライブラリ「Spreadsheet_Excel_Writer」をインストールしたのでメモ。

PHPからExcelファイルを操作したいのであればPHPExcelというライブラリを使うのが主流みたいなんですけど、動作環境が「PHP 5.2以降」だったので、こちらをインストールしました。

ほんの少しだけ手間取りました。まずは失敗ログから。

失敗ログ – 誤った方法

以下のコマンドでインストールしようとしたところエラーが発生してしまいました。

$ sudo pear install Spreadsheet_Excel_Writer

Failed to download pear/Spreadsheet_Excel_Writer within preferred state "stable", latest release is version 0.9.2, stability "beta", use "channel://pear.php.net/Spreadsheet_Excel_Writer-0.9.2"; to install
install failed

成功ログ – 正しい方法

どうやら、安定版(stable)のSpread_Excel_Writerは提供されておらず、代わりにベータ版(beta)をインストールして使え、とのこと。

以下の記事によると、PEARではパッケージ名の末尾に「-beta」を付け加えるとベータ版を指定してインストールできるみたいです。

実際に試してみましたところ、無事インストール成功となりました。
よかったよかった。

$ sudo pear install Spreadsheet_Excel_Writer-beta

downloading Spreadsheet_Excel_Writer-0.9.2.tgz ...
Starting to download Spreadsheet_Excel_Writer-0.9.2.tgz (57,629 bytes)
..............done: 57,629 bytes
downloading OLE-1.0.0RC1.tgz ...
Starting to download OLE-1.0.0RC1.tgz (12,153 bytes)
...done: 12,153 bytes
install ok: channel://pear.php.net/OLE-1.0.0RC1
install ok: channel://pear.php.net/Spreadsheet_Excel_Writer-0.9.2

まとめ

今まで何回かPEARを使ったことがありますが、beta版を指定してインストールする方法は知りませんでした。
そういえば何度か同じエラーメッセージを見たことがあるようなないような・・・

なにはともあれ、うまくインストールできてよかったです!
それでは!

カテゴリー: プログラミング タグ: , , , ,

[読書]「CakePHP 1.3によるWebアプリケーション開発」

CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用 CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用
掌田 津耶乃

秀和システム 2010-06
売り上げランキング : 18517

Amazonで詳しく見る by G-Tools

急遽CakePHPを使ってWebアプリケーションを作ることになったので、Web上のチュートリアルからは得られないような体系的な知識を身につけるために読んでみることにしました。

目次

  • Chapter 1 フレームワークとCakePHP
  • Chapter 2 コントローラとビュー
  • Chapter 3 データベースとモデル
  • Chapter 4 開発を支援するさまざまな機能
  • Chapter 5 ヘルパーの活用
  • Chapter 6 コンポネントとビヘイビア
  • Chapter 7 CakePHPの拡張

感想

CakePHP 1.3に対応!

本書は、以前「初心者に分かりやすい」と好評だった「CakePHPによるWebアプリケーション開発」の改訂版です。

タイトルにもあるようにCakePHP最新版のバージョン1.3に対応しています。
バージョン1.3から追加された要素に関する説明・記述が追加されているようです。

オープンソース徹底活用 CakePHPによるWebアプリケーション開発 オープンソース徹底活用 CakePHPによるWebアプリケーション開発
掌田 津耶乃

秀和システム 2009-03
売り上げランキング : 72607
おすすめ平均

Amazonで詳しく見る by G-Tools

フレームワーク未経験者にもわかりやすい構成

前半部分は、今までフレームワークを使ったことがない開発者がスムーズにフレームワークを使った効率的な開発を身に付けられるように、実際にコードを入力して動作を確認しながらCakePHPの仕組み・特徴を学んでいけるような構成になっています。
チュートリアルを進めているような感覚。

後半部分はリファレンスっぽい部分が多いような印象をうけましたが、ひとつのフレームワークを体系的に説明するためには仕方のない必要な部分だと思います。

チュートリアル部とリファレンス部の量のバランスはいい感じ。

多すぎる誤字・脱字

僕が手にしたのが第一版だからかもしれませんが、あまりにも誤字・脱字が多すぎるという印象を受けました。

サンプルコードを入力してもコードの変数名が間違っているために動作しなかったり、本文の説明と全く関係の無いサンプルコードが掲載されていたり、バージョン1.3から使えなくなった記述がサンプルコードの中に現れたりと、なかなかカオスな状況。。。

ポジティブに「動かないコードをうまく修正できればスキルアップに繋がる」と考えることもできるかもしれませんが、初心者にとって非常に学びやすい構成の本だと感じただけに、残念です。

一応、出版社(秀和システム)の正誤表を探しましたが、まだ掲載されていないようでした。

まとめ

僕自身CakePHPの全体を把握しているわけではないのでわかりませんが、読み終わってみるとWebアプリケーションの開発に必要な機能に関してはほぼ説明しきっている感じがしました。
「CakePHPについての体系的な知識を身につける」という当初の目標はある程度達成された感じです。

とりあえずこの一冊を読めば、CakePHPを使ってWebアプリケーション開発の第一歩を踏み出すことができるようになるのではないでしょうか?
(気になる誤字・脱字も版数を重ねていけば改善されるでしょうしね!)

僕はこれからCakePHPを使ってWebアプリケーション開発を始めてみようと思います!
それでは!

カテゴリー: 読書 タグ: , ,

MacPorts (Snow Leopard) でPHP 5.2.13をインストールしようとしたらエラー → 一応解決

The Robot compilando unas patatas y friendo un compilador de Haskell, o no sé qué
Creative Commons License photo credit: sporras

※ 2010.6.3 追記
現在は問題なくインストールできるようです。

MacPorts (Snow Leopard)を使ってPHP5.2.13をインストールしようとしたら次のようなエラーが発生してしまいました。

$ sudo port -d install php52 +apache2 +mysql5 +pear
(中略)
Undefined Undefinedsymbols:
   "_zif_setlocale", symbolsreferenced:
from :
"   _zif_setlocale " ,  _basic_functionsreferenced  infrom :basic_functions.o
ld:
symbol  ( s) not found
_basic_functions in basic_functions.o
ld: symbol(s) not found
collect2: collect2: ld returned 1 exit status
ld returned 1 exit status
make: *** [sapi/cli/php] Error 1
make: *** Waiting for unfinished jobs....
make: *** [libs/libphp5.bundle] Error 1

色々調べてみたところ、gettextというパッケージが悪さをしていることが判明しました。

どうやら、gettextのバージョンを0.18から0.17に下げる必要があるみたい。

以下のコマンドを実行し、gettextをダウングレードします。
(参考:【port / MacPorts】古いバージョンのパッケージをインストールする方法 sakatam blog

$ sudo port deactivate gettext
$ cd ~/Downloads
$ svn co -r 30842 http://svn.macports.org/repository/macports/trunk/dports/devel/gettext
$ cd gettext
$ sudo port install

gettextをダウングレードしたので、gettextパッケージに依存しているすべてのパッケージをリビルドする必要があります。

autoconfが依存するgawkというパッケージに関しては、MacPortsでインストールされるのが少し古いバージョンなので、アンインストールしてシステムにデフォルトでインストールされているものが使われるようにします。

$ sudo port deactivate gawk
$ sudo port clean gawk
$ sudo port -n upgrade --force autoconf

他のパッケージもリビルドしていきます。

$ sudo port -n upgrade --force libidn
$ sudo port -n upgrade --force curl

これでインストールの準備は完了、と言いたいところですが、まだしなければいけないことがあります。

このままMacPortsでインストールを実行するとautoconfの部分でエラーが発生してしまうので、手動でautoconfを実行しなければなりません。
MacPortsでインストールしたautoconfを使っていることがエラーの原因なので、システムにデフォルトでインストールされているautoconfを使ってコンフィグレーションファイルを作成します。

$ sudo port clean php52
$ sudo port -d configure php52 +apache2 +mysql5 +pear
$ cd /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_php52/work/php-5.2.13/
$ sudo autoconf

さらに、手動で./configureも実行してしまいます。

# めちゃくちゃ長いコマンドです。MacPortsによる自動インストールの時に実行されるコマンドと全く同じものです。
# このコマンドはphp52パッケージインストール時に指定するvariantsによって変わってきます。(下の例は僕の場合)
# 実際のコマンドは「port -d configure php52 <variants>  」を実行した時の出力で確認することができます。

$ sudo ./configure --prefix=/opt/local --mandir=/opt/local/share/man --infodir=/opt/local/share/info --with-config-file-path=/opt/local/etc/php5 --with-config-file-scan-dir=/opt/local/var/db/php5 --enable-calendar --with-iconv=/opt/local --enable-exif --enable-ftp --enable-wddx --with-zlib=/opt/local --with-bz2=/opt/local --without-sqlite --without-pdo-sqlite --with-libxml-dir=/opt/local --with-gettext=/opt/local --with-libexpat-dir=/opt/local --with-xmlrpc --enable-soap --enable-bcmath --enable-mbstring --enable-dba --enable-zip --with-openssl=/opt/local --with-mhash=/opt/local --with-mcrypt=/opt/local --with-mime-magic --with-xsl=/opt/local --with-curl=/opt/local --with-pcre-regex=/opt/local --with-gd --with-jpeg-dir=/opt/local --with-png-dir=/opt/local --enable-gd-native-ttf --with-freetype-dir=/opt/local --with-ldap=/usr --with-kerberos=/usr --with-iodbc=/usr --with-apxs2=/opt/local/apache2/bin/apxs --with-mysql=/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_php52/work/mysql5 --with-pdo-mysql=/opt/local/bin/mysql_config5 --with-mysql-sock=/opt/local/var/run/mysql5/mysqld.sock --with-mysqli=/opt/local/bin/mysql_config5 --with-pear=/opt/local/lib/php

これでようやくPHPをインストールする準備が整いました。
以下のコマンドを実行して、PHP 5.2.13をインストールします。

$ sudo port -d install php52 +apache2 +mysql5 +pear
$ sudo cp /opt/local/etc/php5/php.ini-dist /opt/local/etc/php5/php.ini
$ sudo /opt/local/apache2/bin/apxs -a -e -n "php5" /opt/local/apache2/modules/libphp5.so

エラーが表示されなければ、無事インストール完了です。

autoconfのあたりが少々スマートじゃないですが、一時的な対応策ということでよしということにしておきます。
早く、gettextの開発者が対応してくれるといいですね!

それでは!

カテゴリー: プログラミング タグ: , , , ,

[PHP] 現在のUnixタイムスタンプをマイクロ秒単位で取得する方法

2010 年 2 月 10 日 kadoppe コメントはありません

PHPで現在のUnixタイムスタンプをマイクロ秒単位で取得したい時は、microtime()関数を使うとよいそうです。最初、どうすればよいかわからなかったので一応メモしておきます。

使い方は以下の通り。

$time = microtime(true);
echo $time;    // output: "1265774277.5366"

引数に「true」を渡すことで戻り値がfloat型になります。

引数に何も渡さない場合 、または「false」を渡した場合は、以下のようにマイクロ秒とUnixタイムスタンプをスペースで区切った文字列が出力されるので注意が必要です。

$time = microtime();
echo $time; // output: "0.53658800 1265774277"
カテゴリー: プログラミング タグ: ,