2012-03-07 14 views
1

ファイルアップロードプラグインを使用せずに、roo gemでXLSファイルを解析しようとしています。残念ながら、私はファイルのデータにアクセスすることはできません。Roo Gemを使用したRailsでのXLSスプレッドシートの解析

私はエラーを取得する:

#<File:0x007ffac2282250> is not an Excel file 

だからカンガルーは、Excelファイルとして認識されていません。 rooを使用するためにファイルをローカルに保存する必要がありますか、それを回避する手段がありますか? Excelファイルのデータを直接データベースに解析したいと思います。

て来ているのparams:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"yLqOpSK981tDNYjKSoWBh0VnFEKSk0XA/wOt3r+yWJc=", "uploadform"=>{"name"=>"xls", "file"=>#<ActionDispatch::Http::UploadedFile:0x007ffac22b6550 @original_filename="cities2.xls", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"uploadform[file]\"; filename=\"cities2.xls\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/qn/70msrkt90pd390sdr14_0g2m0000gn/T/RackMultipart20120306-3729-1m2xcsp>>}, "commit"=>"Save Uploadform"} 

私はまたのparamsを試してみました

if params[:uploadform][:file].original_filename =~ /.*\.xls$/i 
     oo = Excel.new(params[:uploadform][:file].open) 

     rooparse(oo) 
    end 

でファイルにアクセスしようとしています[:uploadform] [:ファイル] .readとのparamsを[ :uploadform] [:file]既に、私は.openがここの正しい方法だろうと思っています!

ここでペーパークリップや搬送波の使用をお勧めしますか?

ありがとうございました!

答えて

2

Excel.newのソースを見ると、FileオブジェクトではなくFileオブジェクトであると思われます。言い換えれば、解析するファイルに対して、filenameを含む完全パスの文字列表現が必要です。また、ファイルの拡張子をチェックします。したがって、一時ファイルが ".xls"で終わらない場合は、まずファイルの名前を変更する必要があります。

+3

'Roo :: Spreadsheet.open(file.path、extension::xlsx)'のようなものを使って、Rooが拡張子にかかわらずファイルをXLSXとして扱うことができます。 – nimrodm

5

はい、私はまだ完全なファイルを解析できませんが、それは別の問題です。少なくとも私はテーブルからデータベースに次の行を入れています:

require 'fileutils' 
require 'iconv' 

tmp = params[:uploadform][:file].tempfile 
file = File.join("public", params[:uploadform][:file].original_filename) 
FileUtils.cp tmp.path, file 

oo = Excel.new(file) 

rooparse(oo) 
FileUtils.rm file 

ありがとうございました!

+0

これは、このコードを使ってシート全体に対して動作します。私はちょうど私のrooparseメソッドに無関係なエラーがありました。 – Fabian

+0

アップロード時に無効な拡張子(.xlsxではありません)を持つ一時ファイルに問題があります。この解決策は私には役に立ちます。ありがとう! –

関連する問題