cfspreadsheet另存为.csv,Excel表示" FILE.csv的文件格式和扩展名不匹配。"

时间:2016-06-13 17:22:34

标签: coldfusion coldfusion-10 cfml railo cfspreadsheet

我创建了一个冷融合页面,将客户列表从MYSQL输出到CSV文件中,以便轻松上传到SalesForce.com

我可以生成包含所有正确信息的文件。但是,当我尝试用excel打开它时,我收到错误: "' SalesForceDailyLeads-20160613125138.csv'的文件格式和扩展名不匹配。该文件可能已损坏或不安全。除非你相信它的来源,否则不要打开它。你想打开吗?"我可以打开它(excel for MAC),但在我看来,CFSpreadsheet没有创建一个合法的.csv文件,而是制作一个xlsx。

    <cfset FileCSV = "SalesForceDailyLeads-#dateformat(getBatch.BATCH,"yyyymmdd")##timeformat(getBatch.BATCH,"HHmmss")#.csv" >
    <cfset filename = "/SF/#fileCSV#">



    <cfset s = spreadsheetNew() >
    <cfset spreadsheetAddRow(s, "FIRST, LAST, MIDDLE, STREET, CITY, ZIP, STATE")>

    <cfinclude template="SFgetList.cfm">

    <cfset spreadsheetAddRows(s, getList)>

    <cfspreadsheet
        action="write"
        overwrite = "true"
        format ="csv"
        name ="s"
        filename ="#filename#"
        >

如果我制作XLS文件,我没有像使用CSV那样的问题。这是代码,CFSpreadsheet或excel(对于mac)的问题吗?我能解决吗?

2 个答案:

答案 0 :(得分:3)

使用cffile,而不是cfspreadsheet来创建文件。每the documentation

  

cfspreadsheet标记仅写入XLS [X]格式文件。写CSV   文件,将您的数据放入CSV格式的字符串变量并使用   用于在文件中写入变量内容的cffile标记。

答案 1 :(得分:0)

谢谢!当然,在我发布这个之后,我找到了文档并看到我正在使用它并且我使用了CFFILE而不是。我使用了一个我发现的脚本/函数。然而,将查询转换为CSV需要一些工作 - 幸运的是其他人已经做过了。万一有人关心看到它: 我在这里得到了querytoCSV脚本: https://gist.github.com/CreativeNotice/2775372

<cfscript>
        /**
         * queryToCsv
         * Allows us to pass in a query object and returns that data as a CSV.
         * This is a refactor of Ben Nadel's method, http://www.bennadel.com/blog/1239-Updated-Converting-A-ColdFusion-Query-To-CSV-Using-QueryToCSV-.htm
         * @param  {Query}      q               {required}  The cf query object to convert. E.g. pass in: qry.execute().getResult();
         * @param  {Boolean}    hr              {required}  True if we should include a header row in our CSV, defaults to TRUE
         * @param  {String}     d               {required}  Delimiter to use in CSV, defaults to a comma (,)
         * @return {String}                                         CSV content
         */
    public string function queryToCsv(required query q, required boolean hr = true, required string d = ","){



var colNames    = listToArray( lCase(arguments.q.columnlist) );
        var newLine     = (chr(13) & chr(10));
        var buffer      = CreateObject('java','java.lang.StringBuffer').Init();
        // Check if we should include a header row
        if(arguments.hr){
            // append our header row
            buffer.append(
              ArrayToList(colNames,arguments.d) & newLine
            );
        }
        // Loop over query and build csv rows
        for(var i=1; i <= arguments.q.recordcount; i=i+1){
            // this individual row
            var thisRow = [];
            // loop over column list
            for(var j=1; j <= arrayLen(colNames); j=j+1){
                // create our row
                thisRow[j] = replace( replace( arguments.q[colNames[j]][i],',','','all'),'""','""""','all' );
            }
            // Append new row to csv output
            buffer.append(
                JavaCast( 'string', ( ArrayToList( thisRow, arguments.d ) & iif(i < arguments.q.recordcount, "newLine","") ) )
            );
        }
        return buffer.toString();
    };
</cfscript>
<cfinclude template="getDups.cfm">
<cfinclude template="SFgetList.cfm">
<cfset FileCSV = "SalesForceDailyLeads-#dateformat(getBatch.BATCH,"yyyymmdd")##timeformat(getBatch.BATCH,"HHmmss")#.CSV" >
<cfset filename = "/mnt/nas-share/data/feed/SF/#fileCSV#">

<cfset qc = #queryToCsv(getList, false, ",")# >
<cfoutput>#qc#</cfoutput>
<cfset heads= "FIRST, LAST, MIDDLE, STREET, CITY, ZIP, STATE">
>
<cffile
    action = "write"
    file = #filename#
    output = #heads#
    addNewLine = "yes"
    fixnewline = "no">

<cffile
    action = "append"
    file = #filename#
    output = #qc#
    addNewLine = "yes"
    fixnewline = "no">