ColdFusion XLS“导出”和字符编码

时间:2009-07-14 20:12:00

标签: excel coldfusion character-encoding

我使用HTML表格将数据从页面“导出”到Excel。该表在浏览器中看起来很好,但在Excel中,特殊字符(如撇号,商标符号等)编码不正确。如果我在记事本中打开导出的文件并将其保存为ANSII编码,然后在Excel中打开它,一切看起来都很好。

我尝试使用cfcontent,setencoding和cfpagedirective在ColdFusion中设置页面编码,但到目前为止没有运气。有什么建议吗?

编辑:作为临时解决方法,可以通过将导出的文件保存到磁盘,在记事本中打开它,然后再次保存来删除错误的字符。不完全是问题的最佳解决方案。

至于奇怪的人物:

®成为®

™成为â€

'成为

6 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我的Excel电子表格中出现了一个奇怪的字符“”,当时它出现在我的HTML页面中。

只需更改cfcontent:<cfcontent type="application/vnd.ms-excel> to: <cfcontent type="application/vnd.ms-excel; charset=windows-1252"> 为我解决了这个问题。

答案 1 :(得分:1)

您是否考虑过使用XML创建speadsheet?它使文件变得更加臃肿,并且当你有10,000+记录时似乎有一些问题。但是,对于中小型数据集,它可以很好地工作,并提供我正在寻找的格式化功能。

http://www.bennadel.com/blog/917-Creating-Excel-Files-With-ColdFusion-XML-And-POI.htm

答案 2 :(得分: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>

答案 3 :(得分:0)

您是否在charset="utf-8"中尝试了CFFile?如果仍然无效,请尝试charset="windows-1252"

仅供参考:CF9可以CFSpreadsheet

导出到.xle(不仅仅是csv,真正的excel文件!)

答案 4 :(得分:0)

首先,您要导出的Excel版本是什么?除了默认字符集(cp1252我相信但是我对此并不是100%肯定)之外,2007年以下(或可能是2003年)的任何事情都是出了名的糟糕处理。

正如其他人所说,你可能在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

另外,您也可以在生成excel文件时签出cfreport。

答案 5 :(得分:-2)

这是一个与编程相关的问题吗?

至少,您可以像程序员一样制作并提供一些调试信息。忘记撇号,你可以指出几个不同的角色;什么应该是商标符号在Excel中看起来像:你会显示0,1或2个字符吗?如果非零,则显示哪些字符?您是否可以在公式中使用CODE()函数告诉我们您看到的字符的内部代码?

更新感谢您了解有关屏幕上实际显示的有趣字符的信息。基于此,以及如何使用记事本设法解决它,似乎已保存的页面已经以UTF-8编码,但Excel正在显示它,好像它是在“ANSI”代码页中编码的,例如, cp1252在使用西欧语言的地方。

下一个问题:你是如何创建HTML表的?在HTML的开头附近应该有类似charset=UTF-8的东西 - 你看到了什么? HTML文件是否已使用.htm,.html或其他内容的扩展名保存?如何将其导入Excel?哪个Excel:2007年,2003年,其他?