uzullaがブログ

uzullaがブログです。

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

http://d.hatena.ne.jp/uzulla/20110802/p1

がんばろう!

ExcelUTF-8CSVをちゃんと扱えるようになるその日まで!

っていうかもう皆さんOpenOfficeとかLibreOfficeとかNumbersとか入れて!!Excelをすてて!!!

20140615 追記

寿司絵文字が通らないことをTwitterにかいたら、SheetJSの中の人がレスをくれて、サンプルをおくって調べて貰ったのだが、どうも利用しているライブラリに問題があるんだないんだという話になっている。

原因は分かったらしいので、そのうち対応されるのかもしれない。

*1:何らか集計必須なら、ダメですけど

*2:このデモについていえば、ページロードが終わった時点で、JSONのDL自体は終わっている

*3:寿司とかつかうの?正気ですか?とおもわれるかもしれませんが、当方のギョームはツイッタァ連携とか多くて、絵文字はやっぱり通したい(通さないとクレームになる)。まあいってもWindowsでどうなるのかはしらん

*4:なんと、ちゃんと寿司が通るのだよ…