7

EDIT3:@Leighの助けを借りて、問題をクエリの日付列に絞り込みました。元のコードセットとPOIを使用すると、SpreadSheetAddRows()が日付のようなセルを含む非常に大きなクエリを追加しようとすると、ページがクラッシュします。ここでバグレポートを作成しました:https ://bugbase.adobe.com/index.cfm?event = bug&id=3432184 。


Spreadhseetオブジェクトに追加しているクエリがありますが、クエリの行数が非常に多い場合(この例では18583)にエラーが発生するようです。正確なエラーは次のとおりです。

java.lang.ArrayIndexOutOfBoundsException: -32735
at java.util.ArrayList.get(ArrayList.java:324)
at org.apache.poi.hssf.model.WorkbookRecordList.get(WorkbookRecordList.j ava:50)
at org.apache.poi.hssf.model.Workbook.getExFormatAt(Workbook.java:787)
at org.apache.poi.hssf.usermodel.HSSFCell.getCellStyle(HSSFCell.java:901 )
at org.apache.poi.hssf.usermodel.HSSFSheet.autoSizeColumn(HSSFSheet.java :1727)
at coldfusion.excel.Excel.autoResize(Excel.java:1246)
at coldfusion.excel.Excel.autoResize(Excel.java:1240)
at coldfusion.excel.Excel.addRows(Excel.java:1214)
at coldfusion.runtime.CFPage.SpreadSheetAddRows(CFPage.java:7089) at coldfusion.runtime.CFPage.SpreadSheetAddRows(CFPage.java:7076)

関連するコードは次のとおりです。

<cfset xls = spreadsheetNew()>
<cfset spreadsheetAddRow(xls, arrayToList( qryTest.getMeta().getColumnLabels() ))>
<cfset SpreadsheetFormatRow(xls, {bold=true,fgcolor="brown",color="white"}, 1)>
<cfset SpreadsheetAddRows(xls, qryTest)>
<cfheader name="Content-Disposition" value="attachment; filename=#filename#">
<cfcontent variable="#spreadsheetReadBinary(xls)#" reset="yes" type="application/vnd.ms-excel">

編集:以前はcfspreadsheetを使用して成功しましたが、ヘッダー付きのスプレッドシートは生成されません(また、提供する一時ファイルを作成する必要があるという欠点もあります)。


EDIT2:@Leighの提案に従って、CF9/libフォルダーのPOIを更新しました。エラーは次のように変更されました。

<cfset SpreadsheetFormatRow(xls, {bold=true,fgcolor="brown",color="white"}, 1)>次のメッセージを表示します。org.apache.poi.hssf.util.HSSFColor.getIndexHash()Ljava / util / Hashtable;

エラーコード:

java.lang.NoSuchMethodError:
org.apache.poi.hssf.util.HSSFColor.getIndexHash()Ljava/util/Hashtable;
at coldfusion.excel.Excel.getHSSFColor(Excel.java:2094)
at coldfusion.excel.Excel.findFont(Excel.java:2237)
at coldfusion.excel.Excel.getCellStyle(Excel.java:2318)
at coldfusion.excel.Excel.formatRow(Excel.java:2948)
at coldfusion.excel.Excel.formatRow(Excel.java:2963)
at coldfusion.excel.Excel.formatRow(Excel.java:2981)
at coldfusion.runtime.CFPage.SpreadSheetFormatRow(CFPage.java:7268)

その行をコメントすると、次のときに再びクラッシュします。 <cfset SpreadsheetAddRows(xls, qryTest)>

エラーコード:

java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook 
at org.apache.poi.hssf.usermodel.HSSFWorkbook.createCellStyle(HSSFWorkbook.java:1120) 
at org.apache.poi.hssf.usermodel.HSSFWorkbook.createCellStyle(HSSFWorkbook.java:73) 
at coldfusion.excel.Excel.addRow(Excel.java:1323)
at coldfusion.excel.Excel.addRows(Excel.java:1203) 
at coldfusion.runtime.CFPage.SpreadSheetAddRows(CFPage.java:7089) 
at coldfusion.runtime.CFPage.SpreadSheetAddRows(CFPage.java:7076) 
4

4 に答える 4

3

CFやJREのバージョンとは全く関係がないのではないかと思います。少なくとも直接ではありません。POIのバグのように聞こえます。

例外を見ると、CFが(クエリデータを追加した後)列のサイズを自動的に変更しようとするPOIメソッドを呼び出すときに問題が発生することが明確に示されています。すばやく検索すると、次のようなArrayIndexOutOfBoundsException同様のエラーのレポートがいくつか見つかりました(ColdFusionについて言及しているだけです)。HSSFSheet.autoSizeColumn

32767を超えるセルを設定した後、列でorg.apache.poi.hssf.usermodel.HSSFSheetとメソッドautosizecolumn(int)を使用しようとすると、ArrayOutOfBoundsExceptionがスローされます。

バグレポートによると、この問題はバージョン3.5に存在しました。これは、ColdFusion 9に含まれているのと同じ(メジャー)バージョンです。POI開発者の1人は、この問題が新しいバージョンで修正されたことを示唆しています。したがって、POIjarを更新してみてください。それとは別に、問題を再現するテストケースをまとめることができる場合は、バグレポートを提出することをお勧めします。

以前はcfspreadsheetを使用して成功しましたが、ヘッダー付きのスプレッドシートは生成されません(また、提供する一時ファイルを作成する必要があるという欠点もあります)。

cfspreadsheetおそらく、列のサイズを自動的に変更しようとしないspreadsheetAddRowsため、エラーは発生しません。したがって、明らかな回避策(そして優れた回避策ではありません)は、列幅のサイズを変更しようとする関数を回避することです。

于 2012-12-18T20:44:02.020 に答える
1

コードから離れて、スローされたエラーを調べるだけで、Javaのドキュメントからこれ を取得できます。これは別のリファレンスです。

配列が不正なインデックスでアクセスされたことを示すためにスローされます。インデックスは負であるか、配列のサイズ以上です。

このエラーは、試行された不正なインデックス値も示しています。-32735

ここでの問題は、ColdFusion関数を使用しているため、コード自体でインデックス値を指定していないことです。その関数(SpreadsheetAddRows)は、クエリ結果を配列に変換してから、それらの各値をExcelスプレッドシートの行に追加しようとしています。基盤となるJavaランタイムを利用してこれらのタスクを実行しているため、エラーが発生します。ですから、あなたが直面しているこの制限に少し立ち往生しているのではないかと思います。あなたのColdFusionインストールが実行しているJREバージョンをアップグレードして、問題が新しいリリースで解決されているかどうかを確認することができます。ColdFusion9にはJava1.6.0_14が付属していると思います。こちらをご覧くださいDOS脆弱性パッチのため、とにかく少なくとも1.6.0_24を実行している必要があります現在は1.6.0_38までのようですが、Adobeのサポートを確認する必要があります。

JREをアップグレードしても問題が解決しない場合は、この問題を回避するためにColdFusionコードを変更する必要があると思います。タグを使用して成功したとCFSpreadSheetおっしゃいました。または、クエリ結果をSpreadsheetAddRows関数に渡すためのさまざまな方法を試してみることができます。(私はあなたがすでにその道を使い果たしたと思いますが。)たぶん、クエリをループして独自の配列を構築するか、クエリをループして一度に1つずつ行を追加します。これは最適ではないかもしれませんが、いくつかの異なる方法を試した後、うまくいけば、行く方法として出てくるでしょう。

また、ColdFusionタグ(バージョン番号なし)を投稿に追加して、さらに注目を集めます。

アップデート

サポートされているColdFusion9のJavaバージョンをフォローアップしたかっただけです。CharlieArehartによるこのブログエントリで、ColdFusionサーバーのJavaアップグレードに関するAdobeのスタンスについて説明しています。これは、マイナーバージョンのアップグレードがサポートされることを示す公式のAdobe投稿にリンクしています。したがって、ColdFusion 9の場合、「将来のすべてのJDK1.6.0_xリリースがサポートされます」。

于 2012-12-18T18:15:14.007 に答える
1

( http://poi.apache.org/spreadsheet/quick-guide.htmlから抽出)

ブック内の一意のフォントの最大数は32767(最大の正のショート)に制限されていることに注意してください。セルごとにフォントを作成するのではなく、アプリケーションでフォントを再利用する必要があります。例:

間違い:

for (int i = 0; i < 10000; i++) {
    Row row = sheet.createRow(i);
    Cell cell = row.createCell((short) 0);

    CellStyle style = workbook.createCellStyle();
    Font font = workbook.createFont();
    font.setBoldweight(Font.BOLDWEIGHT_BOLD);
    style.setFont(font);
    cell.setCellStyle(style);
}

正しい:

CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
style.setFont(font);
for (int i = 0; i < 10000; i++) {
    Row row = sheet.createRow(i);
    Cell cell = row.createCell((short) 0);
    cell.setCellStyle(style);
}

とにかく、これも試すことができます:

org.apache.poi.hssf.usermodel.HSSFOptimiser.optimiseCellStyles(HSSFWorkbook)
于 2014-12-04T18:35:57.830 に答える
0

配列に関する私の経験では、OutOfBounds例外が発生した場合、それは通常、配列を「オーバーラン」したためです。つまり、インデックス内のアイテムの総数より1つ多くループしました。これは通常、配列が0で始まる場合、配列の長さ-1にのみループする必要があることを忘れたために発生します。

配列の長さを超えてループしていないことを確認してください。

于 2012-12-17T20:59:17.080 に答える