Redmine に Excel からインポートしてみた
5月 29th, 2010 by mattari
なんだかんだいってまだまだ Excel ファイルを使って問題点一覧をやりとりするケースがあるので、CSV 経由で Excel を一括でインポートしてみました。
使ったのは、Redmine CSV Import Plugin です。
redmine_importer のインストール
まずは前提として必要な fastercsv を gem でインストールします。
C:\> cd cd C:\Program Files\BitNami Redmine Stack\apps\ruby\bin
C:\Program Files\BitNami Redmine Stack\apps\ruby\bin>gem install fastercsv
次に redmine_importer ですが、配布サイトの “Download” から取得すると Redmine 0.8.x用の古いバージョンになってしまうので、gitHub から最新版を直接インストールします。
http://github.com/rchady/redmine_importer/tree/
C:\> cd C:\Program Files\BitNami Redmine Stack\apps\redmine\vendor\plugins
C:\Program Files\BitNami Redmine Stack\apps\redmine\vendor\plugins>..\..\..\..\git\bin\git clone git://github.com/rchady/redmine_importer.git
ただし、上記には日本語のロケールが含まれていませんので、以下から lang/ja.yml だけ取得します。
http://github.com/juno/redmine_importer
そのままだと Redmine 0.9.x 系で動作しませんので、ja.yml を少し修正します。
ja: ← 1行目に追加
label_import: "インポート"label_issue_importer: "チケットインポーター"
:
↑ スペース2個ほど全体をインデント
修正した ja.yml を以下に設置します。
redmine_importer\config\locales\ja.yml
BitNami Redmine Stack を再起動するとインストールは完了です。
簡単な使い方
まずは、プロジェクトの [設定]→[モジュール]で “Importer” にチェックを入れて有効にします。
あとはプロジェクトのメニューにあらわれた[インポート]を選べばなんとなく使えると思います。
さっそく CSV ファイルを選んで [アップロード] するといきなりエラーが。これについては後半で説明します。
FasterCSV::MalformedCSVError in ImporterController#match
Unquoted fields do not allow \r or \n (line 1).
RAILS_ROOT: C:/Program Files/BitNami Redmine Stack/apps/redmine
とか
FasterCSV::MalformedCSVErrorとかIllegal quoting on line 2.
CSVのアップロードがうまくいくと以下のような画面になり、Redmineの項目とCSVのフィールドをマッピングさせてからインポートできます。カスタムフィールドのマッピングも問題なくできます。
1回目のインポートの時には全てのフィールドのマッピングを指定してやる必要がありますが、すでに登録済のチケットだけをインポートする場合は、識別に使うユニークなフィールドだけマッピング指定してあげればインポート可能です。
このときは「履歴として使用するフィールド」で指定した内容が Redmine のチケットの履歴に追記されていきます。初回のインポート時にはこれを指定しても履歴には反映されません。まあ、初回なので履歴は無しってことでしょうか。
Redmineにインポートできる CSV の作成
インポートする CSV は、各フィールドが “” 等で囲まれていなければなりません。さきほどのエラーは、フィールドの囲み文字が正しく対応付けられていなかったり、区切り文字の前後にスペースがあったりした場合に表示されます。
Excel から CVS で保存すると囲み文字はついていませんので、さきほどのエラーが發生します。
そこで「Excel でお仕事」さんで紹介されている「自由設定のCSVファイル」に少し手を加えて使わせていただくことにしました。基本的な使い方は「Excel でお仕事」さんのページを参照してください。感謝です。
redmine_importer で使えるようにするには次の修正を行います。
- UTF8 + LF で保存する
- 囲み文字を変更する
- 本文中の囲み文字をエスケープをする
UTF8 + LF で保存する
ファイル操作を StreamObject に変更します。
67行目~ Stream の宣言
Sub WRITE_CSVFile4(Optional SH As Worksheet)
Dim TS As Object ‘ StreamObject
Dim strFILENAME As String ‘ 出力ファイル名Dim vntFILENAME As Variant ‘ 出力ファイル名指定
Dim GYO As Long ‘ 収容するセルの行
Dim GYOMAX As Long ‘ データが収容された最終行
Dim strREC As String ‘ 出力レコード(見出し編集用)
Dim COL As Long ‘ カラム(見出し編集用)
Dim strDC As String ‘ 囲い文字(見出し編集用)
Dim byteData() As Byte ‘ BOM用バイト
93行目~ Streamで Open するように変更
Set TS = CreateObject("ADODB.Stream")
With TS.Open
.Charset = "UTF-8"
.LineSeparator = adLF
End With
116行目~ Stream の書き出し
Do Until GYO > GYOMAX
‘ レコードを出力(REC編集処理より受け取る)TS.WriteText FP_EDIT_CSVREC(SH, GYO), adWriteLine
122行目~ Stream のクローズ
‘ 先頭のBOMを取って指定ファイルをCLOSE
With TS.Position = 0
.Type = adTypeBinary
.Position = 3
byteData = .Read
.Position = 0
.Type = adTypeBinary
.Write byteData
.SaveToFile strFILENAME, adSaveCreateOverWrite
.Close
End With
Set TS = Nothing
囲み文字を変更する
Redmineの場合、CSVフィールド中に “(ダブルクォート)が出てくるケースが多そうなので、あまり使われなさそうな ~(半角チルト) に変更します。
55行目~
Private Const g_cnsDQ = "~"
Private Const g_cnsSQ = "’"
Private Const g_cnsSH = "#"
Private Const g_cnsYEN = "\"
Private Const g_cnsDQALT = "~"
本文中の囲み文字をエスケープする
フィールド本文中に ~(半角チルト)が出てきた場合のガードのため、チルトを全角にエスケープします。
149行目~
Private Function FP_EDIT_COLUMN(SH As Worksheet, GYO As Long, COL As Long) As String
Dim strTEXT As StringstrTEXT = Replace(Trim(SH.Cells(GYO, COL).Value), g_cnsDQ, g_cnsDQALT)
以上で、修正は終わりです。
最後に、redmine_importer のデフォルトの囲み文字は “(クウォート)で、毎回指定するのも面倒なので、デフォルト囲み文字を ~(チルト)に変更してしまいましょう。
redmine_importer\app\views\importer\index.html.erb の以下を修正します。
<p><label><%=l(:label_upload_wrapper)%></label>
<%= text_field_tag "wrapper", ‘~’, {:size => 3, :maxlength => 1}%></p></fieldset>
BitNami を再起動します。
無事に変更できました。
以上でガッツリ一括でインポートできるようになりました。