2011-12-13 2 views
8

Я разбираю файлы Excel и Excelx с использованием драгоценного камня Roo. Но я не уверен, как писать в этих файлах. set_value(row, column, text) способ не работает.Запись в excel файлов в ruby ​​с использованием roo gem

Код

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

Не могли бы вы показать нам свой полный код? Вы применяете этот метод к существующему объекту? – JMax

+0

Я отредактировал этот вопрос и добавил код. –

ответ

4

Вы можете попробовать другой драгоценный камень специально для записи файлов XLSX:

(обратите внимание, что они не пишут Excel 97-2004, не XML XLS)

+0

simple_xlsx_writer теперь выглядит несуществующим. – stimms

2

Try 'набор' метод вместо метода 'set_value' в Excelx или OpenOffice объекта. Для получения дополнительной информации обратитесь к API http://rubydoc.info/gems/roo/1.10.1/frames, и я думаю, что драгоценный камень roo специализируется на чтении превосходного содержимого, чем на записи. Например, использование метода set не будет сохраняться обратно в файл электронной таблицы. Думаю, он сохраняет буфер. Попробуйте другие камни для написания

2

Вы можете установить значение столбца, нажав на него строку.

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

Можете ли вы посоветовать мне, как отредактировать XLS с помощью крупноформатной таблицы и применить форматирование поверх этого без создания нового XLS. –

+0

Kishore, я не думаю, что вы можете написать обратно к тем же XLS, которые вы открываете. Я предлагаю создать новый файл, даже если это всего лишь копия оригинала. –

+0

О, спасибо, я подошел к предложению, которое вы дали уже, что связано с большим количеством кодирования. –

2

Нет ответа здесь на самом деле ответить на вопрос о том, как сделать это с Роо, поэтому я добавлю решение, которое я только что испытанной в нашем приложении ,

Роо недавно добавленные функциональные возможности для редактирования ячеек: 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.
Смежные вопросы