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 № 1Você 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