2011-09-12 14 views
5

それは私がそれを初めて実行する必要があるとして、以下のコードは動作します:私は再びそれを実行すると、私のようなより多くのメッセージruby​​ gem "Spreadsheet?"のファイルを閉じるには?

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.スプレッドシートを閉じる。2.スプレッドシートを開いた。

  1. スプレッドシートを閉じることについては、ルビーの宝石のスプレッドシートのドキュメントには何もありません。上記の "book.write"ステートメントの例は、何かがあれば終了します。私の検索と他の場所では、スプレッドシートのxlsファイルを閉じて何も表示されませんでした。
  2. スプレッドシートのドキュメントでは、同じファイルに書き戻すことができると示唆していますが、そうしてはいけないことを示唆しています。それはここの問題ですか?もしそうなら、私は一時的なwksに書いて、名前を変更しますか?
+0

例外をトリガする行はどれですか? –

+1

@AndrewGrimmどうやらそれは3行目で、 "book = spreadsheet.open"から始まります。 – Roy

+0

私は以下のコードを追加しようとしましたが、どちらもうまくいきませんでした。上記と全く同じ結果です。 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

なぜこれで1回以上投票できないのですか?ここで同じ問題を抱えている人たちのために、Carrierwaveを使ってファイルをアップロードしようとしている人と、アップロードされたExcelファイルを読み書きするためにSpreadsheetを使っている人のうち、WIndowsマシンでは、 Windowsがファイルをロックし、 "Errno :: EACCES(Permission denied)"というエラーが出るので、Excelファイルを削除/コピーしようとする前にスプレッドシートを開きます。 –

0

あなたは、ファイルてmanualy閉じることができます: 1)をどこかにこのコードを追加します

module Spreadsheet 
    class Workbook 
    attr_accessor :io 
    end 
end 

2)を単に呼び出します

@book.io.close 

ファイルを閉じる

関連する問題