【问题标题】:ColdFusion XLS "Export" and Character EncodingColdFusion XLS“导出”和字符编码
【发布时间】:2009-07-14 20:11:59
【问题描述】:

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

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

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

至于奇怪的字符:

® 变成了 ®

™ 变为 â„¢

' 变成了 '

【问题讨论】:

    标签: excel coldfusion character-encoding


    【解决方案1】:

    我遇到了同样的问题,奇怪的字符 'Â' 出现在我的 Excel 电子表格中,而它在我的 HTML 页面中不存在。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        除了使用 HTML 表格导出之外,您是否可以不导出为 CSV 并在每个项目周围添加“,所以:

        "value1","value2"
        

        您可以使用 Java 字符串缓冲区并像这样创建一个 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>
        

        【讨论】:

        • 虽然我当然可以,但这似乎对最终结果没有任何帮助。也就是说,特殊字符仍然无法正常显示。
        • 不确定它是否有效,但是,可以使用 charsetEncode() 帮助吗?
        【解决方案4】:

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

        仅供参考:CF9 可以使用CFSpreadsheet 导出到 .xle(不仅仅是 csv,真正的 excel 文件!)

        【讨论】:

        • 在发送之前我并没有真正将其写入文件,但我会试一试,看看会发生什么。
        【解决方案5】:

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

        正如其他人所建议的,您可能在 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 标头中的字符集不起作用。但是,添加元标记确实如此。
        【解决方案6】:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 2016-02-17
        • 2017-06-23
        • 2018-06-10
        • 2012-12-19
        • 2014-01-14
        相关资源
        最近更新 更多