【问题标题】:How to read an xlsx or xls file from a URL如何从 URL 读取 xlsx 或 xls 文件
【发布时间】:2013-03-17 12:35:42
【问题描述】:

我正在尝试使用 roo (1.11.0) 从 URL 打开文件

Foobazs-iMac:pipeline foobazlabs$ irb
irb(main):001:0> require 'roo'
require '=> true
irb(main):002:0> require 'open-uri'
=> true
irb(main):003:0> Roo::Excelx.new(open("https://www.filepicker.io/api/file/xPxn6cu3RZuQdgrx4y72"))
NoMethodError: undefined method `start_with?' for #<Tempfile:0x007ffd091d25c8>

但使用 roo 似乎不支持此功能(它只接受路径名)

也不能使用临时文件路径名

irb(main):004:0> t = Tempfile.new('temp.xlsx')
=> #<File:/var/folders/q_/q738l9cj3xl90yfs1g8wc4200000gn/T/temp.xlsx20130317-2753-1p3l5l6>
irb(main):005:0> t.binmode
irb(main):006:0> open("https://www.filepicker.io/api/file/xPxn6cu3RZuQdgrx4y72") { |data| t.write   data.read }
=> 13494
irb(main):007:0> Roo::Excelx.new(t.path)
use Roo::Excelx.new to handle .xlsx spreadsheet files. This has .xlsx20130317-2753-1p3l5l6
TypeError: /var/folders/q_/q738l9cj3xl90yfs1g8wc4200000gn/T/temp.xlsx20130317-2753-1p3l5l6 is not an Excel-xlsx file

我可以为此目的使用任何 Ruby 库/gem 吗?我只需要阅读 xls 和 xlsx 文件。我不需要写。因为我在 Heroku,所以我只能使用 Tempfiles 而不是实际的 Files。

【问题讨论】:

  • 你试过在没有open的情况下传入url吗?根据文档,您应该实例化一个新的 Excel 对象的方式如下:oo = Excel.new("http://www.somedomain.com/simple_spreadsheet.xls")
  • 我通过删除 roo 中对 .xlsx 扩展名的检查来修复它。当然,用例确保它始终是一个 .xlsx 文件,因此它适用于我的情况。

标签: ruby excel xls xlsx open-uri


【解决方案1】:

这可能不是您的想法,但我使用两个包来读取 xls 和 xlsx 文件,这比我想要的更常见。

  • xlsx 中的 read.xlsx 使用 Java,大部分时间都可以使用。我不认为它直接从 url 读取,我通常先下载.file。

  • gdata 中的 read.xls 使用 Perl(如果您使用 Windows,则下载,否则自动),并直接从 url 读取。这是一个从联合国人口预测文件中读取的示例:

    库(“gdata”)
    网址 http://esa.un.org/unpd/wpp/Excel-Data/DB04_Population_ByAgeSex_Annual/WPP2010_DB4_F1B_POPULATION_BY_AGE_BOTH_SEXES_ANNUAL_2011-2100.XLS"
    数据

【讨论】:

    【解决方案2】:

    您可以将RemoteTable 用于 XLSX、XLS、CSV 和其他格式:

    require 'remote_table'
    RemoteTable.new('https://www.filepicker.io/api/file/xPxn6cu3RZuQdgrx4y72', format: :xlsx).each do |row|
      puts row
    end
    

    给你:

    {"Name"=>"Kristina H. Chung", "E-mail"=>"cheenu.madan@gmail.com", "Phone"=>"8032696336.0", "Org"=>"ABCD"}
    {"Name"=>"Paige H. Chen", "E-mail"=>"cheenu.madan@gmail.com", "Phone"=>"7502167067.0", "Org"=>"ABCD"}
    {"Name"=>"Sherri E. Melton", "E-mail"=>"cheenu.madan@gmail.com", "Phone"=>"7044576998.0", "Org"=>"ABCD"}
    {"Name"=>"Gretchen I. Hill", "E-mail"=>"cheenu.madan@gmail.com", "Phone"=>"7967784377.0", "Org"=>"ABCD"}
    {"Name"=>"Karen U. Puckett", "E-mail"=>"cheenu.madan@gmail.com", "Phone"=>"9151299999.0", "Org"=>"ABCD"}
    [...]
    

    【讨论】:

      【解决方案3】:

      通过向路径添加额外的to_s 字符串转换,我能够解决 NoMethod 错误(未定义方法 start_with?):

      Roo::Excelx.new(path.to_s)
      

      在我的情况下,它是一个上传的 Excel 文件,我尝试使用 Roo gem 处理它

      【讨论】:

        【解决方案4】:

        这里没有什么对我有用,但是这个是的(对于 xlsx):

        file =  Roo::Excelx.new(params[:file].path,nil, :ignore)
        

        来自:http://railscasts.com/episodes/396-importing-csv-and-excel?view=asciicast

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-27
          • 1970-01-01
          • 1970-01-01
          • 2017-09-29
          • 1970-01-01
          相关资源
          最近更新 更多