在coldfusion中更快速地替换电子表格?

时间:2017-09-26 01:17:35

标签: excel coldfusion coldfusion-9

我正在尝试使用coldfusion的spreadsheetaddrows函数创建excel表。因为我正在创建电子表格的表格可能非常大,所以我正在创建块中的excel文件以避免超时服务器。一开始一切正常,但随着过程的继续,它真的变慢了。例如,我正在测试一个有50,000多行和几乎100列的表。五个小时后,excel文件甚至没有达到10,000行。 = T

根据谷歌,似乎spreadsheetaddrows是问题。我有更快更好的方法吗?

<cfloop index="i" from="#start#" to="#end#" step="10">
<!-- variables -->
<cfset plus = #i# + 9>
<cfif #plus# gt #end#>
<cfset plus = #end#>
</cfif>
<!-- /variables -->


<!-- get i to i+9 records -->
<cfquery name="query" datasource="datasource">
    select *
    from ( select a.*, rownum rnum
           from ( select * from table order by id) a
           where rownum <= #plus# 
         )
    where rnum >= #i#
</cfquery>

<cfif it's the first time doing this>
     <!-- import from database query and save as excel sheet -->
    <cfset spreadsheetAddRows(theSheet, query)>

    <cfif reached the end of the query>
    <cfspreadsheet action = "write"
    overwrite = "true"
    filename = "file.xls" 
    name="theSheet"
    >

    </cfif>

<cfelseif 2nd or more time doing this>
    <!-- add  new rows to excel object -->
    <cfset spreadsheetAddRows(temp, query)>

    <!-- overwrite existing xls file with new data -->
    <cfspreadsheet  action="write"
                    overwrite="true"
                    filename="file.xls"
                    name="temp"
    >  
</cfif>

1 个答案:

答案 0 :(得分:0)

我很好奇所以我尝试了另一种方法。下面的代码使用小数据集成功快速地执行。对于你正在做的事情,这可能仍然很慢,它可能会造成java堆空间问题,但它可能值得一试。

首先 - 将您的查询结果放入电子表格中。

<cfquery name="dbdata" datasource="dw">
select query goes here
</cfquery>

<cfspreadsheet action="write" overwrite="yes" query="dbdata" filename="#completeFileName#">

然后阅读该电子表格,执行您必须执行的操作,并更新文件。

<cfscript>
abc = spreadsheetread(completefilename);
spreadsheetsetcellvalue(abc, 'new value', 2, 1);
spreadsheetwrite(abc, completeFileName, true);
</cfscript>

当我在Excel中打开文件时,第1行包含查询结果中的列标题,而单元格A2包含新值&#39;。