Go to content Go to navigation Go to search

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” にチェックを入れて有効にします。

あとはプロジェクトのメニューにあらわれた[インポート]を選べばなんとなく使えると思います。

Importer(1)          

さっそく 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のフィールドをマッピングさせてからインポートできます。カスタムフィールドのマッピングも問題なくできます。

 Importer(2)

1回目のインポートの時には全てのフィールドのマッピングを指定してやる必要がありますが、すでに登録済のチケットだけをインポートする場合は、識別に使うユニークなフィールドだけマッピング指定してあげればインポート可能です。

Importer(3)

 

このときは「履歴として使用するフィールド」で指定した内容が 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 String

   strTEXT = 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 を再起動します。

Importer(4)

無事に変更できました。

 

以上でガッツリ一括でインポートできるようになりました。

 

Leave a Reply

関連記事