ruby-on-rails - 是否可以导出数据行,包括每行的图像
问题描述
我有一个 Rails 5.2 应用程序。我有一个用户模型,每个用户都有他们的个人资料图片。现在我需要实现的是,我需要在一个 excel/csv 文件中导出多个用户。
一位用户将拥有一行,其中一列包含他们的详细信息。像 ID、姓名、电子邮件、地址、联系人、个人资料图像。
我能够导出除图像之外的所有其他数据。我能够找到一种方法来导出每张纸上的单个图像,但是,我被每行图像所困扰。
目前我已经删除了关于 csv 相关 gem 使用和图像的所有更改,因为我没有得到任何地方
def self.to_csv(options = {})
attributes = %w{id name email address contact}
CSV.generate(options) do |csv|
csv << attributes
User.all.each do |user|
csv << [user.id, user.name, user.email, user.address, user.contact]
end
end
end
我知道我需要像 caxlsx 这样的东西,但仍然一无所知,无法弄清楚如何进行。所有 excel 导出 gem 都有导出每张单张图像的示例。任何与此有关的事情都会非常有帮助谢谢
解决方案
所以,这适用于所有面临同样问题或第一次这样做的人。
我'caxlsx_rails'
用作我的电子表格生成器。
首先,问题我不知道为什么 Windows 10 中的 Microsoft excel 中没有加载图像。我已经在 google sheet 上进行了测试,但这个解决方案正在为它工作。我在 git 上看到了关于此图像未呈现问题的未解决问题。希望它会得到修复。所以我发布了部分有效的解决方案。
在 GemFile
gem 'caxlsx'
gem 'caxlsx_rails'
在控制器中
def export_data
render xlsx: 'export_data', template: 'some_view_path/export_data.xlsx.axlsx',
filename: "data_#{DateTime.now.strftime("%d-%m-%Y")}.xlsx", disposition: 'inline'
end
在视图中,xlsx 的模板
## some_view_path/export_data.xlsx.axlsx
wb = xlsx_package.workbook # create excel book
wb.add_worksheet(name: "Data Sheet Name") do |sheet|
header = wb.styles.add_style({:alignment => {:horizontal => :center, :vertical =>
:center, :wrap_text => true}, :border => { :style => :thin, :color => "000000" }})
border = wb.styles.add_style({:border => { :style => :thin, :color => "000000" }})
align_right = wb.styles.add_style({:alignment => {:horizontal => :right}})
align_left = wb.styles.add_style({:alignment => {:horizontal => :left}})
sheet.add_row
## empty row
sheet.add_row ["Data1", "Data2", "Data3" , "Data4" , "Image"], style: header
Model.all.each do |obj|
row = sheet.add_row [obj.data1, obj.data2, obj.data3, obj.data4], height: 100
index = row.row_index + 1
# this is just to point out where to display image
start_at = "E#{index}"
# image header/column is on E
img = obj.images.first
# if you hae multiple image you can get all and display them accordingly,
# here i am only taking first one, as it satisfies my requirement.
path = ActiveStorage::Blob.service.send(:path_for, img.key)
# getting actual location for activeStorage file,
# if you have image file location, you can point it directly
sheet.add_image(image_src: path, start_at: start_at, width: 100, height: 100)
# adding image
end
end
下载excel文件的按钮
在某些方面
<%= link_to "Export Sample", export_sample_your_controller_path(format: :xlsx), class:
"btn btn-smbtn-primary float-right" %>
我希望这对某些人有所帮助。
问候
推荐阅读
- sql - 减去一小时的结果
- apache2 - 如何修复我的 SSL 配置以使用 Apache 进行本地开发?
- c# - 具有接口属性的 C# 接口实现
- c - 为什么动态分配的int数组在scanf、c语言中使用&?
- shell - ksh %! 是什么意思?语法意思
- python - 如何为数据框中的列创建倒排索引?
- rxjs - 我可以结合可能的(rx)吗?
- android - 找不到适用于 Unity 2019.3 和 Unity 2020.1.0a14 的 Android NDK
- javascript - 如何在 JavaScript 中使用 Hammer.js 插件?
- c# - 尝试添加到实体框架中的父级时,我的子实体为空