2011-09-12 14 views
5

El siguiente código funciona como debe la primera vez que ejecutarlo:¿Cómo cerrar archivos en la gema de rubí "Hoja de cálculo"?

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' 

Cuando corro de nuevo consigo más mensajes como:

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

Esto me sugiere que hay un problema con ya sea: 1. El cierre de la hoja de cálculo de Excel o 2. Escribo nuevamente en la misma hoja de cálculo que abrí.

  1. no hay nada en la documentación de hoja de cálculo gema de rubíes sobre las hojas de cálculo de cierre. Los ejemplos terminan en la declaración "book.write" como arriba, si hay algo. Mi búsqueda aquí y en otras partes no arrojó nada al cerrar el archivo xls en la hoja de cálculo.
  2. La documentación de la hoja de cálculo sugiere que PUEDE escribir de nuevo en el mismo archivo pero sugiere que quizás no deba hacerlo. ¿Ese es el problema aquí? Si es así, ¿escribo en una semana temporal y luego le cambio el nombre?
+0

¿Qué línea desencadena la excepción? –

+1

@AndrewGrimm Aparentemente es la línea 3, comenzando "book = spreadsheet.open". – Roy

+0

Intenté agregar el código a continuación, pero tampoco funcionó. Exactamente los mismos resultados que arriba. afile = File.open ("/ Users/royclymer/myruby/Weekly Total.xls") afile.close No puedo encontrar la forma de formatear el código anterior en este comentario. – Roy

Respuesta

9

Intente utilizar sintaxis del bloque, parece que funciona para mí:

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

¿Por qué no puedo votar más de una vez sobre esto? Con el objetivo de atraer a la gente aquí con el mismo problema, permítanme lanzar algunas palabras clave: de aquellos de ustedes que intentan usar Carrierwave para cargar archivos y hojas de cálculo para leer/escribir el archivo Excel cargado, tengan en cuenta que para máquinas Windows DEBE cerrar el hoja de cálculo antes de intentar eliminar/copiar el archivo Excel ya que Windows bloquea el archivo y dará un error "Errno :: EACCES (Permiso denegado"). Lo anterior lo soluciona. –

0

Puede cerrar el archivo manualy: 1) añadir algún lugar este código:

module Spreadsheet 
    class Workbook 
    attr_accessor :io 
    end 
end 

2) sólo tiene que llamar

@book.io.close 

para cerrar el archivo

Cuestiones relacionadas