2010-07-22 14 views
13

Estoy tratando de leer un archivo de hoja de cálculo Excel con Ruby, pero no está leyendo el contenido del archivo.¿Cómo leo el contenido de una hoja de cálculo de Excel con Ruby?

Esta es mi guión

book = Spreadsheet.open 'myexcel.xls'; 
sheet1 = book.worksheet 0 
sheet1.each do |row| 
    puts row.inspect ; 
    puts row.format 2; 
    puts row[1]; 
    exit; 
end 

Se me está dando el siguiente:

[DEPRECATED] By requiring 'parseexcel', 'parseexcel/parseexcel' and/or 
      'parseexcel/parser' you are loading a Compatibility layer which 
      provides a drop-in replacement for the ParseExcel library. This 
      code makes the reading of Spreadsheet documents less efficient and 
      will be removed in Spreadsheet version 1.0.0 

#<Spreadsheet::Excel::Row:0xffffffdbc3e0d2 @worksheet=#<Spreadsheet::Excel::Worksheet:0xb79b8fe0> @outline_level=0 @idx=0 @hidden=false @height= @default_format= @formats= []> 
#<Spreadsheet::Format:0xb79bc8ac> 
nil 

que necesito para obtener el contenido real del archivo. ¿Qué estoy haciendo mal?

+0

Parece que está escribiendo un nuevo código, por lo que le sugiero que siga la advertencia y utilice la biblioteca 'ParseExcel' como se indica. No es que alguna vez haya usado ninguno de ellos, pero construir cosas nuevas sobre la funcionalidad obsoleta me parece una mala idea. –

+0

por qué no muestra el contenido. – Pavunkumar

Respuesta

20

Parece que row, cuya clase es Spreadsheet::Excel::Row es efectivamente un Excel Range y que tampoco incluye Enumerable o al menos expone algunos comportamientos enumerables, #each, por ejemplo.

por lo que podría volver a escribir su guión algo como esto:

require 'spreadsheet'  
book = Spreadsheet.open('myexcel.xls') 
sheet1 = book.worksheet('Sheet1') # can use an index or worksheet name 
sheet1.each do |row| 
    break if row[0].nil? # if first cell empty 
    puts row.join(',') # looks like it calls "to_s" on each cell's Value 
end 

Tenga en cuenta que he parenthesised argumentos, que en general es aconsejable en estos días, y eliminado los puntos y comas, que no son necesarios a menos que' escribiendo múltiples enunciados en una línea (lo cual rara vez debería hacer, si es que lo hace alguna vez).

Es probablemente una resaca de una escritura más grande, pero voy a señalar que en el código dadas las variables book y sheet1 no son realmente necesarios, y que Spreadsheet#open toma un bloque, por lo que una versión más idiomática Rubí podría ser algo como esto:

require 'spreadsheet'  
Spreadsheet.open('MyTestSheet.xls') do |book| 
    book.worksheet('Sheet1').each do |row| 
    break if row[0].nil? 
    puts row.join(',') 
    end 
end 
+0

¿Puedes decirme cómo contar el número de filas de una hoja de Excel? – khan

0

¿Es un archivo de una línea? Si lo que necesita:

puts row[0]; 
+0

Es un archivo de 1000 líneas ... Acabo de verificar el primer registro ... – Pavunkumar

4

no creo que necesita para requerir ParseExcel, simplemente require 'spreadsheet'

¿Ha leído el guide, es muy fácil de seguir.

+0

El enlace no funciona. –

+1

Actualicé el enlace para señalar a GitHub. Parece que Rubyforge está caído en el momento –

Cuestiones relacionadas