なんだこれは

はてなダイアリーから移転しました。

XLSX with Common Lisp Part 2

ql:qucikload xlsx は日本語のxlsxファイルに対応していない件について(2)

前回の記事ql:qucikload xlsx は日本語のxlsxファイルに対応していない件について

動作確認

Common Lispでquickload しているときは、どうやってファイルを変更すればいいんだっけ?とか久しぶりすぎてわからなくなっていた。 けれど、Common Lispはもっと自由な言語だったからそんなことしなくても確認できるのだった。

結局、 quickload したときにはもう Lispのイメージにデータがはいっているんだから、そのまま get-entry 関数を上書きすればよかった。

(ql:quickload :xlsx) ; xlsx パッケージ読み込み
(in-package :xlsx) ; xlsx パッケージに移動してからの get-entry関数を再定義(上書き)
(defun get-entry (name zip)
  (let ((entry (zip:get-zipfile-entry name zip)))
    (when entry
       (xmls:parse 
          (flex:octets-to-string
             (zip:zipfile-entry-contents entry)
             :external-format :utf-8)))))
(in-package :cl-user) ; 元のパッケージに戻る
(xlsx:sheet-names "xlsxファイル") ; 実行!

ヨシ!

メデタシメデタシ...じゃなかった

いや、まあ、いいんだけど、ファイル自体はなにも変更していない。 なのでもう一度 quickload すると元の木阿弥。あら不思議元どおり。

次使うときもそれを同じことするの?

対応方法

ざっと考えるとこんな選択肢がある、はず。

  1. :xlsx パッケージってそんなに使わないから、まあ使う前にこの方法でイメージ書き換えればいい
  2. :xlsx パッケージは quicklisp で管理している、~/quicklisp/dists/quicklisp/software/xlsx-20180711-git/xlsx.lisp にあるからこれを編集しておけばいい。
  3. :xlsx パッケージのダウンロード元に patch を送ればいいよね。
  4. :xlsx パッケージはもうあきらめて cl-xlsx でよくない?

対応策1 イメージだけでOK

これはつまりもう何もしなくていい。おしまいコース。

対応策2 ローカルだけ編集

quicklisp を使っているので、ソースコードはローカルのディレクトリにある。この場合は ~/quicklisp/software/xlsx-20180711-git/xlsx.lisp を編集しておけばいい。

次回からは普通に (ql:quickload :xlsx) でやってくれるはず。 それでうまくいかなかったら、~/quicklisp/local-projects:xlsx を落せばいい。:xlsx は gitlab.common-lisp.net から取得できる。

うーん。これ名前かぶらないかな。フォークした方がいいのかな。

対応策4 xlsx あきらめて cl-xlsx 使う?

これも quicklisp を使っているので、~/quicklisp/local-projects:cl-xlsx を落せばいい。:cl-xlsxcl-xlsxから落せるので。

# ソースコード取得
cd ~/quicklisp/local-projects
git clone https://github.com/a1b10/cl-xlsx
(ql:quickload :cl-xlsx)
(setq x (cl-xlsx:read-xlsx 
   "/Users/dote/Downloads/JapaneseSheetName.xlsx"))

うん、普通にできるね。 これは :cl-xlsxXMLの処理に :cxml というパッケージを使用していて、 :cxml パッケージが文字コードとかの面倒をみてくれている。

よかった。よかっ