おくの@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!