【问题标题】:Parsing XLS Spreadsheet in Rails using Roo Gem使用 Roo Gem 在 Rails 中解析 XLS 电子表格
【发布时间】:2012-03-24 15:58:32
【问题描述】:

我正在尝试使用 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 在这里是正确的方法!?

你会推荐在这里使用回形针或载波吗?

感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 gem


    【解决方案1】:

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

    【讨论】:

    • 您可以使用 Roo::Spreadsheet.open(file.path, extension: :xlsx) 之类的东西来强制 Roo 将文件视为 XLSX,而不管扩展名如何。
    【解决方案2】:

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

    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
    

    感谢您的意见!

    【讨论】:

    • 它肯定适用于使用此代码的整个工作表。我的 rooparse 方法出现了一个不相关的错误。
    • 我在上传临时文件时遇到了扩展名无效(不是 .xlsx)的问题,这个解决方案对我有用。谢谢!
    【解决方案3】:

    这是路径:

    params[:file].tempfile.path.
    

    你可以试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多