我正在编写一个将某些数据导出到特定格式的Excel文档中的应用程序。我正在使用此文档构建XML电子表格文件(http://msdn.microsoft.com/zh-cn/library/aa140066(v=office.10).aspx#odc_xmlss_x:pagesetup)
到目前为止,一切正常。但是要使其正常工作,我必须在多个字段中使用“ .html_safe”,在这种情况下这很危险,因为要导出的某些字段包含用户输入的数据。
基本上是在您使用的excel单元中获得新行," "
而不是通常的\ n
我目前在erb中使用它:
(为清楚起见,于2014年8月8日编辑)
<% @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”整个字符串?
我强烈建议您使用ERB生成XML格式的Excel文档。
首先,您应该创建一个excel模板。您可以创建仅1行3列的Excel文档,并使用xml格式保存,然后将文件名更改为xxx.erb。
使用模型实例变量更改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
此外,如果要在本地创建文件,而不是从浏览器返回文件。您可以使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句