Coldfusion Excel 导出

问题描述 投票:0回答:1

Coldfusion 相当新。在 Windows Server 2016 Datacenter 3 核/12GB RAM 上运行 CF2021。运行 SQL Server 2012(服务器 2012 R2;3 核/12GB RAM)。这些也是虚拟服务器。使用FW/1; MVC。

我编写的代码用于下载大量数据(165,000 行,34 列/标题)。

在我的代码中,我开始了以下行

theFile=GetDirectoryFromPath(getCurrentTemplatePath()) & "newSpreadsheet.xlsx";

这意味着它正在保存到我的服务器上的“视图”文件夹中(没什么大不了的)。然后我使用

spreadsheetAddColumn(.....)
添加标题,并使用
spreadsheetAddRows(theSheet,#rc.myquery#);
从模型视图中提取查询。我的问题是,有太多数据需要下拉,页面因超时错误而出错。我将下载限制为 25k 条记录,提取这组数据大约需要 14 分钟。我需要弄清楚如何获取一个电子表格中的所有记录,我想做的是运行一项计划任务,以便在停机期间运行它,并在人们开始工作时可以随时下载电子表格。有什么想法可以加快速度和/或不让网站超时吗?

我遇到的另一个问题是我的计划任务没有运行,因为我们的服务器受到 Siteminder 的保护。即使我启用了匿名身份验证,它也要求用户在访问该网站时登录。所以我的计划任务将会运行,但我收到 403 错误。我已经考虑通过我的代码来做到这一点,但没有成功。因此,如果有人对此有任何想法,我将不胜感激。

sql model-view-controller coldfusion cfspreadsheet fw1
1个回答
0
投票

如果这是手动请求而不是计划任务,您应该将计划任务问题作为单独的问题发布,以便人们相应地定位他们的答案。

出于安全原因,您永远不应该在可公开访问的文件夹中创建文件。

有两个版本这里的要点

此代码需要

<cfquery>
数据集,并将在 CF 服务器的临时文件夹中创建一个唯一命名的文件。您可以传入列标题名称列表作为一个参数以及文件名,该文件名将在创建并呈现给用户后使用。您可以删除切换文件扩展名的代码并仅创建
xlsx
文件。我在一个负载极高的金融应用程序中使用了它。当然,我们将数据请求限制为 30k 行。

您面临的更大问题可能更多是数据库问题。当您直接在 SQL Manager 中运行查询时,该数据生成的速度有多快?在执行计划打开的情况下运行该查询。这应该可以帮助您识别查询中的瓶颈。

<cfcomponent output="false" displayname="Spreadsheet Service">
    <cffunction name="init" access="public" output="false" returntype="SpreadsheetService">
        <cfreturn this />
    </cffunction>

    <cffunction name="createFromQuery" access="public" output="false" returntype="void">
        <cfargument name="data" type="query" required="true" />
        <cfargument name="columnnames" type="string" required="false" default=""
            hint="Comma-delimited List.">
        <cfargument name="downloadName" type="string" required="false" default=""
            hint="Final file name sent to the browser." />
        <cfargument name="xlsx" type="boolean" required="false" default="false"
            hint="File extension is xlsx (true) or xls (false)." />
        <cfargument name="excludeHeaderRow" type="boolean" required="false" default="false"
            hint="Show or hide the column header row." />

        <cfset var config= {
            , filename= getTempDirectory() & createUUID()
            , columnnames= arguments.columnnames
            , excludeHeaderRow= arguments.excludeHeaderRow
            , downloadFilename= arguments.downloadName
            } />

        <cfif arguments.xlsx>
            <cfset config.fullname &="xlsx">
            <cfif len(config.downloadName) GT 0>
                <cfset config.downloadFilename &="xlsx">
            </cfif>
            <cfelse>
            <cfset config.fullname &="xls">
            <cfif len(config.downloadName) GT 0>
                <cfset config.downloadFilename &="xls">
            </cfif>
        </cfif>

        <cfset config.full_temp_name= config.temp_path & config.temp_name & "." & config.extension />

        <cftry>
            <cfspreadsheet action="write"
                filename="#config.filename#"
                columnnames="#arguments.columnnames#"
                excludeHeaderRow="#arguments.excludeHeaderRow#"
                query="#arguments.data#" />
            <cfspreadsheet action="read" src="#config.filename#" name="local.xls" />
            <cffile action="delete" file="#config.filename#" />

            <cfif len(arguments.downloadName) GT 0>
                <cfheader name="content-disposition"
                    value="attachment; filename=#config.downloadFilename#" />
                <cfelse>
                <cfheader name="content-disposition" value="attachment; filename=#config.filename#" />
            </cfif>
            <cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(local.xls)#"
                reset="true" />
            <cfcatch type="any">
                <cfdump var="#cfcatch#" output="console" />
            </cfcatch>
        </cftry>
    </cffunction>
</cfcomponent>
© www.soinside.com 2019 - 2024. All rights reserved.