Gotanda.pmで見かけたjs-xlsxをテストした件
ギョームで「データをエクセルでダウンロードできるようにしてね!(意訳、普通にエクセルで開けるデータをDLできるようにしてね!UTF8のCSVとかいうなんかオタク臭いみたことない形式のテキストはよくわかんないからやめてね!!)」としばしば言われるおじさんですこんにちは。
先日のGotanda.pm #1(http://gotanda-pm.github.io/)で、tokuhiromさんがLTしていたjs-xlsxデモを手元でうごかしてみたので、その話です。
js-xlsxとは
JSでエクセルでひらけるxlsxが生成できる(DLできる)
https://github.com/SheetJS/js-xlsx
tokuhiromさんがデモを作成されています。
https://github.com/tokuhirom/js-xlsx-demo
この記事はそれを試して見た話です。
なにがよいか
これはおそらくサーバー側でxlsを生成したことのない人には必要のないものですが(幸せですね!)xlsファイルの生成は、だいたいどれもめっちゃメモリ食うので、php のmemory_limit = 2048Mとか厳しい文字をかかざるをえなく、生きるのがつらい。
サーバーはOutputBufferを切って、ゲロゲロとはき出すだけにしたい。*1
だからって単なるcsvだとcp932(Sjis)じゃないとエクセル文字化けするし、いまどきUnicode通らないとかマジ切れそう!!ってなる(後述します)。
(ただし、文字化けしないという未確認情報あり。しかし私の手元ではUTF-8で化けないCSVを知らない)
ということで期待を胸にテストした
まずtokuhiromさんのコードはAngularをつかっているが、俺はあんなオシャレな機能はいらないので、以下のようなコードに改変した。
https://github.com/uzulla/js-xlsx-demo
このサンプル、phpを必要にするあたりがPHPerの俺らしいといえるが、OSXならPHP入ってるので大丈夫でしょ?
エッ「私のカッコイイMacにそんな汚らわしいものがはいってるわけない」って?残念でした〜〜マーベリックスならRuby大好きっ子のあなたのMacにも、残念ながらPHP5.4がはいってますよ!!!(ニタァ)
git clone https://github.com/uzulla/js-xlsx-demo.git cd js-xlsx-demo php -S 127.0.0.1:8080 open http://127.0.0.1:8080
このサンプルの注意点として、セルの種類をs(tring)決め打ちにしているので、ちゃんとするならちゃんと書こう。tokuhiromさんのやつはちゃんとやっている。
(Numberなのに、Typeをs指定すると、js-xlsxがエラーをだしてしまう)
テストの件数やデータをかえたいときは、data.php修正してください、phpですけど大変雑なコードなので、みなさま一瞬で分かるとおもいます。
結果
10万セル(5万行、2列)くらいなら、Chromeのメモリ400Mbyte弱くらいあればまあ問題ない。
(これはxlsxの処理というより、JSONをよみこんだ時点で300Mbyte位使うので、それがでかい)
DLボタンを押して保存までしばらく待つが、まあこの処理はサーバーじゃなくてユーザーのCPU資源なので特に(俺は)気にしない*2。
勿論数千件なら一瞬で終わります。ということで、これはまあ一般的には十分使い物になる感じです、やったね!!
しかし…
残念ながら私はコレをつかえない感じであった。🍣(寿司)が通らないのだ。UTF8MB4は無理っぽい。*3
※20140615 追記しました、後述
ということで、私は引き続き泣く泣く「UTF16LE BOM有り、区切り文字タブ」のエセCSVを使い続ける事になるのだった…。*4
がんばろう!
ExcelがUTF-8のCSVをちゃんと扱えるようになるその日まで!
っていうかもう皆さんOpenOfficeとかLibreOfficeとかNumbersとか入れて!!Excelをすてて!!!
20140615 追記
寿司絵文字が通らないことをTwitterにかいたら、SheetJSの中の人がレスをくれて、サンプルをおくって調べて貰ったのだが、どうも利用しているライブラリに問題があるんだないんだという話になっている。
原因は分かったらしいので、そのうち対応されるのかもしれない。