W E R K S T A T T Import von Daten aus hochgeladener Excel- Datei Intrexx 7.0
1. Einleitung In diesem Werkstattbeitrag wird anhand eines Beispiels erläutert, wie Daten aus einer vom Benutzer hochgeladenen Excel-Datei verarbeitet werden können. Im ersten Schritt benötigen wir eine Applikation, die die Datei entgegennimmt und danach erstellen wir einen Prozess, der die Daten verarbeitet. In unserem Beispiel haben wir eine kleine Kundenverwaltung, in die der Benutzer Daten aus einer Excel-Liste importieren können soll. Die Daten könnten beispielsweise auf einer Messe erfasst worden sein. Für den Zugriff auf die Inhalte der Datei verwenden wir im Beispiel die POI-Bibliothek der Apache Foundation (https://poi.apache.org/apidocs/). 2. Applikation Bitte erstellen Sie eine neue Applikation auf Basis der leeren Vorlage und benennen Sie diese um, z.b. in Werkstatt: Import aus Excel. Die bestehende Datengruppe benennen Sie um in Upload. Auf der Eingabeseite platzieren Sie bitte die folgenden Eingabeelemente: Dateiauswahl (Typ Datei, Titel Datei) Speichern-Schaltfläche Das Dateifeld konfigurieren Sie so, dass der Upload mehrerer Dateien nicht möglich ist und dass die Datei in einem Datenfeld, welches Sie neu anlegen, abgespeichert wird. Als nächstes erstellen Sie eine neue Datengruppe mit dem Titel Kunden. Den Datentyp des Primärschlüssels bitte unbedingt auf GUID umstellen. Da wir die Applikation nur beispielhaft umsetzen, legen wir nicht alle Datenfelder an, die bei einem Kunden sinnvoll wären. Wir beschränken uns hier auf die Felder Firma, Straße, PLZ und Ort. Bitte legen Sie diese Felder vom Typ String über den Eigenschaftendialog der Datengruppe an. Abschließend platzieren Sie auf der Seite Übersicht eine Tabelle, die die Kundendaten anzeigt und veröffentlichen danach die Applikation. 3. Prozess Der Prozess soll beim Upload einer Excel-Datei die Daten auslesen und in der Datengruppe abspeichern. In unserem Beispiel werden die Daten einfach ohne jegliche Prüfung als neue Datensätze hinzugefügt. Um auf eine neue Datei zu reagieren, wird ein Datengruppen- Ereignisbehandler eingefügt, der nur auf das Einfügen neuer Datensätze der in Kapitel 2 angelegten Datengruppe Upload reagiert. UNITED PLANET - INTREXX 7 - IMPORT VON DATEN AUS HOCHGELADENER EXCEL-DATEI 2
Mit dem Ereignisbehandler verbinden Sie dann eine Groovy-Aktion, in die Sie den folgenden Code einfügen: import java.io.fileoutputstream import java.io.ioexception import java.io.inputstreamreader import org.apache.poi.hssf.usermodel.hssfworkbook import org.apache.poi.ss.usermodel.cell import org.apache.poi.ss.usermodel.sheet import org.apache.poi.ss.usermodel.workbook import org.apache.poi.xssf.usermodel.xssfworkbook import org.apache.poi.ss.usermodel.cellstyle import org.apache.poi.ss.usermodel.font import org.apache.poi.ss.usermodel.row import org.apache.poi.ss.usermodel.indexedcolors; import org.apache.poi.ss.usermodel.workbookfactory import de.uplanet.lucy.server.businesslogic.util.fileuchelper import de.uplanet.scripting.groovy.util.safely //Dateifeld, in dem die Excel-Datei gespeichert wird def l_vhfile = g_record["0301d1a138b9d1eaa2c82d5a4b3e611c324fd269"] /* datafield Datei <file> */ def strpfadimportfile = l_vhfile.getpath() //Pfad zur Datei if(strpfadimportfile) def strid = g_record["246d16de13285ac1a801ed049ab5e45f3babd31c"].value /* datafield (PK) (S) ID <integer> */ def conn = g_dbconnections.systemconnection if(strpfadimportfile) //notwendig, da sonst auch das Löschen des Importfiles per FileUcHelper noch einmal das File verarbeiten will, denn dies triggert ebenfalls das Ändern in der BL an InputStream inp = new FileInputStream(strPfadImportfile); Workbook wb = WorkbookFactory.create(inp); Sheet sheet = wb.getsheetat(0); def stmt = null /******************************** Zellen: 0: Firma 1: Straße 2: PLZ 3: Ort ********************************/ def firma = null def strasse = null def plz = null def ort = null i=0 //in der Ersten Zeile mit Index 0 steht die Überschrift Iterator<Row> rows = sheet.rowiterator() while (rows.hasnext()) Row row = rows.next() if( i > 0)// erste Zeile enthält Kopfzeile Cell cella = row.getcell(0) if(cella) firma = cella.getstringcellvalue() firma = null Cell cellb = row.getcell(1) if(cellb) strasse = cellb.getstringcellvalue() UNITED PLANET - INTREXX 7 - IMPORT VON DATEN AUS HOCHGELADENER EXCEL-DATEI 3
strasse = null Cell cellc if(cellc) plz = row.getcell(2) = cellc.getnumericcellvalue().tointeger() //Wenn Excel das Feld als "Numeric" abspeichert, muss der Wert auch über die entsprechende Methode ausgelesen werden. tointeger(), damit kein ".0" am Ende plz Cell celld if(celld) ort ort = null = row.getcell(3) = celld.getstringcellvalue() = null //Kunden hinzufügen per SQL-Statement def guid = newguid() try stmt = g_dbquery.prepare(conn, "INSERT INTO DATAGROUP('D749FCBF6594B27B6D1D5ECE7A556FBFCC8DB262') (STRID,STR_FIRMA,STR_STRASSE,STR_PLZ,STR_ORT) VALUES (?,?,?,?,?)") stmt.setstring(1, guid) stmt.setstring(2, firma) stmt.setstring(3, strasse) stmt.setstring(4, plz.tostring()) stmt.setstring(5, ort) löschen stmt.executeupdate() finally stmt = Safely.close(stmt) i++ //Aufräumen: hochgeladene Datei mitsamt Upload-Datensatz wieder FileUCHelper.deleteFileFromIntrexx(g_context, "0301D1A138B9D1EAA2C82D5A4B3E611C324FD269", g_record.recid) try stmt = g_dbquery.prepare(conn, "DELETE FROM DATAGROUP('D4C658BCBD84D9C511F5657745B8F26226A87901') WHERE LID =?") stmt.setint(1, g_record.recid.tointeger()) stmt.executeupdate() finally stmt = Safely.close(stmt) Im Skript greifen wir zunächst auf die Excel-Datei zu, genauer gesagt, auf das erste Sheet der Datei. Darin gehen wir dann Zeile für Zeile durch und lesen die Inhalte aus, die dann auch sofort in die Intrexx-Datenbank geschrieben werden. Ganz am Ende löschen wir die hochgeladene Datei wieder aus der Datengruppe Uploads. Dieser Schritt ist nicht unbedingt notwendig, falls man eine Art Historie der hochgeladenen Dateien behalten möchte. Bitte beachten Sie, dass Excel für die einzelnen Zellen den Datentyp eventuell selbst festlegt, der Datentyp aber beim Auslesen im Groovy-Skript korrekt angegeben werden muss. Um an dieser Stelle flexibler zu sein, kann der Datentyp jeder Zelle ausgelesen werden, um dann mit UNITED PLANET - INTREXX 7 - IMPORT VON DATEN AUS HOCHGELADENER EXCEL-DATEI 4
der entsprechenden Methode darauf zuzugreifen. Außerdem wird im Beispiel nicht geprüft, ob es sich tatsächlich um eine Excel-Datei handelt. Dies kann ebenfalls mit Groovy umgesetzt werden und sollte bei einer Applikation, die produktiv genutzt werden soll, auch unbedingt überprüft werden. Vor dem Veröffentlichen geben wir dem Prozess noch denselben Namen wie der Applikation. 4. Testen Zum Testen der Applikation mitsamt Prozess benötigen wir schließlich noch eine Excel-Datei. Als Beispiel kann ein leeres Excel-Sheet erstellt werden. Darin nutzen wir vier Spalten, von denen jede eine Überschrift bekommt. Die Spalten müssen in derselben Reihenfolge sein, in der wir im Code darauf zugreifen, d.h. Firma, Straße, PLZ, Ort. Natürlich können Sie der Liste weitere Einträge hinzufügen. Zum Abschluss wechseln Sie in den Browser und rufen die Applikation auf. Dort gehen Sie auf die Eingabeseite in unserer neuen Applikation, wählen in der Dateiauswahl die Excel-Datei aus und laden Sie mit dem Klick auf Speichern hoch. Wenn Sie alles richtig gemacht haben, tauchen die Kunden aus der Excel-Liste nun in der Tabelle auf der Übersichtsseite auf. UNITED PLANET - INTREXX 7 - IMPORT VON DATEN AUS HOCHGELADENER EXCEL-DATEI 5
2015 United Planet. All rights reserved. www.unitedplanet.com. Intrexx and United Planet are registered trademarks of United Planet, Freiburg - Germany. Alle im Text erwähnten Hersteller, Produkte und Dienstleistungen sind Marken oder eingetragene Marken der jeweiligen Unternehmen in Deutschland und anderen Ländern weltweit.