用ColdFusion导出数十万条logging

使用ColdFusion 9.0.1,我需要将数十万条数据库logging导出到Excel XLSX或CSV(首选XLSX)。 这必须按需要完成。 到目前为止,我已经尝试过使用cfspreadsheet,但是在XLSX格式中输出多于几千行时,它会扼杀。 但是,出口到XLS工作正常(当然有一个约65,000行限制)。

我有什么select导出这么多的logging? 理论上用户可能需要输出多达一百万条logging。 我也使用SQL Server 2008 R2 – 有没有办法以某种方式将logging导出到文件,然后通过CF发送文件给用户? 我有什么select? 谢谢。

由于您使用的是SQL Server 2008,因此您可以利用SQL Server Reporting Services(SSRS)并创build一个可以通过ColdFusion的Web服务(或HTTP GET / POST)调用的报告。 SSRS还能够将报告导出为Excel。 你需要阅读SSRS来完成这个工作,但这很容易做到。

正如您发现的那样,使用ColdFusion的<cfspreadsheet/>标记执行此操作会失败,因为它会在内存中构build整个文档,从而导致JVM OutOfMemory错误。 你需要的是缓冲输出到磁盘的东西,所以你不用内存不足。 这表明CSV,这是更容易缓冲。 我想有办法用Excel来做,但我不知道它们。

所以你有两个select:

  1. 使用Java库
  2. 使用ColdFusion的fileOpen() fileWrite()fileClose()fileClose()方法

我将依次介绍每一个。

Java Libary

opencsv是我的首选。 这当然假设你知道如何在ColdFusion类path上设置一个.jar文件。 如果你这样做,那么使用它的API来打开一个文件并为每一行指定数据是一件很重要的事情。 这真的很简单。 检查它的文档的例子。

ColdFusion方法

预先警告这里有龙

如果您要导出不包含任何双引号或逗号的数字或string,则可以执行此操作。 如果不是的话,搞清楚要逃生什么,以及为什么你首先使用图书馆。 代码大致如此:

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

如果你正在使用的查询数据也很大,你可能正在处理一个嵌套的循环来将其分块。

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

当然,代码并不是最漂亮的,但它的工作原理。 我怀疑当移植到ColdFusion时它会变得相当有点。