ColdFusion XLS导出和字符编码

3
我正在使用HTML表格将数据从页面导出到Excel中。在浏览器中表格看起来很好,但是在Excel中特殊字符(如撇号、商标符号等)被错误编码了。如果我在记事本中打开导出的文件并保存为ANSII编码,然后在Excel中打开,一切看起来又正常了。
我尝试使用cfcontent、setencoding和cfpagedirective在ColdFusion中设置页面编码,但迄今为止没有成功。有什么建议吗?
编辑:作为临时解决办法,可以通过将导出的文件保存到磁盘中,然后在记事本中打开并再次保存来删除错误字符。这不是最好的解决方案。
至于奇怪的字符:
® 变成了 ®
™ 变成了 â„¢
’ 变成了 ’
6个回答

2
我遇到了同样的问题,即在我的 Excel 电子表格中出现了奇怪的字符 'Â',而在它来自的 HTML 页面中并没有。只需将 cfcontent 的类型从:<cfcontent type="application/vnd.ms-excel> 更改为:<cfcontent type="application/vnd.ms-excel; charset=windows-1252"> 即可解决此问题。

1

0
不要使用HTML表格导出,你可以导出为CSV文件,并在每个项目周围加上引号,这样做会更好:
"value1","value2"

你可以使用Java的StringBuffer并创建一个类似于以下代码的queryToCSV函数:
<cffunction name="queryToCSV" returntype="string" access="public" output="false">
    <cfargument name="query" type="query" required="true">

    <cfscript>
        var csv = createobject( 'java', 'java.lang.StringBuffer');
        var i = 1;
        var j = 1;
        var cols = "";
        var headers = "";
        var endOfLine = chr(13) & chr(10);
        if (arraylen(arguments) gte 2) headers = arguments[2];
        if (arraylen(arguments) gte 3) cols = arguments[3];
        if (not len( trim( cols ) ) ) cols = query.columnlist;
        if (not len( trim( headers ) ) ) headers = cols;
        headers = listtoarray( headers );
        cols = listtoarray( cols );

        for (i = 1; i lte arraylen( headers ); i = i + 1)
            csv.append( '"' & headers[i] & '",' );
        csv.append( endOfLine );

        for (i = 1; i lte query.recordcount; i= i + 1){
            for (j = 1; j lte arraylen( cols ); j=j + 1){
                if (isNumeric( query[cols[j]][i] ) )
                    csv.append( query[cols[j]][i] & ',' );
                else
                    csv.append( '"' & query[cols[j]][i] & '",' );

            }
            csv.append( endOfLine );
        }
        return csv.toString();
    </cfscript>
</cffunction>

虽然我当然可以这样做,但这似乎对最终结果没有任何帮助。也就是说,特殊字符仍然无法正确显示。 - illvm
不确定是否有效,但是使用charsetEncode()函数能帮助吗? - Ian

0
首先,您要导出的 Excel 版本是什么?低于 2007(或可能是 2003)的版本对除默认字符集(我认为是 cp1252,但我不确定)以外的内容处理非常差。
正如其他人建议的那样,您可能在 cfcontent 中使用了错误的字符集-尝试使用类似以下的内容:
<cfcontent type="application/vnd.ms-excel; charset=windows-1252">

如果这不是正确的字符集,您可以尝试其他一些字符集,例如iso-8859-1或us-ascii。请参见http://livedocs.adobe.com/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=ColdFusion_Documentation&file=00000232.htm获取完整列表。

此外,您可能还想查看cfreport,它可以生成Excel文件。


更改HTTP头中的字符集并没有起作用。然而,添加元标记确实起了作用。 - illvm

0

你试过在CFFile中使用charset="utf-8"吗?如果还是不行,试试charset="windows-1252"

顺便说一下:CF9可以使用CFSpreadsheet导出为.xle文件(不仅仅是csv,真正的Excel文件!)。


我并不是在发送之前将其写入文件,但我会尝试一下,看看会发生什么。 - illvm

-2
这是一个关于编程的问题吗?
至少,您可以像程序员一样提供一些调试信息。忘记撇号,有几个不同的字符可能是您要查找的内容;在Excel中商标符号长什么样子:您看到了0个字符、1个字符还是2个字符?如果不为零,则显示哪些字符?是否可以在公式中使用CODE()函数告诉我们所看到的字符的内部代码?
更新 谢谢您提供关于屏幕上实际出现的有趣字符的信息。基于此,并根据您如何使用记事本解决它,似乎保存的页面已经以UTF-8编码,但Excel显示其好像已经以"ANSI"代码页编码,例如在某些地方使用西欧语言的cp1252。
下一个问题:您如何创建HTML表格?在HTML开头附近应该有类似于charset=UTF-8的内容--您看到了什么?HTML文件保存的扩展名是.htm、.html还是其他?您如何将其导入Excel?使用哪个版本的Excel:2007、2003还是其他?

我认为没有字符集的元标记。我会尝试一下,看看是否有效。目前,HTML表格只是在ColdFusion中生成为普通HTML,然后通过以下方式发送出去: <cfheader name="Content-Disposition" value="attachment; filename=MTR_#fromdate#_to_#todate#.xls"> <cfcontent type="application/vnd.ms-excel">。办公室正在使用Excel 2007来查看它。 - illvm
已添加元标签,现在一切都显示正常了。感谢您的帮助。 - illvm
1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - illvm
1
至少你可以像个程序员一样做... 因为某人没有提供足够的信息而责备他是完全不必要和无益的。如果你需要的是调试信息,只需请求即可。 - Brien Malone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接