/ Escrevendo para arquivos excel em ruby ​​usando roo gem - ruby, ruby ​​- on - rails - 3, excel, spreadsheet

Escrevendo para excel arquivos em ruby ​​usando roo gem-ruby, ruby-on-rails-3, excel, planilha

Estou analisando o arquivo Excel e Excelx usando o gem do Roo. Mas não tenho certeza de como escrever nesses arquivos. set_value(row, column, text) método não está funcionando.

Código

@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

A mensagem de erro que estou recebendo é

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

Respostas:

4 para resposta № 1

Você poderia tentar outra gem especificamente para escrever arquivos XLSX:

(note que estes não escrevem o Excel 97-2004 não-XML XLS)


3 para resposta № 2

Nenhuma resposta aqui realmente responde à pergunta de como fazer isso com o Roo, então adicionarei a solução que acabei de testar em nosso aplicativo.

O Roo recentemente adicionou funcionalidade para edição de células: https://github.com/roo-rb/roo/blob/master/lib/roo/csv.rb#L42

Você pode usá-lo como tal:

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

Notas:

  • O último argumento nil não é usado na função, mas não tem nenhum padrão, por isso é obrigatório.
  • Isso só é adicionado na versão 2.7.0.

2 para resposta № 3

Tente o método "set" em vez do método "set_value" no objeto Excelx ou OpenOffice. Para mais API de referência http://rubydoc.info/gems/roo/1.10.1/frames e eu acho roo gem especializada na leitura do excelconteúdo do que escrever. Por exemplo, usar o método set não será salvo no arquivo de planilha. Isso economiza no buffer eu acho. Tente algumas outras jóias para escrever


2 para resposta № 4

Você pode definir o valor de uma coluna, empurrando uma string para ela.

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

O código abaixo grava em uma planilha

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