2011-12-13 14 views
8

Tôi đang phân tích cú pháp tệp Excel và Excelx bằng cách sử dụng đá quý Roo. Nhưng tôi không chắc chắn làm thế nào để viết trong những tập tin đó. Phương pháp set_value(row, column, text) không hoạt động.Viết để xuất sắc các tệp bằng ruby ​​bằng đá quý roo

@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 

Các Thông báo lỗi tôi nhận được là

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

Bạn có thể hiển thị mã đầy đủ của chúng tôi không? Bạn đang áp dụng phương pháp này cho một đối tượng hiện có? – JMax

+0

Tôi đã chỉnh sửa câu hỏi và mã được thêm vào ở trên. –

Trả lời

2

Try 'thiết lập' phương pháp thay vì phương pháp 'set_value' trong Excelx hoặc OpenOffice đối tượng. Để biết thêm, hãy tham khảo API http://rubydoc.info/gems/roo/1.10.1/frames và tôi nghĩ rằng đá quý roo chuyên đọc nội dung excel hơn là viết. Ví dụ bằng cách sử dụng phương thức thiết lập sẽ không lưu lại tệp bảng tính. Nó tiết kiệm trên bộ đệm tôi nghĩ. Hãy thử một số đá quý khác để viết

2

Bạn có thể đặt giá trị của một cột bằng cách đẩy một chuỗi vào cột đó.

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

Đoạn code dưới đây ghi vào một bảng tính

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

Bạn có thể hướng dẫn tôi cách chỉnh sửa XLS bằng đá quý bảng tính hay không và áp dụng định dạng trên đầu trang mà không cần tạo XLS mới. –

+0

Kishore, tôi không nghĩ rằng bạn có thể viết lại cho cùng một xls mà bạn đang mở. Tôi đề nghị tạo một tập tin mới, ngay cả khi nó chỉ là một bản sao của bản gốc. –

+0

Oh cảm ơn tôi đã tiếp cận các gợi ý mà bạn đã có trong đó bao gồm rất nhiều mã hóa. –

2

Không trả lời ở đây thực sự trả lời câu hỏi làm thế nào để làm điều này với Roo, vì vậy tôi sẽ thêm các giải pháp mà tôi chỉ thử nghiệm trong ứng dụng của chúng tôi .

Roo vừa thêm chức năng cho các tế bào chỉnh sửa: https://github.com/roo-rb/roo/blob/master/lib/roo/csv.rb#L42

Bạn có thể sử dụng nó như ví dụ:

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

Ghi chú:

  • Đối số cuối cùng nil không được sử dụng trong hàm nhưng không có mặc định vì vậy nó được yêu cầu.
  • Điều này chỉ được thêm trong phiên bản 2.7.0.
Các vấn đề liên quan