首页 > 解决方案 > 是否可以导出数据行,包括每行的图像

问题描述

我有一个 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 都有导出每张单张图像的示例。任何与此有关的事情都会非常有帮助谢谢

标签: ruby-on-railsexcelimagecsvexport

解决方案


所以,这适用于所有面临同样问题或第一次这样做的人。

'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" %>

我希望这对某些人有所帮助。

问候


推荐阅读