2011-12-13 15 views
8

Sto analizzando file Excel ed Excelx utilizzando la gemma Roo. Ma non sono sicuro di come scrivere in quei file. Il metodo set_value(row, column, text) non funziona.Scrittura di file excel in ruby ​​con roo gemma

Codice

@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 

Il messaggio di errore che sto ricevendo è

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

Potrebbe mostrarci il vostro codice completo? Stai applicando questo metodo a un oggetto esistente? – JMax

+0

Ho modificato la domanda precedente e ho aggiunto il codice. –

risposta

2

Try 'set' metodo al posto di metodo 'SET_VALUE' in Excelx o OpenOffice oggetto. Per ulteriori informazioni, consulta l'API http://rubydoc.info/gems/roo/1.10.1/frames e penso che roo gem sia specializzato nella lettura di contenuti excel rispetto alla scrittura. Ad esempio, l'utilizzo del metodo set non ripristinerà il file del foglio di calcolo. Mi fa risparmiare sul buffer. Prova altre gemme per scrivere

2

Puoi impostare il valore di una colonna spingendo una stringa in esso.

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

Il codice seguente scrive su un foglio di calcolo

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

Puoi guidarmi come modificare un XLS utilizzando il foglio di calcolo e applicare la formattazione senza creare un nuovo XLS. –

+0

Kishore, non penso che tu possa scrivere agli stessi xls che stai aprendo. Suggerisco di creare un nuovo file, anche se è solo una copia dell'originale. –

+0

Oh grazie, mi sono avvicinato al suggerimento che hai dato già che coinvolge molto codice. –

2

Nessun risposte qui in realtà rispondere alla domanda di come fare questo con Roo, quindi dovrò aggiungere la soluzione che ho appena testato nella nostra app .

Roo ha recentemente aggiunto la funzionalità per l'editing delle cellule: https://github.com/roo-rb/roo/blob/master/lib/roo/csv.rb#L42

si può utilizzare come tale:

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

Note:

  • L'ultimo argomento nil non viene utilizzato nella funzione, ma non ha valore predefinito quindi è richiesto.
  • Questo viene aggiunto solo nella versione 2.7.0.
Problemi correlati