下载excel表格查询结果,无需编写文件coldfusion

时间:2017-06-26 15:27:54

标签: excel coldfusion

我有一个简单的查询,其结果我希望在没有将文件写入磁盘的情况下单击按钮下载到Excel中。我正在做的事情的要点。

<cfquery name="qtest" datasource="xyz">
select a,b,c from table
</cfquery>

<cfspreadsheet action="write" fileName="test.xls" query="the_jobfeed" overwrite=true />
<button>click here </button>

我认为可以将文件写入磁盘。因此我正在做上述事情。但是如何保留Excel工作表上的查询列大小写。

2 个答案:

答案 0 :(得分:4)

这里是SpreadSheetService.cfc的存根,它将查询转换为excel文件,而无需将其写入可通过Web访问的文件夹。

主要功能createFromQuery有3个参数:

  1. 数据(查询对象)
  2. xlsx(boolean,xls [false,default]或xlsx [true])
  3. fileName(字符串,如果为空则使用UUID。)
  4. 此服务使用服务器的临时目录作为创建,编译和读取文件到浏览器的位置。将文件读入内存后,将从临时目录中删除物理文件,以确保没有其他进程可以访问它。

    代码的核心:

    <cftry>
        <cfspreadsheet action="write" filename="#config.full_temp_name#" query="config.q" />
        <cfspreadsheet action="read" src="#config.full_temp_name#" name="local.xls" />
        <cffile action="delete" file="#config.full_temp_name#" />
    
        <cfif len(arguments.fileName) GT 0>
            <cfheader name="content-disposition" value="attachment; filename=#arguments.fileName#.#config.extension#" />
        <cfelse>
            <cfheader name="content-disposition" value="attachment; filename=#config.temp_name#.#config.extension#" />
        </cfif>
        <cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(local.xls)#" reset="true" />
        <cfcatch type="any">
            <cfdump var="#cfcatch#" output="console" />
        </cfcatch>
    </cftry>

    测试代码:

    <cfset oSS = new SpreadsheetService() />
    
    <cfquery name="testData" datasource="{your_dsn}">
        SELECT TOP 100 * FROM dbo.Some_Table ORDER BY id DESC
    </cfquery>
    
    <cfoutput>
        #oSS.createFromQuery(testData, false, "My Safe Excel File")#
    </cfoutput>

答案 1 :(得分:2)

我暂时使用了此代码段的变体:

<cfset sheet = SpreadSheetNew()>
<cfset SpreadsheetAddRow(sheet, "foo,bar")>

<!--- stream it to the browser --->
<cfheader name="Content-Disposition" value="inline; filename=foo.xls">
<cfcontent type="application/vnd.ms-excel" variable="#SpreadSheetReadBinary(sheet)#">