4

ColdFusion 9.0.1 を使用して、何十万ものデータベース レコードを Excel XLSX または CSV (XLSX を推奨) にエクスポートする必要があります。これはオンデマンドで行う必要があります。これまでのところ、cfspreadsheet を使用してみましたが、XLSX 形式で 2,000 行を超える行をエクスポートすると停止します。ただし、XLS へのエクスポートは正常に機能します (もちろん、最大 65,000 行の制限があります)。

非常に多くのレコードをエクスポートするためのオプションは何ですか? 理論的には、ユーザーは 100 万件ものレコードをエクスポートする必要があります。私も 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でも同様の方法があると思いますが、知りません。

したがって、2 つのオプションがあります。

  1. Java ライブラリを使用する
  2. ColdFusion のfileOpen()fileWrite()fileClose()メソッドを使用する

それぞれを順番に説明します。

Java ライブラリ

私の好みは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)>

作業しているクエリ データも大きい場合は、ネストされたループを処理してチャンクアウトしている可能性があります。

于 2011-01-18T18:41:57.423 に答える
0

ダスティン、私はこれを自分で調査しなければなりませんでした。この記事を書いている時点 (2011 年夏) では、POI は大きなファイルをうまく生成しますが、xlsx を使用する必要があります。3.8 ベータ ソースには、100K の 4 列のワークブックを非常に迅速に生成する「BigGridDemo」という名前のサンプルが付属しています。300K、125 列のシートを生成するように変更したところ、約 2 分で処理されました。1.6 GB、360 万行のワークブックを 30 分強で作成しました。

確かに、コードは見栄えがよくありませんが、機能します。ColdFusion に移植すると、かなり改善されると思います。

于 2011-07-15T19:12:35.123 に答える