簡體   English   中英

簡單電子表格無法在ruby上正確加載xls文件,但是在irb上可以正常工作

[英]simple-spreadsheet not properly loading an xls file on ruby, but working properly on irb

我目前正在嘗試使用ruby 2.1.1打開並解析此xls文件 最簡單的方法是使用簡單電子表格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時,會發生相同的行為(這是意料之中的,因為簡單電子表格使用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張,還印有5張。 該行下方的每個單元格返回nil; 他們實際上停止在該特定行之后解析文件。

所以這是我的問題:拳頭,為什么irb的行為不同於紅寶石? 其次,為什么所有這些gem都不加載整個電子表格? 第三,我該如何解決?

謝謝你的幫助

這是我見過的最奇怪的問題之一。 要回答您的問題:

首先,為什么irb的行為不同於紅寶石?

IRB是用ruby編寫的工具,與直接執行ruby不同。 主要區別之一是IRB具有可在啟動時設置的不同選項。 您可以在source中看到不同的標志,並且此頁面對這些標志的含義有一些很好的描述。

您看到的不一致的--noinspect--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%的解釋足夠好。 簡而言之,您提到的所有寶石都依賴於spreadsheet寶石。 在此特定設置中,該寶石的古怪/錯誤之一(我認為它的設計目的並非總是這樣),似乎是它依賴於inspect方法。 如果您在工作表上調用inspect ,則與不調用它相比,它保留的值更多。 這就是說,如果您不調用inspect只是讀取文件的一部分(或者不知道其中的一部分而忽略其余部分,我不確定),但是如果您調用call inspect它將完全讀取文件。

第三,我該如何解決?

正如我之前提到的,手動調用inspect應該讀取整個文件:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM