web-dev-qa-db-fra.com

Comment lire le contenu d'une feuille de calcul Excel avec Ruby?

J'essaie de lire une feuille de calcul Excel avec Ruby, mais ce n'est pas pour en lire le contenu.

C'est mon script

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

Il me donne ce qui suit:

[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

Je dois obtenir le contenu réel du fichier. Qu'est-ce que je fais mal?

14
Pavunkumar

Il ressemble à row, dont la classe est Spreadsheet::Excel::Row est en réalité un Excel Range et qu’il inclut Enumerable ou expose au moins certains comportements énumérables, #each, par exemple.

Donc, vous pourriez réécrire votre script à peu près comme ceci:

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

Notez que j'ai des arguments entre parenthèses, ce qui est généralement recommandé de nos jours, et que j'ai supprimé les points-virgules, qui ne sont pas nécessaires, sauf si vous écrivez plusieurs instructions sur une ligne (ce que vous devriez rarement - sinon jamais - faire).

C'est probablement une réaction d'un script plus volumineux, mais je soulignerai que dans le code, les variables book et sheet1 ne sont pas vraiment nécessaires, et que Spreadsheet#open prend un bloc, une version plus idiomatique de Ruby pourrait ressembler à ceci:

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

Je ne pense pas que vous ayez besoin de parseexcel, mais simplement require 'spreadsheet'

Avez-vous lu le guide , il est super facile à suivre.

4
Bryan Ash

Est-ce un fichier d'une ligne? Si oui vous avez besoin de:

puts row[0];
0
nicholasklick