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

时间:2015-11-28 10:24:08

标签: ruby-on-rails ruby excel html-table 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>
...

这会生成一个带有类型文件的文件。但我想生成此文件为.xls,所以我尝试将其添加到我的控制器操作:

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

但我收到了这个错误:

  

NoMethodError(未定义的方法`bytesize&#39; for#)

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

1 个答案:

答案 0 :(得分:2)

解决此问题的一种更简单方法是将内容作为HTML发送到Excel。 Excel能够解析它并由他自己转换,你只需要发送正确的标题。首先,让你的表在局部视图中,然后,在你的控制器中创建一个这样的方法:

  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

3个第一行导出excel文件,因此,下一行发送接收类似方法的数据将检索数据的方法的名称转换为html和excel视图,并渲染:false显示一个空布局jus加载你的数据

在您的路线中

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

在这个例子中,我们有统计控制器,它有许多不同类型的统计数据,并且在视图中导出&#39;在您的控制器中,您可以像这样呈现部分视图

export.html.haml:

= render params[:type]