2012-03-07 17 views
1

我正嘗試使用roo gem解析XLS文件,而不使用文件上傳插件。不幸的是我無法訪問文件的數據。使用Roo Gem解析Rails中的XLS Spreadsheet

我得到的錯誤:

#<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"} 

我試圖用

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

     rooparse(oo) 
    end 

我也試過PARAMS訪問該文件[:uploadform] [:文件] .read,而params [ :uploadform] [:file]已經可以了,但我認爲.open會是這裏的正確方法!?

你會推薦在這裏使用回形針或carrierwave嗎?

謝謝你的幫助!

回答

2

看看Excel.new的來源,它似乎想要一個文件名,而不是一個文件對象或處理程序。換句話說,它需要將完整路徑(包括文件名)的字符串表示形式分配給要解析的文件。另外,它還檢查文件的擴展名。因此,如果臨時文件不以「.xls」結尾,則需要先重命名該文件。

+3

你可以使用類似'Roo :: Spreadsheet.open(file.path,extension :: xlsx)'強制Roo將文件視爲XLSX,而不管擴展名如何。 – nimrodm 2014-02-05 04:31:50

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 2012-03-07 20:11:29

+0

我上傳時遇到tempfile有無效擴展名(不是.xlsx)的問題,並且此解決方案適用於我。謝謝! – 2015-02-17 02:10:14

相關問題