Запись файлов excel в ruby ​​с использованием roo gem

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

Код

@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

person Bhushan Lodha    schedule 13.12.2011    source источник
comment
Не могли бы вы показать нам свой полный код? Вы применяете этот метод к существующему объекту?   -  person JMax    schedule 14.12.2011
comment
Я отредактировал вопрос выше и добавил код.   -  person Bhushan Lodha    schedule 14.12.2011
comment
вы можете использовать установленные методы, которые предлагают некоторые ответы, но вы сможете сохранить результат только в виде файла CSV, а не в виде файла XLSX, для этого вам нужно использовать альтернативу, такую ​​​​как драгоценный камень rubyXL   -  person peter    schedule 04.09.2019


Ответы (4)


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

Roo недавно добавил функциональность для редактирования ячеек: 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.
person Ryan    schedule 26.05.2017

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

person hariharan kumar    schedule 31.01.2012

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

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
person Aaron Henderson    schedule 15.02.2013
comment
Можете ли вы подсказать мне, как редактировать XLS с помощью гем электронной таблицы и применять форматирование поверх этого, не создавая новый XLS. - person Kishore Vaishnav; 05.03.2015
comment
Kishore, я не думаю, что вы можете написать обратно в тот же xls, который вы открываете. Я предлагаю создать новый файл, даже если это просто копия оригинала. - person Aaron Henderson; 07.03.2015
comment
О, спасибо, я подошел к предложению, которое вы уже дали, которое включает в себя много кодирования. - person Kishore Vaishnav; 07.03.2015

вы можете использовать метод set

sheet.set(row, col, value)
person Mark Nguyen    schedule 22.12.2018