使用ColdFusion 9.0.1,我需要将数十万条数据库记录导出到Excel XLSX或CSV(首选XLSX)。这必须按需完成。到目前为止,我已经尝试过使用cfspreadsheet但是当它以XLSX格式导出超过几千行时它会窒息。但是,导出到XLS工作正常(当然有~65,000行限制)。
我有哪些选择可以导出这么多记录?从理论上讲,用户可能需要导出多达一百万条记录。我也在使用SQL Server 2008 R2 - 有没有办法以某种方式将记录导出到那里的文件,然后通过CF将文件发送给用户?我有什么选择?感谢。
答案 0 :(得分:8)
由于您使用的是SQL Server 2008,因此可以利用SQL Server Reporting Services(SSRS)创建可以通过ColdFusion通过Web服务(或HTTP GET / POST)调用的报告。 SSRS还可以将报告导出为Excel。您需要阅读SSRS才能使其工作,但这很容易做到。
答案 1 :(得分:4)
正如您所发现的,使用ColdFusion的<cfspreadsheet/>
标记执行此操作会失败,因为它会在内存中构建整个文档,从而导致JVM OutOfMemory错误。你需要的是缓冲输出到磁盘的东西,这样你就不会耗尽内存。这表明CSV,它更容易缓冲。我想也有办法用Excel做,但我不知道。
你有两个选择:
fileOpen()
,fileWrite()
,fileClose()
方法我将依次报道每一个。
opencsv是我的偏好。这假定您当然知道如何在ColdFusion类路径上设置.jar。如果您这样做,那么使用其API来打开文件并为每一行指定数据是一件大事。这真的很简单。查看其文档以获取示例。
预先警告这里有龙 。
如果要导出的数字或字符串不包含任何双引号或逗号,则可以执行此操作。如果没有,弄清楚要逃避什么,以及为什么你首先使用图书馆。代码大致如下:
<!--- query to get whatever data you're working with --->
<cfset csvFile = fileOpen(filePath, 'read')>
<cfloop query="yourQuery">
<cfset csvRow = ""><!--- construct a csv row here from the query row --->
<cfset fileWrite(csvFile, csvRow)>
</cfloop>
<cfset fileClose(csvFile)>
如果您使用的查询数据也很大,您可能正在处理嵌套循环以将其分块。
答案 2 :(得分:0)
当然,代码并不是最漂亮的,但它确实有用。我怀疑在移植到ColdFusion时它会有点漂亮。