Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单电子表格无法在ruby上正确加载xls文件,但可以在irb上正常工作_Ruby_Excel_Rubygems_Spreadsheet_Irb - Fatal编程技术网

简单电子表格无法在ruby上正确加载xls文件,但可以在irb上正常工作

简单电子表格无法在ruby上正确加载xls文件,但可以在irb上正常工作,ruby,excel,rubygems,spreadsheet,irb,Ruby,Excel,Rubygems,Spreadsheet,Irb,我目前正在尝试使用ruby 2.1.1打开和解析。简单的方法是使用简单的电子表格gem,它似乎不能正确地用于此特定的电子表格(以及其他一些电子表格): 然而,当我复制并粘贴这个精确的代码到irb中时,我得到了正确的答案 2.1.1 :001 > require 'simple-spreadsheet' => true 2.1.1 :002 > s=SimpleSpreadsheet::Workbook.read('151.xls') => #prints the e

我目前正在尝试使用ruby 2.1.1打开和解析。简单的方法是使用简单的电子表格gem,它似乎不能正确地用于此特定的电子表格(以及其他一些电子表格):

然而,当我复制并粘贴这个精确的代码到irb中时,我得到了正确的答案

2.1.1 :001 > require 'simple-spreadsheet'
 => true 
2.1.1 :002 > s=SimpleSpreadsheet::Workbook.read('151.xls')
 => #prints the entire contents of the spreadsheet
2.1.1 :003 > s.last_row
 => 154
使用Roo时会出现相同的行为(这是意料之中的,因为简单电子表格使用Roo打开.xls文件):

在irb期间

2.1.1 :001 > require 'simple-spreadsheet'
 => true 
2.1.1 :002 > s=Roo::Excel.new('151.xls')
 => #prints the entire contents of the spreadsheet
2.1.1 :003 > s.last_row
 => 154
进一步挖掘,我尝试使用电子表格,因为它是Roo的excel.rb文件所必需的:

require 'spreadsheet'    
Spreadsheet.open('151.xls') do |book|
  rows=0
  book.worksheet(0).each do |row|
    rows+=1
  end
  puts rows#prints 5
end
然而,这就是它变得奇怪的地方(呃);当我将最后一个代码复制并粘贴到irb中时,我得到

2.1.1 :001 > require 'spreadsheet'    
 => true 
2.1.1 :002 > Spreadsheet.open('152.xls') do |book|
2.1.1 :003 >       rows=0
2.1.1 :004?>     book.worksheet(0).each do |row|
2.1.1 :005 >           rows+=1
2.1.1 :006?>       end
2.1.1 :007?>     puts rows
2.1.1 :008?>   end
5
 => nil 
我应该补充一点,宝石不仅仅是印刷5;该行下面的每个单元格都返回nil;在这一行之后,它们实际上停止了对文件的解析

所以我的问题是:首先,为什么irb的行为与ruby不同?其次,为什么这些gem没有加载整个电子表格?第三,我能做些什么来解决这个问题


谢谢你的帮助

这是我见过的最奇怪的问题之一。回答您的问题:

首先,为什么irb的行为与ruby不同?

IRB是一个用ruby编写的工具,它不同于直接执行ruby。主要区别之一是IRB有不同的选项,可以在启动时设置。您可以在中看到不同的标志,并且对这些标志的含义有一些很好的描述

您看到的不一致的罪魁祸首是
--noinspect
选项,运行
irb--noinspect
,执行您的代码应该会给您带来与运行ruby程序相同的奇怪行为(您只看到5行)。这是因为irb默认对执行的每一行调用inspect,所以当您调用
s=SimpleSpreadsheet::Workbook.read('151.xls')
时,实际上就像在ruby程序中调用它一样:

s = SimpleSpreadsheet::Workbook.read('151.xls')
s.inspect
为什么调用
s.inspect
很重要?继续读

其次,为什么这些gem没有加载整个电子表格?

这是最难回答的问题,我还没有100%地指出,但希望90%的解释足够好。简而言之,您提到的所有gem都依赖于
电子表格
gem。在这个特殊的设置中,gem的一个怪癖/缺陷(我不认为它的设计总是这样)似乎是它依赖于
inspect
方法。如果在工作表上调用
inspect
,则与不调用工作表相比,该工作表保留的值更多。也就是说,如果您不调用
inspect
,它只读取文件的一部分(或者读取其中的一部分,而忽略其余部分,我不确定),但是如果您调用
inspect
,它将完全读取文件

第三,我能做些什么来解决这个问题?

正如我前面提到的,手动调用
inspect
应该读取整个文件:

s = SimpleSpreadsheet::Workbook.read('151.xls')
s.inspect

你能确认你使用的是哪个版本的rubyzip吗?我尝试使用0.9.9,得到的结果与您提到的一致,但只是想确定一下。我注意到最新版本的rubyzip打破了简单的电子表格。我有rubyzip 1.1.2和0.9.9。在读取xlsx文件时,我必须在需要简单电子表格之前添加行“gem'rubyzip',“<1.0.0'”,或者在尝试加载电子表格时脚本中断,但xls文件似乎不是这样。有没有办法检查实际加载了哪个版本的rubyzip?看起来你可以在程序/irb中执行
Gem.loaded_specs['rubyzip'].version
。确保在控制台和irb中运行ruby时,首先执行适当的require(例如-
require'simple spreadsheet'
)simple spreadsheet和roo加载rubyzip 0.9.9。但是,电子表格根本不加载rubyzip。谢谢。我昨天看了这篇文章,它看起来确实是一个非常奇怪的问题,特别是ruby程序和irb行为之间的差异。您是否可以复制一份电子表格,但行数要少一些(比如说20行而不是154行),看看它是否仍然具有相同的行为?如果它仍然只读取前5行,那么拥有一个较小的文件将大大减少调试时间。这太疯狂了,你是怎么知道的?请让我知道,如果你真的指出了这个问题,但它可能与为什么创业板需要这么长时间来阅读电子表格相比,其他类似的大小。我最终用python编写了相同的代码,下载和解析大约50个电子表格需要几秒钟,而ruby只解析一个电子表格需要50秒钟。我应该和电子表格的维护者开一张罚单吗?我最初试着同时调试这两个版本(ruby程序和在irb中运行代码)。这并没有让我有任何进展,所以最终我在研究irb如何工作时幸运了。你是对的,代码似乎很慢,我怀疑这是
电子表格
gem(0.6.5.9)的
简单电子表格
的问题。你可以提交一个问题请求更新它,但由于
简单电子表格
只是引用了其他宝石,我可能会放弃它,转而支持
roo
,它使用了一个更新版本的电子表格。我也看到了你,这是我要建议的另一件事:)
s = SimpleSpreadsheet::Workbook.read('151.xls')
s.inspect
s = SimpleSpreadsheet::Workbook.read('151.xls')
s.inspect