Wie behebe ich SpreadSheetAddRows Funktion abstürzt, wenn Sie eine große Abfrage?

EDIT3: Dank der Hilfe von @Leigh ich habe verengt das problem auf die Datum-Spalten in der Abfrage. Mit dem ursprünglichen code eingestellt und POI, die Seite stürzt ab, wenn SpreadSheetAddRows() versucht, fügen Sie eine sehr große Abfrage, enthält Datum-like-Zellen. Ich habe einen bug-report hier: https://bugbase.adobe.com/index.cfm?event=bug&id=3432184.


Ich habe eine Abfrage, ich bin das hinzufügen zu einer spreadhseet Objekt, das scheint zu Fehler, wenn die Abfrage eine unweildly Menge von Zeilen (18583 in diesem Beispiel). Die genaue Fehlermeldung lautet wie folgt:

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)

Hier ist der relevante code:

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

EDIT: ich habe cfspreadsheet bisher mit Erfolg, aber es produziert nicht eine Tabelle mit überschriften (und es hat auch den Nachteil, dass das erstellen einer temporären Datei, um zu dienen.)


EDIT2: Nach @Leigh Vorschlag, den ich aktualisiert, die OVI in mein CF9/lib-Ordner. Der Fehler hat sich inzwischen geändert, um die folgenden:

<cfset SpreadsheetFormatRow(xls, {bold=true,fgcolor="brown",color="white"}, 1)> Gibt die folgende Meldung: org.apache.poi.hssf.util.HSSFColor.getIndexHash()Ljava/util/Hashtable;

Fehler-code:

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)

Kommentierte, line out, jetzt stürzt wieder auf:
<cfset SpreadsheetAddRows(xls, qryTest)>

Fehler-Code:

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) 
  • java.lang.ArrayIndexOutOfBoundsException: -32735 Dies könnte ein overflow-Problem.
  • Kann nur raten hier aber sehen, ob das problem verschwindet, wenn Sie entfernen die Zeile formatieren. Entfernen Sie die SpreadsheetFormatRow() Linie. Erraten, denn ich fand das dieses Problem in Bezug auf eine Begrenzung von Zellenformaten in Excel.
  • Wie viele Werte ist qryTest.getMeta().getColumnLabels() zurück?
  • Hab ich auskommentiert, die Zeile ohne Erfolg. Die Ergebnisse sind einfach nicht konsequent genug, zu sagen, dass ist die Lösung. Auch, qryTest.getMeta().getColumnLabels() gibt 13 Werte.
  • Haben Sie herausgefunden, welche Zeile den Fehler verursacht? Aus den dump, ich nehme an es ist dieser code; qryTest.getMeta().getColumnLabels(). Haben Sie versucht, mit dem ColdFusion-äquivalent getMetaData(qryTest)? Siehe die docs hier. Vielleicht sogar versuchen, die standard - cfquery Rendite-Objekt für die Spalte Namen; qryTest.columnList. Ich weiß, daß diese zurückkehren können die Spalten in einer anderen Reihenfolge und ALLE CAPS sondern nur versuchen zu pin zeigen Sie das Problem und eine mögliche Arbeit um.
  • Ich entschuldige mich, ich sollte erwähnt haben, dass CF gibt den Fehler Zeile wie <cfset SpreadSheetAddRows(xls, qryTest)>. Ich habe Bedenken, dass das Hinzufügen der Zeilen in zwei verschiedene Befehle möglicherweise verursacht habe, irgendeine Art von overflow, aber selbst wenn ich auskommentiert, die Zeilen im Kopf (addrow/formatrow) war es noch geben eine Fehlermeldung beim Versuch, fügen Sie die Abfrage der Tabelle Objekt. Auch der columnList Schlüssel für ein query-Objekt gibt die Spalten in alphabetischer Reihenfolge und in Großbuchstaben, so dass es nicht sehr nützlich in diesem Zusammenhang.
  • Wie gesagt, ich merke, dass die Ergebnisse anders sein wird, aber ich habe nur versucht, um zu sehen, wenn es wäre loszuwerden des Fehlers. Sie haben nicht uns gezeigt, wie qryTest definiert/festgelegt entweder. Ist es nur das Ergebnis einer cfquery Aussage?
  • Richtig, es ist ein cfquery-tag mit einer select-Anweisung (für zukünftige Referenz gibt es 13 Spalten mit den Spaltennamen wird mit A-Z, [Zeit] und [Leertaste].).

InformationsquelleAutor Alex | 2012-12-17
Schreibe einen Kommentar