4

我的 Java EE Web 应用程序使用 XSLT 转换来生成 CSV 报告。如果我将“UTF-16”指定为 XSLT 上的编码(这似乎是处理 XML 中重音字符的唯一方法),那么我会在 CSV 输出的开头得到一个字节顺序标记字符

。理解,这是正确的行为。问题是,如果在 Excel 中打开 CSV(显示为:þÿ),则此 BOM 字符可见,但如果我在适当的文本编辑器中打开它则不可见;)

如何隐藏或省略此字符,使其不可见什么时候在 Excel 中打开文件?

4

2 回答 2

5

您忘记指定正在使用的 XSLT 版本。

如果您使用的是 XSLT 2.0,则可以使用xsl:output元素抑制 BOM。例如...

<xsl:output method="xml" byte-order-mark="no" encoding="UTF-16" indent="yes" omit-xml-declaration="yes" />

如果您使用的是 XSLT 1.0,该怎么办?

这里有两个选项:

  1. 升级到 XSLT 2.0
  2. 将您的 Excel 升级到 2007(请参阅此处了解原因)
于 2012-11-08T22:42:38.777 回答
1

如果您正在编写 CSV 文件,则该方法可能不应该是 Sean B. Durkin 建议的“xml”。

我建议使用此配置来制作可以在 Excel 中正确打开的 CSV

<xsl:output method="text" byte-order-mark="yes" encoding="UTF-16LE" indent="no"/>

使用 XSLT 生成 CSV 时的其他提示:

即使 CSV 表示“逗号分隔值”,您也可以使用 TAB 字符

我发现我分开的数据通常没有制表符,但偶尔会有逗号。

并且<xsl:text>&#xa;</xsl:text>是一种添加换行符的方法。

您可能想要转义您使用的值中出现的换行符,如下所示:

<xsl:value-of select="replace($foo,'\n','\\n')"/>

当然,您会很快注意到,如果您在 Excel 中打开文件,它会变为只读,当您尝试在文件仍处于打开状态时再次生成文件时,这会很麻烦。与大多数文本编辑器不同,它们只是告诉您文件已更改,并提供重新加载它。

-

我意识到这个问题已经过时并得到了回答,但我希望这对未来的人有所帮助。

于 2017-02-04T00:34:11.973 回答