Skip to content
forked from seed-ui/seedtable

seed yaml <-> xlsx を相互変換するツール

Notifications You must be signed in to change notification settings

enpel/seedtable

 
 

Repository files navigation

seedtable

Rails等で扱うseed yaml <-> xlsx を相互変換するツールです。

コマンドライン版とGUI版があります。

AppVeyor Build Status Travis Build Status

Motivation

xlsxは個人用単体表計算ソフトとしては優秀ですが、複数人でのデータ入力やプログラムでの扱い、バージョン管理などには超不向きです。 にもかかわらず、これをRailsアプリケーション等のデータ入力ツールとして使うことがしばしば選択肢に上がるようです。 Excelをマスターデータとしたら最後、その不向きな部分の辛さが待っています。

それに対してこのseedtableは、yamlとxlsxの相互変換をすることで、Excelを利用しつつyamlをマスターデータとする運用の道を開きます。 マスターデータはyamlで、Excelはあくまで編集のしやすい表計算UIであるとして運用すれば、複数人管理、プログラム、バージョン管理親和性を損ねないまま、ユーザーフレンドリーなデータ入力を実現することができるのではないかと考えます。

Excelは大きな長所と同時に大きな短所をもち、運用上の扱い方が難しいツールです。 このツールが、そのようなExcelの長所だけを引き出すより良いデータ運用の一助になれば幸いです。

Features

  • データベース等のIDつき二次元データを表すyamlをExcelで編集する為の変換ツールです。
  • xlsx -> yaml と yaml -> xlsx の相互変換が可能です。
  • 数式セルはxlsx -> yaml変換では計算後の値となります。yaml -> xlsx変換では数式のまま保持されます。
  • 行追加がある場合は書式や数式を周辺のものから自動でコピーしますので、入力Excelの1行目に必要な設定を記述しておけばデータの増加にも簡単に対応できます (EPPlusエンジン)。
  • 入出力するyamlファイルのIDによる分割に対応しています。
  • xlsx -> yamlの変換のみなら似たオプションを持つxlsx2seedもあります。 .NET/Monoランタイムをインストールするのが難しい場合などにご利用下さい。

Requires

.NET Framework 4.0だか4.6だかあたりが必要だと思います。 (Windows)

Monoだと4.4で動きます。(Mac / Linux)

Install

Releasesにあるzipをダウンロードして適当な場所に配置して下さい。

  • seedtable.zip、XmSeedtable-linux.zip、XmSeedtable-mac.zipのいずれも、全環境で動作するseedtable.exeを含みます。
  • seedtable.zipはWindowsで動作するseedtable-gui.exeを含みます(Linux, Macでは設定ダイアログとUIの文字化け以外は正常動作します)。
  • XmSeedtable-{linux,mac}.zipはそれぞれLinuxとMacで動作するXmSeedtable.exeを含みます。

Usage (seedtable.exe)

Monoの場合はmono seedtable.exe等として下さい。

# xlsx -> yaml
$ seedtable from foo.xlsx -o db/seeds
$ seedtable from foo.xlsx -o db/seeds -O hoges piyos
$ seedtable from foo.xlsx -o db/seeds -S hoges:2
$ seedtable from foo.xlsx -o db/seeds -S 1:hoges
$ seedtable from -i doc foo.xlsx -o db/seeds

# yaml -> xlsx
$ seedtable to -s db/seeds -x doc foo.xlsx -o newdoc

オプションの詳細は後のOptionsの節を参照下さい。

Usage (seedtable-gui.exe)

seedtable-gui.exe

  • seedフォルダ (yaml -> xlsxの変換元、およびxlsx -> yamlの変換先になる)
  • 設定 (seedtable.exeのオプション相当 GUIで編集できます)

を入力してから、「yml -> xlsx」、「xlsx -> yml」それぞれをダブルクリックするか、xlsxファイルをドラッグ&ドロップして変換できます。

設定ファイルは下記のように、seedtable.exeのオプションのうちinput/output系を除いた長いオプション名をyamlで設定するものです。

ignore-columns:
  - dummy
subdivide:
  - "foos:0"
  - "bars:2"
engine: EPPlus

この設定をGUIで編集させたくないという場合は、seedtable-gui.exeと同じフォルダにoptions.readonlyというファイル(中身は空で大丈夫)をおいて下さい。

設定の詳細は後のOptionsの節を参照下さい。

Usage (XmSeedtable.exe)

XmSeedtable.exe

seedtable-gui.exeと同じくseedフォルダと設定ファイルを入力します。

変換するExcelファイルを変換元で指定して「yml -> xlsx」、「xlsx -> yml」それぞれをクリックすると変換できます。

Unix系OSとMac OS X等でmono XmSeedtable.exeまたはmono --arch=64 XmSeedtable.exe(Mac OS X等)で動作します。

X Serverが必要ですので、Mac OS XではXQuartz 2.7.8をインストールしてください(2.7.9以降では動作しません)。

Excelファイルの形式

以下のような形式を想定しています。

Excel

シート名characters

A B C
1 ID 名前 説明
2 id name description
3 1 さくら F.I.R.S.T
4 2 アルル ボク
5 3 さっちゃんさん 髪が長い

YAML

characters.yml

data1:
  id: 1
  name: さくら
  description: F.I.R.S.T
data2:
  id: 2
  name: アルル
  description: ボク
data3:
  id: 3
  name: さっちゃんさん
  description: 髪が長い

デフォルトではExcel表の2行目がカラム名、3行目以降がデータとして扱われますが、これらはそれぞれ--column-names-row--data-start-rowオプションで変更可能です。

Options

コマンドラインオプションと対応するGUIでの設定名です。

共通

--engine エンジン

Excel変換エンジンの設定です。

seedtableではxlsxファイルを扱うバックエンドとして複数のライブラリを選択できます。

ライブラリ from (xlsx -> yaml) to (yaml -> xlsx)
OpenXml 速い 行挿入削除×
EPPlus 速い 行挿入削除〇
ClosedXML 遅い 一部数式を含むxlsxはエラー 行挿入削除× スタイルが保存されない

OpenXmlとEPPlusのfrom処理速度はほぼ同じですが、ファイルによって3割程度の速度差がある場合があります。 ClosedXMLはその2倍以上程度の時間がかかります。

xlsx -> yaml (from) 時はOpenXml(デフォルト)かEPPlusがおすすめです。

yaml -> xlsx (to) 時はEPPlus(デフォルト)がおすすめです。

--subdivide yml分割設定

xlsx -> yaml (from) 変換で出力するseedファイルをID単位ごとに分割できます。

分割しておくと、複数人で同時に別のIDのデータを編集してコミットする等の場合に、コンフリクトがおこりにくくなります。

(前削除桁数:)seedテーブル名(:後削除桁数)の形式で指定します。(複数指定はコマンドラインでは,区切り・GUIでは改行区切り)

ID数値の桁を上の方から前削除桁数分、下の方から後削除桁数分削ったものがファイル名として使われます。

例:

指定 存在するID 作られるファイルと含まれるID
table:2 101, 111, 201, 202, 1001, 1002 data1(101, 111), data2(201, 202), data10(1001, 1002)
2:table 10100, 20100, 10200, 20200, 101, 102 data100(10100, 20100), data200(10200, 20200), data1(101), data2(102)
1:table:1 111, 211, 112, 212, 121, 221 data1(111, 211, 112, 212), data2(121, 221)
table:0 1, 2, 3, 10, 11, 12 data1(1), data2(2), data3(3), data10(10), data11(11), data12(12)

テーブル名はワイルドカードで指定できます。

重複する指定がある場合は、通常のテーブル名→ワイルドカードを使ったテーブル名→*の優先順位でマッチします。

yaml -> xlsx (to) 変換においてこの指定は考慮されません。指定にかかわらず自動判定して読み取ります。

--only このテーブルのみ変換

指定テーブルのみ変換します。

上記のsubdivideの設定を同時に記述できます。

--ignore このテーブルを無視

指定テーブルを無視します。

onlyに指定があってもこちらに該当すれば無視されます。

テーブル名はワイルドカードで指定できます。

重複する指定がある場合は、通常のテーブル名→ワイルドカードを使ったテーブル名→*の優先順位でマッチします。

--mapping ymlとシート名の対応

ymlファイル名とxlsxのシート名が同一でない場合の対応を指定します。

(ymlファイル名):(xlsxシート名)の形式で指定します。(複数指定はコマンドラインでは,区切り・GUIでは改行区切り)

この指定がある場合、--subdivide、--only、--ignoreはxlsxシート名ではなくymlファイル名側での指定となりますのでご注意下さい。

xlsxのシート名31文字上限に引っかかった場合などにご利用下さい。

--yaml-columns YAML扱いするカラム

指定のカラム値をYAMLとして取り扱います。

例えばdata_yamlカラムを--yaml-columnsに指定すると下記のような変換が行われます。

xlsx:

id data_yaml
1 [ 1, 2 ]

yaml:

data1:
  id: 1
  data_yaml:
    - 1
    - 2

yaml -> xlsx (to) 処理においてこの指定は考慮されません。指定にかかわらず自動判定して読み取ります。

--ignore-columns このカラム名を無視

指定されたカラム名を無視して入出力します。

例えば関連テーブル情報カラムをymlには出したくない時などに使えます。

例: --ignore-columns dummyを指定してdummyカラムに参照情報を出す

A B C D
1 ID Foo Fooのname value
2 id foo_id dummy value
3 101 1 =VLOOKUP(B3, foos!$A$1:$B$2, 2) 1
4 102 1 =VLOOKUP(B4, foos!$A$1:$B$2, 2) 2
5 201 2 =VLOOKUP(B5, foos!$A$1:$B$2, 2) 1
6 202 2 =VLOOKUP(B6, foos!$A$1:$B$2, 2) 2

ここに指定が無くても、xlsxシート上に無いカラムは無視されます。

--column-names-row カラム名行

yamlのカラム名と対応するxlsxシート行番号です。デフォルトは2です。

--data-start-row データ開始行

データが開始するxlsxシート行番号です。デフォルトは3です。

--delete 変換元にないデータを削除する

xlsx -> yaml (from) 変換時

subdivide設定がある場合、分割された*.ymlファイルを一旦全部消してから新たに出力します。

yaml -> xlsx (to) 変換時

seedとして読み込んだymlにないIDの行をxlsxシート上から削除します(EPPlusエンジンでのみ動作します)。

--seed-extension seedファイルの拡張子

この拡張子でyamlを入出力します。

--require-version

未実装です。

--version-column

未実装です。

xlsx -> yaml 変換時 (from)

--input

xlsx入力ディレクトリ

--output

yml出力ディレクトリ

yaml -> xlsx 変換時 (to)

--seed-input

yml入力ディレクトリ

--xlsx-input

xlsx入力ディレクトリ

--output

xlsx出力ディレクトリ

--calc-formulas yml→xlsx変換時に数式キャッシュを再計算する

Excelは数式セルの計算結果値をファイルに書き込んでいて、本ソフトも含めて多くのプログラムはセルの値としてその結果値を使っています。

それと同じように数式セルの値を再計算して即値として書き込んでから出力xlsxを保存します。

データ量が多いと処理時間が著しく長くなります。

本ソフトの一般的なユースケースであろう「ymlをxlsxに変換してExcelで編集して再びymlに書き戻す」場合には、 Excelは数式結果値がなくとも再計算してくれますし、保存時点で上記処理が走るので、このオプションを有効にしなくても問題ありません。

しかし本ソフトで出力したxlsxファイルを何らかの理由で直接Excel以外のソフトで扱いたいという場合には、このオプションを有効にしないと数式入りxlsxについて正しく動かないケースがあります。

ただ、一般的にxlsxファイルを扱うよりソースのymlファイルを扱った方がなにかと便利でしょうし、処理時間の問題もあるのでこのオプションを使うケースをそもそもおすすめしません。

Tips

セル範囲指定の制限

EPPlusでA:A等行指定のないセル範囲指定は正しく変換できません。実用範囲でA1:A10000等として下さい。

Contribute

バグ報告や要望等はIssuesにお願いいたします。

プルリクもざっくりお待ちしています。

ただし仕事の合間対応なので反応速度ははやいとは限りません。

Build

seedtable.exe / seedtable-gui.exe

普通にseedtable.slnを開いてnugetパッケージの復元してからビルドすれば通ると思います。

XmSeedtable.exe

Xlib、OpenMotif、libxpm等に依存します。詳細は.travis.ymlなどを参照ください。

git submodule init
git submodule update
nuget restore
cd seedtable-x11
nuget restore

等したのちseedtable-x11/TonNurako/TonNurakoEx/Config.mp3seedtable-x11/TonNurako/TonNurakoEx/Site.mp3へコピーして、include先を適切なパスへ書き換え、seedtable-x11ディレクトリ内でxbuildを叩いてください。

License

このソフトウェアにはApache Licenseのもとで頒布されているソフトウェアOpen-XML-SDKと、LGPLのもとで頒布されているソフトウェアEPPlus、TonNurakoが使われています。

このソフトウェアはMIT Licenseのもとでリリースされています。

About

seed yaml <-> xlsx を相互変換するツール

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 99.0%
  • Other 1.0%