今回はSQLiteに保存されているテーブルやレコードをExcelファイルとして保存し、ExcelファイルのデータをSQLiteに変換できるアプリをつくります。おそらく探せば同じようなことができるアプリは探せばあると思うのですが、ブログネタとしてつくってみることにします。誰です?車輪の再発明といっているのは?

まずSQLiteとExcelファイルの読み書きができるようにしなければなりません。C#でこれをやるのであればNugetでSystem.Data.SQLite.CoreとClosedXMLをインストールします。

ExcelファイルからSQLiteに変換する

まずExcelで適当なデータをつくります。そしてこれを読み込んでSQLiteに変換する方法を考えます。

ボタンをクリックしたらダイアログを表示してユーザーがExcelファイルを選択できるようにします。選択できるのは拡張子が.xlsxのものだけです。

Excelファイルを選択したらワークシートの名前を取得して1行目のセルにある文字列をつかってカラムを作成します。そして以降の行をレコードとして読み込みSQLiteに保存します。

まずテーブルを作成するメソッドを示します。引数はSQLiteのファイルがあるパス、テーブル名、カラム名の配列です。テーブルに使用できる文字ですが引用符でくくれば大抵の場合はうまくいきます。また気をつけないといけないのがSQLインジェクション攻撃です。これはエスケープで対応します。

文字列の中のシングルクォーテーション(‘)の前にシングルクォーテーション(‘)を記述することでエスケープ処理ができます。SQLインジェクション攻撃の代表格として ;DELETE FROM users–があります。脆弱性がある場合、usersテーブルを削除されてしまうのですが、こんな名前でも問題なくテーブルを作成してくれます。

ただし”sqlite_sequence”という名前のテーブルは自動的に作成されるので同じ名前のテーブルをつくることはできません。そのため最初のif文で除外しています。

テーブルが生成されたらつぎにレコードを登録していきます。

前提として一番左側の列にはint型のプライマリキーが入力されているものとします。そして一番左側の列でなにも入力されていない行が存在する場合はそれ以降のレコードは存在しないものとします。

取得したワークシートがworksheetに格納されているとして、最初の行を調べてカラム名を取得します。終わったら2行目以降を調べます。

InsertRecordメソッドは引数はSQLiteのファイルがあるパス、テーブル名、カラム名の配列、各レコードのデータの配列です。

まとめるとExcelToSQLiteメソッドは以下のようになります。

SQLiteファイルは実行ファイルがあるフォルダ内にoutputというフォルダを作成してそこに保存します。保存するときのファイル名は他と衝突しないように現在時刻から生成しています。処理が完了したらSQLiteファイルを保存したフォルダを開きます。

SQLiteからExcelファイルに変換する

次にSQLiteからExcelファイルに変換する方法を考えます。SQLiteからテーブル名を取得し、レコードを読み取ってワークシートに追加していく処理を繰り返します。繰り返し処理が完了したらExcelファイルを保存します。そしてファイルが保存されたフォルダを開きます。

これはSQLiteからテーブル名を取得するメソッドです。

SQLiteからレコードを読み取り、ワークシートに追加していきます。

これで実際にExcelファイルを作成して、シートを複数作成します。そしてシート名やヘッダー名、セルに値を入力して実験してみます。;DELETE FROM users–とか`とか”で囲まれた文字”とかいろいろ設定して試してみましたが、うまく動作していることが確認できます。