2011年11月24日木曜日

Calc(OOo, LibreOffice)のSylkファイル

に関してどーなってんの?と聞かれたのでちょいソースを見てみた。
http://svn.services.openoffice.org/opengrok/xref/Current%20(trunk)/sc/source/ui/docshell/impex.cxx
http://cgit.freedesktop.org/libreoffice/calc/tree/sc/source/ui/docshell/impex.cxx

この中のScImportExport::Doc2SylkとScImportExport::Sylk2Docってのが実体みたい。
中身は割と朴訥な感じで、セルの内容にXとかYとかくっつけてテキストに吐き出したり、逆にテキストファイルの中身を総なめしてXとかYとか出てきたらそこのセルにテキストを展開したり、ってことをやってるみたい。
Excelが出してくるやつより、かなりシンプルになるんじゃなかろうか、と思って実際出来たSylkファイルを比べてみると、やっぱりかなり違います。

もし昔のアプリケーションとかで、Exelが出すSylkファイルを取り込んで云々するものがあれば、OOo(LibreOffice)で作ったSylkファイルだとトラブルでるかも。

2011年11月1日火曜日

中国語MS OfficeでVBA

中国語MS OfficeでVBAマクロを作成し、それを日本語MS Officeで読み込むと文字化けします。(多分逆もそうなんじゃないか。)
内部的にはどっちもUnicodeを使ってるはずなので、UnicodeをUnicodeのまま素直に表示してくれるだけで良いはずなのに、どうも何か無駄な変換がかかってるようです。やっぱ過去のしがらみとかが関係してるのかな。

ちなみに同じ中国語ファイルをLibreOfficeで読み込むと、当たり前ですが、ちゃんと難しい漢字が(フォントが入ってれば)出ます。

VBAでテキスト出力(中国語)

VBAでテキスト出力する際に、素直に、Open hogehoge For Output As #i とかやるけど、中国語が混じってきたときに問題が発生したので、メモ。


そもそも、Windowsも、MS Officeも、その中のVBAも、全部Unicodeで処理されてるっぽいので、ファイル名だの、ファイルの中だのに中国語が入っていても問題ないけど、VBAからテキスト出力するときだけは、過去との互換性のためか、勝手にShift_JISに変換されちゃいます。
んでそこに中国語が入ってきたときに、あれやこれや問題が発生します。文字化けしたり、書き込みエラーになったり。
(多分OOoとかLibreでも似たような問題発生するんじゃなかろうか。。。)


対応策としてまず考えたのは、バイナリモードでUnicodeをそのまま出力することですが、割と修正箇所が多くて、文字列をバイト配列に変換したり挿入箇所を指定したり改行コード挿し込んだりが、めんどっちかったので、とりあえず文字列をURLエンコードして凌ぐことに。CreateObject("ScriptControl")とかしてJavaScriptの変換関数を呼び出すと簡単にできます。(MS Office 2010とか64bit版とかだと使えないって噂がありますが)


出力されたテキストを読むときはURLデコードする必要がありますが、コード修正の手間とのトレードオフってことで。