【发布时间】:2014-04-01 01:52:00
【问题描述】:
我目前正在尝试使用 ruby 2.1.1 打开和解析 this xls file。直接的方法是使用 simple-spreadsheet gem,它似乎不适用于这个特定的电子表格(以及其他一些电子表格):
require 'simple-spreadsheet'
s=SimpleSpreadsheet::Workbook.read('151.xls')
puts s.last_row #prints 5
但是,当我将这个确切的代码复制并粘贴到 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 时会发生相同的行为(这是意料之中的,因为 simple-spreadsheet 使用 Roo 打开 .xls 文件):
require 'roo'
s=Roo::Excel.new('151.xls')
puts s.last_row #prints 5, should print 154
在 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 没有加载整个电子表格?第三,我该怎么做才能解决这个问题?
感谢您的帮助
【问题讨论】:
-
您能确认您使用的是哪个版本的 rubyzip 吗?我正在尝试使用 0.9.9 并获得与您提到的一致的结果,但只是想确定一下。我注意到最新版本的 rubyzip 破坏了简单的电子表格。
-
我有 rubyzip 1.1.2 和 0.9.9。读取 xlsx 文件时,我必须在需要简单电子表格之前添加“gem 'rubyzip', '
-
看起来你可以在程序/irb 中执行
Gem.loaded_specs['rubyzip'].version。确保首先执行适当的要求(例如 -require 'simple-spreadsheet') -
simple-spreadsheet 和 roo 加载 rubyzip 0.9.9,无论是从控制台运行 ruby 还是在 irb 中运行。但是,电子表格根本不加载 rubyzip。
-
谢谢。我昨天看了这个,它看起来确实是一个非常奇怪的问题,尤其是 ruby 程序和 irb 行为之间的差异。您能否制作一份电子表格的副本,但行数更少(比如 20 行而不是 154 行),看看它是否仍然具有相同的行为?如果它仍然只读取前 5 行,那么使用较小的文件将大大减少调试时间。
标签: ruby excel rubygems spreadsheet irb