将Ruby on Rails HTML表导出为.xls文件

我有下面的表格:

<tr> <th colspan = "18"> student info</th> <th colspan="10">class info</th> </tr> <tr> <th colspan="1">First Name</th> <th colspan="1">Middle Name</th> <th colspan="1">Last Name</th> .... </tr> <tr> <td colspan="1"><%= link_to student.first_name,:controller => 'acme_modificationss' , :action=>'profile', :id => student.id %></td> <td colspan="1"><%= student.middle_name %></td> <td colspan="1"><%= student.last_name %></td> <td colspan="1"><%= student.first_name %></td> <td colspan="1"><%=m_first_name%></td> ..... 

我需要将相同的表导出到.xls文件。 所以我给控制器添加了一个新的动作:

  def document_xls .... respond_to do |format| format.xls end end 

然后我添加了document_xls视图:

 <?xml version="1.0"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Worksheet ss:Name="Sheet1"> <Table> <Row> <Cell><Data ss:Type="String">Student Info</Data></Cell> <Cell><Data ss:Type="String">Class info</Data></Cell> .... </Row> <Row> <Cell><Data ss:Type="String">First Name</Data></Cell> <Cell><Data ss:Type="String">Middle Name</Data></Cell> <Cell><Data ss:Type="String">Last Name</Data></Cell> ... 

这将生成一个types为file的文件。 但是我想将这个文件生成为.xls,所以我试图将其添加到我的控制器操作中:

  format.xls{ send_data @students, :type => 'application/vnd.ms-excel', :filename => 'students.xls' } 

但是我得到这个错误:

NoMethodError(未定义的方法`bytesize'为#)

另外,我需要excel表头被合并在多个单元格中,有没有办法做到这一点?

解决这个问题的一个更简单的方法就是将内容发送为HTML。 Excel能够parsing并自行转换,您只需发送正确的标题即可。 首先,让你的表在局部视图中,然后在你的控制器中创build一个像这样的方法:

  def export headers['Content-Type'] = "application/vnd.ms-excel" headers['Content-Disposition'] = 'attachment; filename="report.xls"' headers['Cache-Control'] = '' @data = self.send params[:type] render layout: false end 

第一行输出excel文件,所以,下一行将数据接收types方法的数据接收方法的名称检索您的数据的HTML和Excel视图,并渲染:假向您展示一个空的布局加载您的数据。

在你的路线有点像

 get 'excel/stats/:type', to: 'stats#export', as: 'excel_stat' 

在这个例子中,我们有统计控制器与许多不同types的统计数据,并在您的控制器中的“导出”视图中,您可以呈现像这样的局部视图

export.html.haml:

 = render params[:type]