軽量フレームワーク Sinatra その3

おくの@LL部(軽量言語)です。
googleがmotorolaを買収しましたね!
これで、Xoom君の未来も保障されたも同然(?...だといいのですが) 。
まぁ、それはそれ、これはこれ・・・
今回は、バックオフィス機能の作りこみで特に重宝されるであろう。
Excelファイルの取り扱いです。

Sinatraと直接関係無いのでは?と思われるかも知れません。
が、今回は『組み合わせて使ってみる』事を目的としてみます。
Excelファイルのアップロード&DB登録に挑戦します。

私は、ExcelファイルをRubyで取り扱う場合、'spreadsheet' を利用してます。
Windows環境限定なら'win32ole'と'Excel.Application'の組み合わせも便利です。

1.Postするフォーム

最初に、ブラウザからExcelファイルをPostする必要があります。
PostするFormなのですが、Formのenctypeを'multipart/form-data'に設定し
inputタグでは、typeにfileを設定するだけです。
勿論、post先には対応するURLを設定してください。
シンプルなので、HTMLのサンプル引用などは・・・しません!

2-1.Postを受け取る処理

次は、サーバー側でブラウザからPostされたExcelファイルを取得します
Sinatraでは、Postされたファイル名は『params['file'][:filename]』として
ファイルのバイナリデータは『params['file'][:tempfile]』として、設定してくれます。

《 Postを受け取る処理:参考 》
xls = Spreadsheet.open( params['file'][:tempfile], 'rb' )
@columns, @rows = ExcelFile.sheet_to_rowcolumn( xls.worksheet(0) )

2-2.Postを受け取る処理

2-1では、ワークシートの中身をArrayに置き換えて取得していますが
これは、自作のメソッドです。
ここでは、ActiveRecordのExcelファイルクラスに、そのメソッドを追加しています。
ワークシートの行と列のArray化、必要に応じて文字コード変換をしています。
※.文字コードは、内部処理はutf8、ダウンロードを行う場合にはShift_JISで処理する為、変換を想定しておきます。

《 ExcelFileクラス:参考 》
# エクセルファイル
class ExcelFile < ActiveRecord::Base
  # エクセルのシートを、見出し(columns)とデータ行(rows)
  def ExcelFile.sheet_to_rowcolumn( sheet, sjis_encode = false )
    columns = Array.new
    rows    = Array.new
    while true
      break if sheet[ 0, columns.size ].nil?
      columns.push( sheet[ 0, columns.size ].tosjis) if sjis_encode
      columns.push( sheet[ 0, columns.size ]) unless sjis_encode
    end
    
    i = 1
    while true
      break if sheet[ i, 1 ].nil?
      row = Array.new
      for j in 0 .. (columns.size-1)
        row.push('')                    if sheet[ i , j ].nil?
        if sjis_encode
          row.push(sheet[ i , j ].tosjis) unless sheet[ i , j ].nil?
        else
          row.push(sheet[ i , j ]) unless sheet[ i , j ].nil?
        end
      end
      rows.push(row)
      i += 1
    end
    return columns, rows
  end
end

2-3.DBに登録する処理

今回のサンプルでは、大胆にエクセルファイルの内容を
blob形式で、カラム'metadata'に保存してしまいましょう!。
(お仕事の場合には、管理者と相談しましょう!)
ActiveRecordで、操作する場合下記の様になります。

《 ExcelFileのDB登録:参考 》
excel_file = ExcelFile.create( :filename =>params[:file][:filename] )
excel_file.update_attribute( :metadata, params['file'][:tempfile].read )
excel_file.save!

2-4.応答を表示する処理

最後に、ブラウザーへ応答を返します。
Sinatra(ruby)には、現在多種多様なテンプレートエンジンがあるので
好みに合ったエンジンを選んでもらえればいいと思います。
ここでの、表示にはワイルドに(雑?)、erbで出してしまいます。

《 ExcelFileのDB登録:参考 》
erb @columns.inspect + @rows.inspect 

と、このような手順で、Excelファイルのアップロード&Database格納が出来てしまいます。
レッツ!Lightweight Language!

biz-Stream詳細情報  biz-Stream資料請求

超高速!!高機能!! Web帳票ソリューション biz-Stream

オンデマンドかつリアルタイムにビジネスドキュメントを生成する帳票ソリューション