JavaScript(jrunscript/Rhino)でodsファイルからMySQLにデータ投入

この記事は LibreOffice Advent Calendar 2014 の17日目です。



前のエントリで LibreOffice SDK で読み書きするとこまでやりましたので、ついでにDBに入れるとこまでやってみようか、という流れで作ってみました。
DBの更新を伴う処理の開発・デバッグ時に、データ入れて、動かして、また元に戻して、という作業を楽に繰り返すために主に使ってます。

必要なもの

使い方

config.jsonJDBC URL, ユーザ名、パスワードを設定して、
soymilk_ods.bat 内でプログラムのパス、クラスパスの指定などを修正して、
mysql-connector-java-*.jar をスクリプトと同じフォルダに置いて、

こんな内容の tables.ods(ファイル名は任意)を用意して

f:id:sonota88:20190704053405j:plain

コマンドプロンプトから

soymilk_ods.bat tables.ods

で実行します。

使い方の補足

  • 1シートが1テーブルに対応。
  • シート名が "#" で始まるシートは無視される。その点を除けばシート名は任意。
  • セルの書式はすべて「テキスト」にしておく。
  • 図形、画像などは無視される。

良かったところ

  • 使い慣れた LibreOffice Calc でデータを編集できる
  • 複数テーブルのデータを1ファイルにパッケージして管理できる

ここらへんは最初から考えながら作りました。良いと思います。

あとは、このファイル作っとけば他の資料とかに(枠線や文字色などの装飾も含めて)そのままコピペできて便利。

その他

上の図では説明のためいろいろと書きこんだり装飾したりしてますが、動作に最低限必要なのは

  • テーブルの物理名
  • 列の物理名
  • 行・列の開始位置の指定
  • データ本体

だけで、他の部分は人間が見るための飾りです。
なので、特に飾る必要がない場合はこんなんでOK。

f:id:sonota88:20190704053408j:plain


odsファイルを中間形式(オレオレTSV)にダンプする dump_ods.js (1) とダンプされた中間形式のデータをDBに入れる import.js (2) の2つに別れています。

  • (1) ではodsファイルを開いて内容を読むために LibreOffice SDK を使っています。
  • (2) で中間形式ファイルを読み、テーブルごとに全件削除し、INSERT文を組み立ててJDBCで実行しているだけです。型変換もRDBMS側の暗黙の型変換におまかせ。



  • エスケープとか中間形式のフォーマットとかいろいろ適当。必要になったらどうにかするかも。
  • 今回は確認しませんでしたが、少し手を入れれば Java 6, 8 でも動かせると思います(Java 8 の場合はjjs/Nashorn利用)。
  • 量の多いデータは今のところ想定していません。スプレッドシートで管理するものではない。ということにしておく。
  • 名前は投入と豆乳のダジャレ。

動作確認した環境・バージョン


Ubuntu 14.04 でも動作確認できたので Bashスクリプト(拡張子なしの dump_ods)もリポジトリに入れておきました。

動かすときに必要なパッケージはこっちのエントリに書いてます。
jrunscript/RhinoでLibreOffice Calcのセルの読み書き(ついでにxls,xlsxも)