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-äquivalentgetMetaData(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 einercfquery
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].).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, es hat nichts zu tun mit CF-oder JRE-version. Zumindest nicht direkt. Es klingt wie ein bug in POI.
Wenn du mal die Ausnahme, es zeigt deutlich, das problem tritt auf, wenn die CF-startet eine Sonderziel-Methode, die versucht, automatisch die Größe der Spalten (nach dem hinzufügen der Abfrage von Daten). Eine schnelle Suche zeigte mehrere Berichte über ähnliche
ArrayIndexOutOfBoundsException
Fehler mitHSSFSheet.autoSizeColumn
wie diese (die gerade passiert, zu erwähnen, ColdFusion):Laut bug-report, das Problem existierte schon in version 3.5, die die gleiche (Haupt -) version im Lieferumfang von ColdFusion 9 haben. Eine der POI-Entwickler schlägt vor, das Problem wurde behoben, in späteren Versionen. So könnten Sie versuchen, die Aktualisierung der POI-jar. Abgesehen davon, dass, wenn Sie zusammenstellen können ein Testfall reproduziert das Problem, möchten Sie vielleicht, um eine bug-report.
cfspreadsheet
wahrscheinlich nicht versucht, automatisch die Größe der Spalten wiespreadsheetAddRows
macht, damit kein Fehler Auftritt. So der offensichtliche workaround (und nicht ein großer) ist zu vermeiden, dass Funktionen, die versuchen, die Größe der Spaltenbreite.3
Stile und wiederverwenden für alle Zellen in jeder Spalte. Allerdings bin ich mir nicht sicher, ob CF-spreadsheet-Funktionen sind dabei, dass... Von der Fehlermeldung eher nicht. Aber ich würde zu prüfen haben.9,0,1,274733
. Es funktionierte gut für mich mit 13 Spalten und 20000 Zeilen (mit "Wertrow_num
). Ich sollte Sie gebeten haben, dies früher, aber was ist Ihr full CF-version-Nummer?9,0,1,274733
ich Frage mich nun, ob es etwas in der cfquery, dass zusätzliche Metadaten, die Ursachen einer unterschiedlichen Logik-Pfad (wie schon erwähnt, meine eigenen manuelle test arbeitete auch mit 18000+ Zeilen). Könnten Zeichen wie , und . im Datensatz-oder Spaltennamen haben eine Wirkung?Wenn Sie einen Schritt zurück aus dem code und einfach prüfen, der Fehler geworfen wird, erhalten Sie diese aus der java-Dokumentation und hier ist ein weiterer Verweis
Den Fehler auch zeigt Sie die illegale index-Wert, der versucht wurde:
-32735
Nun dein problem ist, dass Sie nicht die Angabe der index-Werte in Ihrem code per se, weil Sie eine ColdFusion-Funktion. Die Funktion (
SpreadsheetAddRows
) versuchen, konvertieren Sie Ihre Abfrage Ergebnis in ein array und dann fügen Sie jede der Werte, die in Zeilen einer Excel-Tabelle. Es ist die Nutzung der zu Grunde liegenden Java-runtime zum ausführen dieser Aufgaben und wirft einen Fehler. Also ich fürchte, Sie sind ein wenig stecken mit dieser Einschränkung, die Sie auftreten. Sie könnten versuchen, eine Aktualisierung der JRE-version Ihre ColdFusion-installation ausgeführt wird, um zu sehen, wenn das Problem angesprochen wurde, in eine neuere Version. Ich glaube ColdFusion 9 Schiffe mit Java 1.6.0_14 siehe hier. Sie sollten mindestens ausgeführt werden 1.6.0_24 da eh ein Die DOS-Sicherheitsanfälligkeit patch. Es sieht aus wie Sie sind bis zu 1.6.0_38 jetzt aber Sie müssen überprüfen Sie Adobe-support für diese.Wenn Sie ein Upgrade der JRE nicht die Frage zu lösen, dann glaube ich, werden Sie brauchen, um Ihre ColdFusion-code, um dieses Problem zu vermeiden. Sie erklärte, dass Sie hatte Erfolg mit der
CFSpreadSheet
tag. Oder vielleicht können Sie spielen, um mit verschiedenen Möglichkeiten zu geben Ihre Abfrage-Ergebnisse, um dieSpreadsheetAddRows
Funktion. (Obwohl ich nehme an, Sie haben bereits erschöpft, dass avenue.) Vielleicht Durchlaufen Sie die Abfrage und erstellen Ihre eigenen array-oder Schleifen über die Abfrage und das hinzufügen von Zeilen ein zu einer Zeit. Ich weiß, das kann nicht optimal sein, aber nach dem Versuch ein paar verschiedene Arten, wie man hoffentlich heraus, wie der Weg zu gehen.Ich werde auch hinzufügen, das ColdFusion-tag (ohne Versionsnummer), um Ihre post zu erhalten einigen mehr die Augen auf ihn.
UPDATE
Wollte nur follow-up auf die unterstützte Java-version für ColdFusion 9 haben. Ich fand dieser blog-Eintrag von Charlie Arehart erörtert, dass Adobe Haltung auf Java-Upgrade für ColdFusion-Server. Die links zu den offizielle Adobe hier posten die besagt, dass jeder minor version upgrade unterstützt werden. Also für ColdFusion 9 "Alle zukünftigen JDK 1.6.0_x-releases unterstützt werden".
Integer.MAX_VALUE
. Mehr als oft nichtArrayIndexOutOfBoundsException
Fehler entstehen durch einfache Programmierfehler.Integer.MAX_VALUE
minus einige kleine Anzahl von bytes, je nach Java-version. 😉 Wie auch immer, ich Stimme völlig mit Ihnen überein, dass es ist meistens verursacht durch ein Programmier-Problem. Mein Problem mit diesem war, dass die OP ist mit einem integrierten ColdFusion-Funktion, so konnte er nicht nur seinen code ändern. Toller Vorschlag über die Aktualisierung der zugrunde liegenden Bibliotheken. Ich habe immer vergessen, die option...(extrahiert aus http://poi.apache.org/spreadsheet/quick-guide.html)
Sowieso, Sie können versuchen, diese zu:
Meine Erfahrung mit arrays, wenn Sie ein
OutOfBounds
Ausnahme, es ist in der Regel, weil ich "überrannt" das Spektrum - das heißt, ich schlang einen mehr als die Anzahl der Elemente im index. Dies geschieht meist, weil ich vergessen habe, dass, wenn das array bei 0 beginnt, muss ich nur die Schleife, um die array-Länge - 1.Stellen Sie sicher, dass Sie nicht Schleifen Vergangenheit die Länge der Arrays.