使用ColdFusion导出数十万条记录

时间:2011-01-18 17:30:14

标签: sql excel coldfusion export-to-excel coldfusion-9

使用ColdFusion 9.0.1,我需要将数十万条数据库记录导出到Excel XLSX或CSV(首选XLSX)。这必须按需完成。到目前为止,我已经尝试过使用cfspreadsheet但是当它以XLSX格式导出超过几千行时它会窒息。但是,导出到XLS工作正常(当然有~65,000行限制)。

我有哪些选择可以导出这么多记录?从理论上讲,用户可能需要导出多达一百万条记录。我也在使用SQL Server 2008 R2 - 有没有办法以某种方式将记录导出到那里的文件,然后通过CF将文件发送给用户?我有什么选择?感谢。

3 个答案:

答案 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做,但我不知道。

你有两个选择:

  1. 使用Java库
  2. 使用ColdFusion的fileOpen()fileWrite()fileClose()方法
  3. 我将依次报道每一个。

    Java Libary

    opencsv是我的偏好。这假定您当然知道如何在ColdFusion类路径上设置.jar。如果您这样做,那么使用其API来打开文件并为每一行指定数据是一件大事。这真的很简单。查看其文档以获取示例。

    ColdFusion方法

    预先警告这里有龙

    如果要导出的数字或字符串不包含任何双引号或逗号,则可以执行此操作。如果没有,弄清楚要逃避什么,以及为什么你首先使用图书馆。代码大致如下:

    <!--- 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)

Dustin,我不得不自己调查一下,截至撰写本文时(2011年夏季),POI在生成大文件方面做得很好,但你必须使用xlsx。 3.8 beta源代码附带一个名为“BigGridDemo”的示例,可以非常快速地生成100K,4列工作簿。我修改它以生成300K,125列的纸张,并在大约2分钟内处理它。它在半小时内创建了一个1.6 GB,360万行的工作簿。

当然,代码并不是最漂亮的,但它确实有用。我怀疑在移植到ColdFusion时它会有点漂亮。