使用Roo-Gem在Rails中解析XLS电子表格



我正在尝试在不使用文件上传插件的情况下使用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"rnContent-Type: application/octet-streamrn", @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是正确的方法!?

你会推荐在这里用回形针还是用载波?

谢谢你的帮助!

是的,我还不能解析完整的文件,但这是另一个问题。至少我用以下行将表中的第一行放入数据库:

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

感谢您的投入!

查看Excel.new的源代码,它似乎想要一个文件名,而不是file对象或处理程序。换句话说,它需要到您想要解析的文件的完整路径的字符串表示,包括文件名。此外,它还会检查文件的扩展名。因此,如果临时文件没有以".xls"结尾,则需要首先重命名该文件。

这是路径:

params[:file].tempfile.path.

你可以试试这个:

Excel.new(params[:uploadform][:file].tempfile.path)

最新更新