我试图使用roo gem解析XLS文件,而不使用文件上传插件。不幸的是,我无法访问文件的数据。
我收到错误:
#<File:0x007ffac2282250> is not an Excel file
所以roo没有将该文件识别为Excel文件。我是否需要在本地保存文件以使用roo,或者有办法解决这个问题。我想将excel文件的数据直接解析到数据库中。
即将到来的参数:
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] [:file] .read和params [:uploadform] [:file],但我认为.open将是正确的方法!?
你会建议在这里使用paperclip或carrierwave吗?
感谢您的帮助!
答案 0 :(得分: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
感谢您的投入!
答案 1 :(得分:2)
查看Excel.new的来源,似乎它需要文件名,而不是File对象或处理程序。换句话说,它需要将完整路径(包括文件名)的字符串表示形式添加到要解析的文件中。此外,它还会检查文件的扩展名。因此,如果临时文件不以“.xls”结尾,则需要先重命名该文件。
答案 2 :(得分:0)
这是路径:
params[:file].tempfile.path.
你可以试试这个:
Excel.new(params[:uploadform][:file].tempfile.path)