2011-12-13 16 views
8

Estoy analizando archivos Excel y Excelx usando Roo gem. Pero no estoy seguro de cómo escribir en esos archivos. set_value(row, column, text) método no funciona.Escribiendo en archivos Excel en ruby ​​usando roo gem

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 

el mensaje de error que estoy recibiendo es

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

¿Podría mostrarnos su código completo? ¿Estás aplicando este método a un objeto existente? – JMax

+0

He editado la pregunta anterior y he añadido el código. –

Respuesta

2

Try 'set' método en lugar de método 'set_value' en Excelx u OpenOffice objeto. Para obtener más información, consulte la API http://rubydoc.info/gems/roo/1.10.1/frames y creo que roo gem se especializa en leer los contenidos de Excel en lugar de escribir. Por ejemplo, usar el método set no se guardará en el archivo de la hoja de cálculo. Se ahorra en el búfer, creo. Pruebe con otras gemas para escribir

2

Puede establecer el valor de una columna insertando una cadena.

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

El código siguiente se escribe en una hoja de cálculo

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 
+0

¿Puede guiarme sobre cómo editar un XLS utilizando una gema de hoja de cálculo y aplicar un formato además de crear un nuevo XLS? –

+0

Kishore, no creo que pueda escribir de nuevo en el mismo xls que está abriendo. Sugiero crear un nuevo archivo, incluso si es solo una copia del original. –

+0

¡Oh, gracias! Abordé la sugerencia que ya me diste y que implica mucha codificación. –

2

No hay respuestas aquí realmente responder a la pregunta de cómo hacer esto con Roo, así que voy a añadir la solución que yo acabo de probar en nuestra aplicación .

Roo recientemente añadido la funcionalidad de las células de personalización: https://github.com/roo-rb/roo/blob/master/lib/roo/csv.rb#L42

Se puede utilizar como tales:

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

Notas:

  • El último argumento nil no se utiliza en la función, pero no tiene ningún valor predeterminado, por lo que es obligatorio.
  • Esto solo se agrega en la versión 2.7.0.
Cuestiones relacionadas