やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

storeAsURLの第2引数は?(CSV,TSV,FODS,SYLK)

 各ファイル形式で保存するときに渡すべき引数値を調べた。

成果物

概要

 LibreOfficePythonマクロにてドキュメントを保存したい。このときstoreAsURL()storeToURL()を使う。保存形式などを指定するとき第2引数にPropertyValueの配列を渡す。

 PropertyValueNameValueの組合せである。どちらも文字列を渡すが、どんな値を渡せば何が設定できるのか。その一覧はどこにあるのか不明。なので調べた。

 ネットで調べるとCSVに出力するとき渡す引数は以下。マジックナンバーだらけ。

from com.sun.star.beans import PropertyValue
properties = (PropertyValue(Name='FilterName', Value='Text - txt - csv (StarCalc)'),
              PropertyValue(Name='FilterOptions', Value='44,34,76,,,,,,true'))
doc.storeAsURL(url, properties)

storeAsURLの第2引数PropertyValueのName属性値一覧

Name属性値 Valueの型 概要
CharacterSet String 文字セットを指定する
FilterName String 保存形式を示すフィルタ名を指定する
FilterOptions String フィルタ用の追加オプションを定義する
Overwrite Boolean 既存ファイルを警告なしで上書きする
Password String 保護されたファイルのパスワードを転送する
Unpacked Boolean ドキュメントを圧縮せずサブディレクトリに保存する

FilterName

 指定できる値は前回、一覧を出力した。

拡張子 FilterName
ods calc8
fods OpenDocument Spreadsheet Flat XML
csv,tsv,tab,txt Text - txt - csv (StarCalc)
slk,sylk SYLK

FilterOptions

 カンマ区切りの文字列で渡す。各列の意味は以下。

Index 概要 値の例 初期値 補足
1 フィールドセパレータ 44 ? 44はASCIIコードを10進数で表したときの,である
2 テキストデリミタ 34 ? 34はASCIIコードを10進数で表したときの"である
3 文字セット 76 ? 76UTF-8を示す仕様である
4 先頭行 1 ? 1行目を先頭行とする
5 各列のセル書式 ? ColmunIndex/FormatCode ColmunIndex1から始まる整数で指定する。FormatCode1=標準, 2=テキスト、3=MM/DD/YY, 4=DD/MM/YY, 5=YY/MM/DD, 9=無視(インポートしない), 10=米国英語
6 言語識別子 ? 10進数で表現した文字列として渡す。Microsoftの言語識別子に基づく。詳細は言語識別子の定数と文字を参照。
7 csvインポート true/false false 「テキストとして引用されたフィールド」チェックボックス相当
7 csvエクスポート true/false false 「すべてのテキストセルを引用する」チェックボックス相当
8 csvインポート true/false false 「特別な番号を検出する」チェックボックス相当。
8 csvエクスポート true/false true 同等のUIなし。trueなら数値セルは数値として格納される。falseなら数値はテキスト区切文字付きテキストとして保存される。
9 csvインポート ? ? 未使用:8つのトークンのみが使用される
9 csvエクスポート true/false true 「セルの内容を表示どおりに保存する」チェックボックス相当

結論

 storeAsURL, storeToURLするときの第2引数PropertyValueで何を渡すべきか。保存形式ごとにまとめてみた。

ODS

properties = ()

 odsLibreOffice Calcにおけるデフォルトのファイル形式である。空の配列を渡せばよい。

 または以下でも可。

properties = (
  PropertyValue(
    Name='FilterName', 
    Value='calc8'))

CSV

properties = (
  PropertyValue(
    Name='FilterName', 
    Value='Text - txt - csv (StarCalc)'),
  PropertyValue(
    Name='FilterOptions', 
    Value='44,34,76,,,,,,true'))
  • FilterOptionsValue
    • 44: ASCIIコードを10進数で表したときの,である
    • 34: ASCIIコードを10進数で表したときの"である
    • 76: UTF-8を示す仕様である
    • true: 「セルの内容を表示どおりに保存する」チェックボックス相当

TSV

properties = (
  PropertyValue(
    Name='FilterName', 
    Value='Text - txt - csv (StarCalc)'),
  PropertyValue(
    Name='FilterOptions', 
    Value='9,34,76,,,,,,true'))

 CSVとほぼ同等。ただしフィールドセパレータを<TAB>を意味するASCIIコード9に変更してある。

FODS

properties = (
  PropertyValue(
    Name='FilterName', 
    Value='OpenDocument Spreadsheet Flat XML'))

 fodsodsXML版ファイル形式である。ファイルサイズは大幅に肥大化するが、バイナリでなくテキストで表現できる。

SYLK

properties = (
  PropertyValue(
    Name='FilterName', 
    Value='SYLK'))

 SYLKMicrosoft社が開発した書式。テキスト形式でセルの書式などを簡易表現できる。XMLよりも簡易であるため軽量。だが現在、Microsoft社から情報が削除されてしまい仕様が不明に……。

 ググると有志の方が仕様を復元してくれていたのを発見。感謝。

 昔からMicrosoftはすぐ資料やコードを使えなくする害悪。カネ儲け狙いなのはわかるが、そのせいでユーザは学習コストをムダにさせられて多大なる損失を被る。なので私はMicrosoft製品を捨ててLinuxオープンソースを使うことで幸せになった。

情報源

所感

 仕様を調べるのが大変すぎた。

 CSV系はマジックナンバーまみれのクソコードやん。

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux