Как закрыть файлы в рубиновом геме "Spreadsheet?" - PullRequest
5 голосов
/ 13 сентября 2011

Приведенный ниже код работает так, как и при первом запуске:

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. Электронная документация предполагает, что вы МОЖЕТЕ записать обратно в тот же файл, но, возможно, не следует Это проблема здесь? Если это так, я пишу на временные WKS, а затем переименовать его?

Ответы [ 2 ]

9 голосов
/ 17 декабря 2011

Попробуйте использовать блочный синтаксис, мне кажется, он работает:

Spreadsheet.open '/Users/me/myruby/Mywks.xls' do |book|
  sheet = book.worksheet 0
  # book should be closed when the block exits
end
0 голосов
/ 13 июля 2012

Вы можете закрыть файл вручную: 1) добавить куда-нибудь этот код:

module Spreadsheet
  class Workbook
    attr_accessor :io
  end
end

2) просто позвоните

@book.io.close

чтобы закрыть файл

...