代码之家  ›  专栏  ›  技术社区  ›  Pavunkumar

如何使用Ruby读取Excel电子表格的内容?

  •  14
  • Pavunkumar  · 技术社区  · 15 年前

    我试图用Ruby读取Excel电子表格文件,但它没有读取该文件的内容。

    这是我的剧本

    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
    

    它给了我以下信息:

    [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
    

    我需要得到文件的实际内容。我做错什么了?

    3 回复  |  直到 11 年前
        1
  •  21
  •   Mike Woodhouse    15 年前

    看起来像 row ,其类是 Spreadsheet::Excel::Row 实际上是一个Excel Range 它或者包括可枚举的,或者至少暴露了一些可枚举的行为, #each 例如。

    所以你可以这样重写你的脚本:

    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
    

    请注意,我已经用括号括住了这些天通常是可取的论点,并且去掉了分号,这是不必要的,除非你在一行上写了多个语句(如果有的话,你应该很少这样做)。

    这可能是一个更大脚本的遗留问题,但我会在给出 book sheet1 变量不是真正需要的,而且 Spreadsheet#open 采用一个块,因此更惯用的Ruby版本可能如下所示:

    require 'spreadsheet'    
    Spreadsheet.open('MyTestSheet.xls') do |book|
      book.worksheet('Sheet1').each do |row|
        break if row[0].nil?
        puts row.join(',')
      end
    end
    
        2
  •  4
  •   Bryan Ash    11 年前

    我认为你不需要ParseExcel,只要 require 'spreadsheet'

    你读过吗 guide 很容易理解。

        3
  •  0
  •   nicholasklick    15 年前

    是单行文件吗?如果需要的话:

    puts row[0];