2011-09-12 46 views
5

下面的代码工作,因为它应该我第一次运行它:如何关闭红宝石宝石中的文件“电子表格?”

require 'rubygems' 
require 'spreadsheet' 
book = Spreadsheet.open '/Users/me/myruby/Mywks.xls' 
sheet = book.worksheet 0 
row = sheet.row(1) 
puts row[1] 
book.write '/Users/me/myruby/Mywks.xls' 

当我再次运行它,我得到更多的信息,如:

/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:1149:in `setup': undefined method `read' for false:FalseClass (NoMethodError) 
    from /Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:121:in `read' 

这个建议我有一个问题要么:1.关闭excel电子表格或2.写回到我打开的同一电子表格。

  1. 在关闭电子表格的ruby gem电子表格文档中没有任何内容。如果有的话,示例以上述“book.write”语句结束。我的搜索这里和其他地方没有任何关闭电子表格中的xls文件。
  2. 电子表格文档建议您可以回写到同一个文件,但建议也许你不应该。这是问题吗?如果是这样,我写入一个临时周,然后重命名它?
+0

哪一行触发异常? –

+1

@AndrewGrimm显然它是第3行,从“book = spreadsheet.open”开始。 – Roy

+0

我试着添加下面的代码,但那也不管用。与上述结果完全相同。 afile = File.open(“/ Users/royclymer/myruby/Weekly Total.xls”) afile.close我无法弄清楚如何格式化上面的代码在这个评论。 – Roy

回答

9

使用块语法尝试,它似乎为我工作:

Spreadsheet.open '/Users/me/myruby/Mywks.xls' do |book| 
    sheet = book.worksheet 0 
    # book should be closed when the block exits 
end 
+0

为什么我不能在此投票超过一次!为了让这里的人遇到同样的问题,请让我抛出一些关键字:在您尝试使用Carrierwave上传文件和Spreadsheet来读取/写入上传的Excel文件的请注意,对于WIndows机器,您必须关闭电子表格在试图删除/复制excel文件之前,因为Windows锁定了该文件并且会给出“Errno :: EACCES(Permission denied)”错误。 –

0

您可以关闭文件manualy: 1)添加某处此代码:

module Spreadsheet 
    class Workbook 
    attr_accessor :io 
    end 
end 

2)简单地调用

@book.io.close 

关闭文件