首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将xlsx文件作为后台保存到Sidekiq中的磁盘

将xlsx文件作为后台保存到Sidekiq中的磁盘
EN

Stack Overflow用户
提问于 2017-06-16 21:39:34
回答 2查看 1.6K关注 0票数 1

我正在尝试用axlsx在后台生成excel文件并保存(Rails4.2)。在axlsx的GitHub页面上,写着As of Rails 4.1 you must use render_to_string to render a mail attachment。但是,它抛出了一个错误NoMethodError: undefined method 'render_to_string' for #<CreateExcelSheetWorker:0x007fbccf51db30>

我的worker类:

代码语言:javascript
复制
class CreateExcelSheetWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence { daily }

  def perform()
    model = SomeModel.where(wanted: true).order(started_at: :desc)
    xlsx = render_to_string handlers: [:axlsx], formats: [:xlsx], template: "template/file", locals: {model: model}
    path = "/tmp/a.xlsx"
    File.open(path, "w+") do |f|
      f.write(xlsx)
    end
  end
end

我不知道如何解决这个问题,感谢任何人的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-16 21:46:07

render_to_string注释用于在actionmailer中使用gem。在任何类型的视图上下文之外,您都必须直接使用xlsx构建器api。如下所示:

代码语言:javascript
复制
package = Axlsx::Package.new do |p|
  p.workbook.add_worksheet(name: "Summary") do |sheet|
    sheet.add_row ["foo", 1]
  end
end

File.write(filename, package.to_stream.read)
票数 4
EN

Stack Overflow用户

发布于 2017-06-19 22:47:42

Sergio的回答是好的。但是,如果您想要使用axlsx_rails模板,您可以使用此示例,它将构建一个假的视图上下文来呈现模板:

代码语言:javascript
复制
require 'abstract_controller'
require 'action_controller'
require 'action_view'
require 'active_record'

# require any helpers
require './app/helpers/application_helper'

# active record only if data is here
require './app/models/widget'
ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: 'db/development.sqlite3'
)

ActionController::Base.prepend_view_path "./app/views/"
# place data in view_assigns
view_assigns = {widgets: Widget.all}
av = ActionView::Base.new(ActionController::Base.view_paths, view_assigns)
av.class_eval do
  # include any needed helpers (for the view)
  include ApplicationHelper
end

# normal render statement
content = av.render template: 'widgets/index.xlsx.axlsx'
# do something with content, such as:
File.open("/tmp/with_runner.xlsx","w+b") {|f| f.puts content }

https://gist.github.com/straydogstudio/dceb775ead81470cea70

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44590732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档