4

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

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

4

3 回答 3

8

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

于 2011-01-18T18:36:49.013 回答
4

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

因此,您有两个选择:

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

我将依次介绍每个。

Java 库

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

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

于 2011-01-18T18:41:57.423 回答
0

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

诚然,代码看起来不是最漂亮的,但它确实有效。我怀疑它在移植到 ColdFusion 时会有所提升。

于 2011-07-15T19:12:35.123 回答