我正在尝试使用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>
答案 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;。