Strategie zum einlesen eines Datensatzes
-
Hallo,
ich suche versuche gerade xls Files (Excel Tabellen) auszulesen, mit apache POI - sh letzten Post Nun habe ich folgendes Problem, es scheint bei den Excel sheets keinerlei Zeilen oder Spaltenbegrenzungen zu geben - jedes Sheet hat 256 Spalten und 65536 Zeilen. Allerdings sind nicht alle "gefuellt". In meinem Fall wird es sich wohl hauptsaechlich um die ca ersten 20000 Zeilen handeln.Nun suche ich nach einer Strategie ein Sheet effektiv auszulesen.
Momentan ueberlege ich das komplette File in einen moeglichst kleinen Speicher komplett einzulesen (Implementierung: 2DArray mit Strings, sh.: http://www.c-plusplus.net/forum/viewtopic-var-t-is-151800.html) und merke mir dabei die hoechsten "gefuellten" Indizes der Zeile und der Spalte. Danach soll der Inhalt bis genau zu diesen Indizes wieder in einen Vector<Vector> ueberschrieben werden, um ihn per JTable darstellen zu lassen. Irgendwie kommt mir das nicht wirklich effektiv vor.
Eine andere Ueberlegung war, von hinten zeilenweise einzulesen, also von Zeile 65535 an, und ab der ersten gefuellten Zelle, die Zeilen in den entsprechend angelegten Vector<Vector> direkt zu uebernehmen - somit lese nur einmal ein. Die Zeilenvektoren muessten dann allerdings noch mit einem max Spalten index getrimt werden (weiterer Durchgang - also auch wieder zwei Durchgaenge, aber diesmal im "teuren" Vector?).
Was waere wohl eine geeignete Methode zum Einlesen "mit Luecken" - gibt's da Strategien fuer sowas? Schlagwoerter, nach denen man googeln koennte, etc? Vllt auch ne Meinung zu obigen Ueberlegungen?
-
-
Ich hab da jetz etwas rumgeschaut, nja, ich will kein neues Interface Jar fuer Excell schreiben und Bytes neu ausdeuten - ich nutze schon das Apache Teil, damit kann ich Zellen auslesen (leider nur numerische oder Strings, aber fuer meine Ansprueche reichts vollkommen). Mich interessiert auch nicht was POI genau im Hintergrund veranstaltet, sondern wie ich nun mit dem Werkzeug umgehe.
Ich kann mir also einzelne Zellen holen (mit x und y durchnavigieren) und diese Zellen in Strings/Zahlen auslesen. Ist eine Zelle leer, boolean, Formel oder Date - ist ihr Wert "Null". Geschieht dies innerhalb einer Tabelle setze ich halt ein leeres Feld dafuer ein (weshalb ich nicht einfach nur alles das einlese, was zB nicht null ist). Den unbeschreibenen Rest der 65000 Zeilen brauch ich allerdings nicht.
Hierzu eine weitere Ueberlegung, ich dachte auch schon, vllt ist es moeglich jedes Zellenelement in ein eigenes "Elementobjekt" zu schreiben, dies enthielte Koordinaten und Inhalt der jew. Zelle. leere Zellen wuerden einfach nicht gesetzt. Nur denke ich, dass so ein Objekt nunmal groesser ist als ein String Objekt, dh ist der Datensatz etwas laenger, wird die Speicherung in der Form das zigfache einnehmen.
-
Hallo,
Falls jemand mal ein aehnliches Problem hat, ich habe fuer meine Anwendung herausgefunden in HSSF (in dem Jar) gibts folgende Methoden:HSSFSheet.getPhysicalNumberOfRows() - die Anzahl der Zeilen
HSSFSheet.getFirstRowNum() - der erste beschriebene Zeilenindex (startet mit 0)
HSSFSheet.getLastRowNum() - der letzte beschriebene ZeilenindexIch lese das nun von rechts nach links spaltenweise ein und sobald die erste Spalte einen Eintrag enthaelt, schreibe ich die Spalten in meine Datenstruktur bis zur Spalte 0, da es leider keine aehnlichen Funktionen auch fuer die Spalten gibt.