2011-09-12 32 views
5

Đoạn code dưới đây làm việc như nó nên lần đầu tiên tôi chạy nó:Cách đóng tệp trong đá quý ruby ​​"Bảng tính?"

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' 

Khi tôi chạy nó một lần nữa tôi nhận được nhiều tin nhắn như:

/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' 

này đề nghị với tôi có một vấn đề với hoặc: 1. Đóng bảng tính excel hoặc 2. Viết lại cho cùng bảng tính mà tôi đã mở.

  1. Không có gì trong tài liệu về bảng tính đá quý ruby ​​về việc đóng bảng tính. Ví dụ kết thúc trong câu lệnh "book.write" như trên, nếu có. Tìm kiếm của tôi ở đây và ở nơi khác không có gì đóng lại tệp xls trong bảng tính.
  2. Tài liệu bảng tính đề xuất bạn CÓ THỂ ghi lại vào cùng một tệp nhưng cho thấy có thể bạn không nên. Đó có phải là vấn đề ở đây không? Nếu vậy tôi viết thư cho một wks tạm thời và sau đó đổi tên nó?
+0

Dòng nào kích hoạt ngoại lệ? –

+1

@AndrewGrimm Rõ ràng đó là dòng 3, bắt đầu "book = spreadsheet.open". – Roy

+0

Tôi đã thử thêm mã bên dưới nhưng điều đó không hoạt động. Kết quả chính xác giống như trên. afile = File.open ("/ Users/royclymer/myruby/Weekly Total.xls") afile.close Tôi không thể tìm ra cách định dạng mã ở trên trong bình luận này. – Roy

Trả lời

9

Hãy thử sử dụng cú pháp khối, có vẻ như để làm việc cho tôi:

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

Tại sao tôi không thể bỏ phiếu nhiều hơn một lần về điều này! Với mục đích đưa mọi người đến đây với cùng một vấn đề, hãy để tôi ném một số từ khóa xung quanh: Trong số những người bạn đang cố gắng sử dụng Carrierwave để tải tệp lên và Bảng tính để đọc/ghi tệp excel đã tải lên, xin lưu ý rằng đối với máy WIndows, bạn phải đóng bảng tính trước khi cố gắng xóa/sao chép tệp excel khi Windows khóa tệp và sẽ đưa ra lỗi "Errno :: EACCES (Quyền bị từ chối"). –

0

Bạn có thể đóng tập tin manualy: 1) thêm ở đâu đó mã này:

module Spreadsheet 
    class Workbook 
    attr_accessor :io 
    end 
end 

2) chỉ cần gọi

@book.io.close 

để đóng tệp

Các vấn đề liên quan