2011-09-12 12 views
5

Poniższy kod działa tak jak powinien po raz pierwszy go uruchomić:Jak zamknąć pliki w rubinowym klejnocie "Arkusz kalkulacyjny?"

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' 

Kiedy uruchamiam go ponownie uzyskać więcej wiadomości jak:

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

to sugerować dla mnie nie ma problemu z albo: 1. Zamknięcie arkusza kalkulacyjnego Excel lub 2. Ponowne zapisanie tego samego arkusza kalkulacyjnego, który otworzyłem.

  1. W skoroszycie z rubinowym klejnotem nie ma nic na temat zamykania arkuszy kalkulacyjnych. Przykłady kończą się instrukcją "book.write" jak powyżej, jeśli cokolwiek. Moje wyszukiwanie tutaj i gdzie indziej nie przyniosło niczego, co ponownie zamknęłoby plik xls w arkuszu kalkulacyjnym.
  2. Dokumentacja arkusza kalkulacyjnego sugeruje, że możesz odpisać do tego samego pliku, ale sugeruje, że nie powinieneś. Czy to jest problem? Jeśli tak, to mogę napisać do tymczasowego serwisu, a następnie zmienić jego nazwę?
+0

Która linia wyzwala wyjątek? –

+1

@AndrewGrimm Widocznie jest to linia 3, zaczynająca się od "book = spreadsheet.open". – Roy

+0

Próbowałem dodać poniższy kod, ale to też nie zadziałało. Dokładnie takie same wyniki jak powyżej. afile = File.open ("/ Users/royclymer/myruby/Weekly Total.xls") plik afile.close Nie mogę się dowiedzieć, jak sformatować powyższy kod w tym komentarzu. – Roy

Odpowiedz

9

Spróbuj użyć składni bloku, wydaje się działać dla mnie:

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

Dlaczego nie mogę głosować więcej niż jeden raz na ten temat! Aby uzyskać tutaj osoby z tym samym problemem, pozwól mi rzucić kilka słów kluczowych: z tych, którzy próbują użyć Carrierwave do przesłania plików i arkusza kalkulacyjnego, aby odczytać/zapisać przesłany plik excela, należy pamiętać, że w przypadku urządzeń z systemem Windows MUSISZ zamknąć arkusz kalkulacyjny przed próbą usunięcia/skopiowania pliku excel, gdy system Windows zablokuje plik i spowoduje błąd "Errno :: EACCES (odmowa uprawnień"). –

0

Można zamknąć plik recznie: 1) dodać gdzieś ten kod:

module Spreadsheet 
    class Workbook 
    attr_accessor :io 
    end 
end 

2) po prostu zadzwonić

@book.io.close 

do zamknięcia pliku

Powiązane problemy