You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何重定向至模板并实现该模板的Excel数据下载?

解决Rails中基于模板生成Excel下载的问题

我来帮你搞定这个Excel下载的问题!你之前的代码有几个关键问题,咱们一步步修正:

先说说你现有代码的问题

你用send_data时传了:action:template参数,但这些根本不是send_data的合法选项!send_data需要的是实际的文件内容(字符串/二进制数据),而不是模板路径。另外PDF模板和Excel模板的结构完全不同,直接复用肯定行不通,得专门为Excel准备模板。

方案1:用HTML表格模板快速生成Excel(无需额外gem)

利用Excel能识别HTML表格的特性,快速实现需求:

1. 创建Excel模板

app/views/reversals/目录下新建index.xls.erb模板,用HTML表格组织数据:

<table border="1">
  <thead>
    <tr>
      <th>ID</th>
      <th>创建时间</th>
      <!-- 这里添加你需要展示的其他字段 -->
    </tr>
  </thead>
  <tbody>
    <% @reversals.each do |reversal| %>
      <tr>
        <td><%= reversal.id %></td>
        <td><%= reversal.created_at.strftime('%Y-%m-%d %H:%M') %></td>
        <!-- 填充其他字段数据 -->
      </tr>
    <% end %>
  </tbody>
</table>

2. 修改Controller代码

把原来的download方法改成这样,直接渲染模板并设置下载属性:

def download
  # 优化查询写法,用范围查询更简洁直观
  @reversals = Reversal.where(created_at: params[:start_date]..params[:end_date])
  
  respond_to do |format|
    format.xls do
      # 设置下载文件名和附件属性
      headers['Content-Disposition'] = "attachment; filename=\"estornos.xls\""
      # 渲染指定模板,禁用布局避免混入HTML页面元素
      render template: 'reversals/index', layout: false
    end
  end
end

方案2:用Axlsx生成专业Excel(推荐,支持样式/公式)

如果需要更规范的.xlsx格式,或者要添加单元格样式、公式等高级功能,推荐用axlsx gem:

1. 添加依赖

在Gemfile中加入:

gem 'axlsx'
gem 'axlsx_rails'

然后执行bundle install安装依赖。

2. 创建.xlsx模板

app/views/reversals/目录下新建index.xlsx.axlsx模板:

wb = xlsx_package.workbook
# 添加工作表并命名
wb.add_worksheet(name: 'Estornos') do |sheet|
  # 可选:设置表头样式
  header_style = { bg_color: 'E0E0E0', bold: true, alignment: { horizontal: :center } }
  sheet.add_row ['ID', '创建时间'], style: header_style
  
  # 循环填充数据行
  @reversals.each do |reversal|
    sheet.add_row [reversal.id, reversal.created_at]
  end
end

3. 修改Controller代码

def download
  @reversals = Reversal.where(created_at: params[:start_date]..params[:end_date])
  
  respond_to do |format|
    format.xlsx do
      response.headers['Content-Disposition'] = "attachment; filename=\"estornos.xlsx\""
    end
  end
end

最后检查路由

确保config/routes.rb中有对应的下载路由,比如:

get 'reversals/download', to: 'reversals#download'

这样就能顺利实现基于模板的Excel数据下载啦!

内容的提问来源于stack exchange,提问作者E. D. B.

火山引擎 最新活动