使用roo gem写入excel文件

我正在使用Roo gemparsingExcel和Excelx文件。 但是我不确定如何写这些文件。 set_value(row, column, text)方法不起作用。

 @oo = Excelx.new('tes.xlsx') @oo.default_sheet = @oo.sheets.first def return_column keywords = ["website", "url"] keywords.each do |keyword| 1.upto(@oo.last_column) do |n| data = @oo.cell(1, n) return n if data.downcase=~/#{keyword}/i end end end def return_rows n = return_n 2.upto(@oo.last_row) do |row| data = @oo.cell(row, n) stack << data end end def appender @oo.set_value(1,11, "hey") end appender 

我得到的错误消息是

  /.rvm/gems/ruby-1.8.7-p352/gems/roo-1.10.1/lib/roo/generic_spreadsheet.rb:441:in `method_missing': private method `set_value' called for #<Excelx:0x101221f08> (NoMethodError) from /Users/bhushan/.rvm/gems/ruby-1.8.7-p352/gems/roo-1.10.1/lib/roo/excelx.rb:168:in `method_missing' from parser.rb:32:in `appender' from parser.rb:35 

您可以尝试另外一个专门用于编写XLSX文件的gem:

(请注意,这些不会写入Excel 97-2004非XML XLS)

在Excelx或OpenOffice对象中尝试“set”方法而不是“set_value”方法。 更多的请参考API http://rubydoc.info/gems/roo/1.10.1/frames ,我认为roo gem擅长阅读excel内容而不是写作。 例如使用set方法将不会保存回电子表格文件。 它保存在我认为的缓冲区中。 尝试一些其他的gem写作

您可以通过向其中推入一个string来设置列的值。

 sheet.row(0).push 'some value' 

下面的代码写入电子表格

 require 'spreadsheet' class Util::Table < ActiveRecord::Migration def self.create_import_template # create an xls workbook template for data importing based on models in activerecord @format = Spreadsheet::Format.new(:weight => :bold) @template_folder = File.join(Dir.home, 'Dropbox', 'horizon', 'data', 'templates') @template_file = File.join(@template_folder, "data_import_template_#{Time.now.round(3).to_s.chomp(' -0700').gsub(':','-').gsub(' ','_').chop.chop.chop}.xls") @book = Spreadsheet::Workbook.new ActiveRecord::Base.send(:subclasses).each {|model| add_worksheet_to_template(model)} @book.write @template_file end def self.add_worksheet_to_template(model) # create a tab for each model that you wish to import data into write_sheet = @book.create_worksheet :name => model write_sheet.row(0).set_format(0, @format) model.columns.each_with_index do |c,i| column = "" column << "*" unless c.null # indicate required field column << c.name write_sheet.row(0).set_format(i+1, @format) write_sheet.row(0).push column end end end 

在这里没有答案实际上回答了如何与Roo做到这一点的问题,所以我会添加我刚刚在我们的应用程序中testing的解决scheme。

Roo最近添加了编辑单元格的function: https : //github.com/roo-rb/roo/blob/master/lib/roo/csv.rb#L42

你可以像这样使用它:

 sheet.set_value(1, 5, 'TEST', nil) # to set the 1st row, 5th column to the string 'TEST' 

笔记:

  • 最后一个参数nil没有在函数中使用,但没有默认值,所以它是必需的。
  • 这仅在版本2.7.0中添加。