Rails 4,将“\ n”replace为“
”,以便在Excel电子表格中使用

我正在编写一个应用程序,将某些数据导出到特定格式的Excel文档中。 我正在使用此文档构buildXML电子表格文件( http://msdn.microsoft.com/zh-cn/library/aa140066(v=office.10).aspx#odc_xmlss_x:pagesetup )

到目前为止这一切工作。 但要得到它的工作,我不得不在几个领域使用“.html_safe”在这种情况下是危险的,因为一些导出的字段包含用户input的数据。

基本上,要在Excel单元格中使用" " 而不是通常的\ n

我目前在我的erb中使用这个:

(为了清晰起见,编辑8/8/2014)

 <% @tickets.each do |t| %> <Row> <Cell ss:StyleID="borders"><Data ss:Type='String'> <%=t.business_impact.gsub("\n","
").html_safe %> </Data></Cell> </Row> <% end %> 

但有没有更好的方法来做到这一点,不会“html_safe”整个string?

我强烈build议您使用ERB生成XML格式的Excel文档。

首先你应该创build一个excel模板。 您可以创build一个只有1行3列的Excel文档,并使用xml格式保存,然后将文件名更改为xxx.erb。

用您的模型实例variables更改erb文件。 我可以在这里给你我的例子:

  <Worksheet ss:Name="sheet1"> <Table> <Column ss:Width="30" /> <Column ss:Width="200" /> <Column ss:Width="300" /> <Column ss:Width="400" /> <Row> <Cell><Data ss:Type="String">C1</Data></Cell> <Cell><Data ss:Type="String">C2</Data></Cell> <Cell><Data ss:Type="String">C3</Data></Cell> </Row> <% @yourmodels.each do |ds| %> <Row> <Cell><Data ss:Type="String"><![CDATA[<%safe_concat ds.c1 %>]]></Data></Cell> <Cell><Data ss:Type="String"><![CDATA[<%safe_concat ds.c2 %>]]></Data></Cell> <Cell><Data ss:Type="String"><![CDATA[<%safe_concat ds.c3 %>]]></Data></Cell> </Row> <% end %> </Table> </Worksheet> 

更新:
参考另外一个关于excel-xml-line-breaks-within-cell-from-php-dom的问题 ,以及文章safebuffers和rails 3.0 。
更新代码<Cell><Data ss:Type="String"><%= ds.c1 %></Data></Cell>
<Cell><Data ss:Type="String"><![CDATA[<%safe_concat ds.c1 %>]]></Data></Cell>

这些代码只是我的示例的一部分,就像其他的HTML模板一样。 不要担心数据中的新行,不需要html_save,它运行良好。

在您的控制器中,您应该添加对xls或xml格式的响应。

 respond_to do |format| format.html # index.html.erb format.xls # index.xls.erb format.xml # index.xml.erb end 

另外如果你想在本地创build一个文件,而不是从浏览器返回一个文件。 你可以使用ERB类的方法如下:

  @yourmodels = ... f = File.new( 'youmodels_out.xml', "w") f_template = File.open( 'template_file_name.erb' ) erb = ERB.new( f_template.read ) f.print erb.result( binding ) f_template.close f.close