PHPでExcelを読み書きする

PHPでEXCELを読み書きするには、

  • Spreadsheet_Excel_Writer
  • Spreadsheet_Excel_Reader

が便利です。
ドキュメントの使い方だけを載せているサイトは沢山ありますが、インストール方法を載せているサイトはぜんぜん無いので書いておきます。

WriteはPEARに登録されていますが、Readerは手動でインストールする必要があります。それにWriteの利用にはOLEのインストールも必要になります。WriterとOLEは共に開発版だったので、-fオプションをつけてインストールする必要があります。

pear install -f OLE
pear install -f Spreadsheet_Excel_Writer

次にReaderのインストールですが、SourceForgeで公開されているので、書庫を保存します。
必要なファイルはExcelフォルダとその中にある2つのファイル「reader.php」と「oleread.inc」です。
Excelのディレクトリごと、PEAR保存フォルダの「Spreadsheet」ディレクトリにコピーします。

本来はこれで仕えるはずですが、残念ながらそうは行きません。

reader.phpを編集してrequireするファイル名を変更します。31行目を削除またはコメントアウトして、1行追加してください。

//require_once 'Spreadsheet/Excel/Reader/OLERead.php';
require_once 'oleread.inc';

OLERead.phpは検索しても出てこないので、PEARに登録するときにこの名前にするつもりだったとか、開発環境ではこの名前になっているとか言う落ちでしょう。自分でもたまにやりますから。これでSpreadsheet_Excel_Readerが動くようになりました。このライブラリの使い方は別の機会に。
おまけ
Writerの解説ページ

Excelで読めるHTMLを書く

Webサービスなどから、Excelで読めるHTMLを出力する場合、
以下の2行をヘッダで出力すればいいのは有名な話。
Content-Type: application/vnd.ms-excel
Content-Disposition: attachment; filename="file.xls"

しかし、今回も同じ技を使おうと思って困ったことになった。
それは、改行が反映されない。
Officeは2000までしか持ってないので、他のバージョンはどうなのかわからないけれど、
MSのことなので、この仕様(不具合)は2007でも継承されているに違いない(かもしれない)。
tdセル内に<br>を書くと行が分離してしまう。
純粋にプレーンなtableを書くとこうなってしまうらしい。
仕方が無いので、ExcelでHTMLを出力させ、改行が反映できるHTMLファイルのテンプレートを作ることにした。
以下がそのコード

<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=UTF-8">
<style>
<!--tr
	{mso-height-source:auto;
	mso-ruby-visibility:none;}
br
	{mso-data-placement:same-cell;}
.style0
	{mso-number-format:General;
	text-align:general;
	vertical-align:bottom;
	white-space:nowrap;
	mso-rotate:0;
	mso-background-source:auto;
	mso-pattern:auto;
	color:windowtext;
	font-size:11.0pt;
	font-weight:400;
	font-style:normal;
	text-decoration:none;
	font-family:"MS Pゴシック";
	mso-generic-font-family:auto;
	mso-font-charset:128;
	border:none;
	mso-protection:locked visible;
	mso-style-name:標準;
	mso-style-id:0;}
td
	{mso-style-parent:style0;
	mso-ignore:padding;
	color:windowtext;
	font-size:11.0pt;
	font-weight:400;
	font-style:normal;
	text-decoration:none;
	font-family:"MS Pゴシック";
	mso-generic-font-family:auto;
	mso-font-charset:128;
	mso-number-format:General;
	text-align:general;
	vertical-align:bottom;
	border:none;
	mso-background-source:auto;
	mso-pattern:auto;
	mso-protection:locked visible;
	white-space:nowrap;
	mso-rotate:0;}
.xl24
	{mso-style-parent:style0;
	white-space:normal;}
-->
</style>
<!--[if gte mso 9]><xml>
 <x:ExcelWorkbook>
  <x:ExcelWorksheets>
   <x:ExcelWorksheet>
    <x:Name>Sheet1</x:Name>
    <x:WorksheetOptions>
     <x:Selected/>
    </x:WorksheetOptions>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
 </x:ExcelWorkbook>
</xml><![endif]-->
</head>
<body>
<table>
 <tr>
  <td class=xl24>あ<br>い</td>
 </tr>
</table>
</body>
</html>

tdタグのxl24というクラスがあることで改行が反映されるらしい。
表示が1行のみになってしまうが、データとしては問題ないらしい。
もう少し削れそうだけど、テーブルの中身さえスッキリすれば、テンプレートとして問題ないので今はここまで。
この方法はMSのExcel用のものなので、OpenOfficeOrgのCalcではやはり分離する。

データ取得元が不調なようです。

日報の皆様、いつもお疲れさまです。
さて、最近ずっと取得の不調が続いてます。
WCGから接続ブロックを食らったので(憶測ですが)データの取得元をにっぽー氏のXMLに切り替えたのですが、こちらでも調子が悪いようです。
さっき確認した中では、txtは正常そうでしたがxmlは空っぽでした。

最近何かと忙しく、かまう時間がなかなか取れずに申し訳ございません。
ただ、管理を放棄したわけではありませんので、首を長くしてお待ちいただければと思います。

Excelを読むにはPerlとPHPのどちらが便利?

Excelのデータを読む必要が出てきました。
稼動しているシステムでは表向きはPHP、内部はほぼPerlという、
純粋なPHPプログラマにはお手上げのシステムです。
もちろん私はPerlerなので、痛くも痒くもありませんが。

さて、例によってPerlとPHPの間にゴングが鳴らされました。
Perlはお決まりのものがあるので置いといて、PHPのPEARでExcelを探してみると・・・

  1. Spreadsheet_Excel_Writer: Package for generating Excel spreadsheets
  2. Structures_DataGrid_DataSource_Excel: DataSource driver using Excel spreadsheets
  3. Structures_DataGrid_Renderer_XLS: Renderer driver using PEAR::Spreadsheet_Excel_Writer

この3つがヒットしました。
ちなみに、PECLには登録なしでした。
なんかいまいちっぽいので、PEARに登録の無いものを探してみることに。

PHPExcelなるものを発見しました。
このライブラリを取り上げているサイトは多いけど、
実際に使っていたり、サンプルコードを掲示しているサイトが一つも無い・・・
Documentを読んだ限りでは多機能だとわかりますが、
本当に動くかどうか検証されていないものをシステムに入れるわけには行きません。

やはり使い慣れたPerlモジュール「Spreadsheet::ParseExcel」の出番ですか・・・

CentOS5.2にWebminをインストールする

CentOS5.2が基本的な構成でインストールを完了したところから始めます。

CentOS5.2はopenssl、PerlのNet::SSLeayモジュールが既にインストール済みなので、Webminのパッケージをダウンロードしてこればいい。

http://jp.webmin.com/download」にある上から2つ目の「webmin-1.430-1.noarch.rpm」を保存
 ↓
端末で保存した場所に移動
(ルート権限でデスクトップに保存した場合は# cd /root/Desktop
 ↓
rpm -Uvh webmin-1.430-1.noarch.rpmでインストール完了
 ↓
ブラウザで「https:・・127.0.0.1:10000/」にアクセス
 ↓
ユーザーとパスを入力してWebminにログイン
 ↓
左フレームーの「Webmin > Webmin Configration」
 ↓
右フレームの「Language」
 ↓
「Display in language」のメニューを「Japanese(JA_JP.UTF-8)」に選択
 ↓
「Change Language」ボタンで確定
 ↓
ブラウザを更新

以上で全て日本語に変わる。
めでたしめでたし。

SSL証明書インストールに関するメモ

Windows Server(IIS)で使っていたSSL証明書を、Apacheに移し変える作業が必要になっていましたが、なかなか解決の糸口が見つからず2ヶ月ぐらい経過してしまいました。SSL自体の理屈はシスアドでも個人情報保護士でも必要な知識なので理解はしてますが、実際の設定となると上手くいかないものです。いろいろ調べてみても、どのサイトも説明がまちまちでなかなか理解に苦しみました。ここではメモを書き起こすことで、頭に叩き込むことにしました。

まず、拡張子に惑わされないこと。当たり前ですが、拡張子がファイルの内容を証明できるわけではありません。解説サイトに出てくる拡張子には、pem、key、cer、crtというものがありました。SSLも歴史が古いですから、きちんと取り決めがあると思い込んでいたのが最初の間違いです。

つぎに、必要なファイルの呼び方がまちまちなこと。サーバーにインストールする証明書は、秘密鍵です。外部に洩らすような管理をしてはいけません。この秘密鍵は、ほぼ秘密鍵と呼ばれていますが、サイトによっては証明書とだけ呼ばれていることもあります。(ちなみにこのサイトでは秘密鍵という説明が全然無く、どこかのサイトをパクったものの、バレないように編集したら肝心な事が抜けてしまったのではないでしょうか。)

そして、CSRを元に認証局より発行されるのが公開鍵です。先ほどの秘密鍵と公開鍵が対になって暗号化通信が成立します。この公開鍵はサーバー証明書と呼ばれたり、サーバーID(Verisign)と呼ばれています。SSLの解説では、基本的にこの2つについて説明されています。なので、文章上の知識はここまでが限界です。

そして、今でもよく分かっていないのが中間証明書。CA証明書などと呼ばれています。証明をしてもらうための仲介的な存在らしいです。紹介状とでも言いましょうか。もうちょっと正確に知識を吸収するべきなのでしょう。善処します。

秘密鍵
このファイル名はおおよそ*.keyとなっています。一部サイトでは*.pemや*.key.pemとされています。秘密鍵かどうかを確認するには、ファイルの内容を確認します。「-----BEGIN RSA PRIVATE KEY-----」で始まり、「----END RSA PRIVATE KEY-----」で終わります。場合によっては「RSA」が無いものもあるようです。「PRIVATE KEY」という文字列があればほぼ間違いないでしょう。
CSRファイル
認証局に認証してもらうために提出するファイルです。秘密鍵を基にした(秘密鍵そのものとある解説サイトもあるけど、秘密鍵を送ると秘密鍵の意味が無いので間違いと思われ)情報と、サーバーの管理者情報から生成されたファイルは、*.csrとなっています。一部サイトでは*.csr.pemやcsr.pemとされています。CSRファイルかどうかを確認するには、ファイルの内容を確認します。「-----BEGIN CERTIFICATE REQUEST-----」で始まり、「-----END CERTIFICATE REQUEST-----」で終わります。もしくは「-----BEGIN NEW CERTIFICATE REQUEST-----」で始まり、「-----END NEW CERTIFICATE REQUEST-----」で終わります。「CERTIFICATE REQUEST」という文字列があればほぼ間違いないでしょう。
公開鍵
認証局より送り返されてくるファイルです。COMODOの場合はサーバ証明書と中間証明書が書庫ファイルになってメールに添付されます。Verisignの場合はメールの本文に挿入されるので、新規にファイルを作成しコピペして保存することになります。このファイルの保存名が*.cerや*.crtといったものから、certificate.txtなど、ファイルの内容を連想するにも困難なものまであります。COMODOの場合は中間証明書が*.ca-bundleでした。ファイルとしては公開鍵なので、内容を確認すると「-----BEGIN CERTIFICATE-----」で始まり、「-----END CERTIFICATE-----」で終わります。公開鍵に関しては見て回ったサイトの中ではどれも一致していました。
ルート証明書
これは認証局を証明するためのファイルです。公的な認証局ではなく、独自に証明する場合はオレオレ証明書などと呼ばれます。基本的にはブラウザに既にインストールされています。ここではオレオレ証明書については説明しません。一部サイトではサーバ証明書とルート証明書が混同して解説されています。このようなサイトもパクっ(以下略)。このファイルは公開鍵なので、上記公開鍵と同じ「-----BEGIN CERTIFICATE-----」で始まり、「-----END CERTIFICATE-----」で終わります。

ネトゲアンテナが新システムに移行しました

自分用のツールとして開発してからはや3年。
ローカルでの処理が前提だったため、HTML書き出しをFTPでアップするというトンデモシステムのまま2年近く続いていました。
しかし、いいかげんどうにかしなければということで、結構前から弄ってはいたのですが、
何かと忙しく、路頭に迷いそうにもなりながらも改修を続けていました。
テストを何度か行い、大きな問題はなさそうなので、いつ切り替えようかと思っていましたが、
まとまった時間ができたので更新することにしました。

完全以降までは時間がかかりますが、
これからもネトゲアンテナをごひいきにしていただきますようお願いいたしますm(_ _)m

なぜだかいつもフルスクラッチ

このサイトは最近WordPressに移行したので、いろいろと楽(だが面倒)なのですが、
ここ以外の趣味ページやお仕事ページはなぜか一から書き起こしてます。
テンプレートが使えないような独自のものがほとんどだからなのですが、
この仕事量を普通に金額にしたら相当な額ですね。
フルスクラッチとはいえ、自分用のテンプレートがあるのですが、
一から作った完全オリジナル。
いつか限界が来ないことを祈りつつ(それなりに柔軟に作ってはいますが)
今日も980円のUSBキーボードをこれでもかと叩きまくる。

Flash MXにはマイターリミットが無い

Flashに図形を描く機能を持たせたツールを作ってますが、
PostScriptにはあるはずの機能が無いことに気がつきました。
そう、線をつなげた場合の角のパラメータ、マイターリミット。
検索してみたらAdobeのサイトに行き着いたのでlistStyleの項目を読んでいくと、
このパラメータを指定できるのはFlash8からということで、少々困ったことに。

う~ん、角は尖って欲しいんだけどなぁ・・・

ActionScript2には円を描く関数が無い?

今頃にFlash MXを引っ張り出してActionScriptの勉強してます。
図形で円を動的に描こうと思って調べているとdrawCircleなる関数があるという。
しかしよくよく調べていくと、この関数が使えるのはActionScript3からだとか。
わざわざ数式を用意するのと、インスタンスを使うのではどちらが軽いんだろう。
Flash9は高いしなぁ~