【问题标题】:Is it possible to export data rows including image per row是否可以导出数据行,包括每行的图像
【发布时间】:2021-02-13 10:17:35
【问题描述】:

我有一个 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-rails excel image csv export


    【解决方案1】:

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

    我使用'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" %>
    

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

    问候

    【讨论】:

      猜你喜欢
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      相关资源
      最近更新 更多