Mein Name ist Ulrich Fuchs, ich unterstütze als freier Berater Anwenderunternehmen und Beratungshäuser in allem, was im Umgang mit dem ERP-System "Infor LN" und seinen Vorgängerversionen (Baan IV, Baan V) so an Aufgaben anfällt. Ich bin Projektleiter, Berater und Softwareentwickler, und weil ich alle drei Rollen tatsächlich beherrsche, bin ich der Joker immer dann, wenn's anspruchsvoll wird.

Weil Neuigkeiten, über die ich so stolpere, vielleicht auch für andere interessant sind, gibt's dieses Blog. Meine Kontaktdaten finden Sie unter
www.ulrich-fuchs.de.



Mittwoch, 2. Februar 2011

Excel-Text-Baankuchengebacke

Heute mittag habe ich von meinem Kunden eine Exceldatei bekommen. Mit Artikelnummern. Und einer Spalte, die je Artikelnummer einen mehrzeiligen Text enthält. Mit der Bitte, die Texte doch bitte nach Baan zu übernehmen.

Albtraumszenario.

Keine tollen Business-Interfaces, einfach nur Excel, Baan-Exchange, und das Problem, aus Excel eine ASCII-Datei zu erzeugen, die dieses dämliche Multiline-Text-Exchange-Format hat, Sie wissen schon, das mit den {\{ und }\} als Text-Anfangs-und Text-Endekennern. Wäre man ein Excel- und VB-Guru, könnte man vermutlich irgendwelche Excelmakros schreiben, die ganz innerhalb von Excel eine ASCII-Datei aus einem Datenblatt zu produzieren in der Lage sind. Bin ich aber nicht und kann ich also auch nicht. Und ich mag wiederverwendbare Lösungen. Makros sind das nicht.

Aber ich kann ein bisschen Java, und eine glitzernd neue, von Java abgeleitete und auf der Java-VM laufende Programmiersprache namens Gosu, die vollen Zugriff auf die weite Welt der existierenden Java-Libraries hat. Und ich kann googeln. Und mit JExcelApi eine Library finden, mit der man Excel-Dateien von Java (und also auch von gosu aus) bearbeiten kann.

Und damit zu folgendem Kochrezept, wie man aus den wüsten Excel-Dateien, die man manchmal von Anwendern so manchmal bekommt, mit einer vernünftigen Programmiersprache eine ASCII-Datei hinbekommt, die sich mit Exchange oder eigenen Importskripten weiterverwursten lässt.

Man nehme:
  • 1x ein installiertes Java, Version 1.6. Sollte jeder im Schrank haben
  • 1x gosu, heruntergeladen von der ersten obigen Webseite und in ein beliebiges Verzeichnis gelegt
  • 1x jexcelapi_2_6_12.zip heruntergeladen von der zweiten obigen Webseite
Vorbereitungen:
  • Ein Arbeitsverzeichnis anlegen, sagen wir C:\users\uli\temp
  • Die Zip-Datei jexcelapi_2_6_12.zip entpacken, reinkucken. Da findet sich eine Datei jxl.jar
  • jxl.jar ins angelegte Arbeitsverzeichnis werfen
Durchführung:

Im Arbeitsverzeichnis eine Datei excelnachbaan.gsp oder wie auch immer erstellen. Wichtig ist nur die Endung "gsp", die für Gosu Program steht.

Die Datei mit einem Editor öffnen, und mit folgendem Inhalt füllen: (jetzt kommts!)

classpath "C:\\users\\uli\\temp\\jxl.jar"  // Dateiname muss jxl.jar im 
                                           // Arbeitsverzeichnis sein!

uses jxl.*       
uses java.io.File 
uses java.lang.System
uses java.io.FileWriter
uses java.io.PrintWriter

var workbook = Workbook.getWorkbook(
               new File("C:\\Users\\Uli\\Desktop\\infile.xls"));


var sheet = workbook.getSheet(0)
using ( var fw = new FileWriter( 
                     new File ("C:\\Users\\Uli\\Desktop\\outfile.txt")),
        var pw = new PrintWriter (fw)
   )
{ 
    for (row in 1..4467) {
        var item = sheet.getCell(1, row).getContents()
        var text = sheet.getCell(4, row).getContents()
       
        pw.println (item)
        pw.println ("{\\{txta   2")
        for (line in text.split("\n")) pw.println (line)              
        pw.println ("}\\}")
    }
    print ("Fertig!")
}

Das Progrämmchen öffnet eine Excel-Datei C:\Users\Uli\Desktop\infile.xls und schreibt eine Textdatei C:\Users\Uli\Desktop\outfile.txt. Und dann nimmt es sich die erste Tabelle der Datei vor (getSheet(0)), und liest aus den Zeile 2 bis 4468 jeweils die zweite und die fünfte Spalte (der Zugriff ist Null-basiert, das heißt die Excel-Zelle C1 hat die Koordinaten (2,0). In meiner Beispieldatei steht in der ersten Zeile eine Überschrift, in der zweiten Spalte der Artikel und in der fünften der Text. Das ganze muss man natürlich auf seine Verhätnisse anpassen. Sprich: die richtigen Spalten nehmen, und den richtigen Bereich an Zeilen. Oder Zeilen und Spalten tauschen, falls der geniale Urheber der Exceldatei seine Artikel alle in einer Zeile stehen hat und den Text jeweils drunter. Wir üben Übertragen von Lösungen, ok?
Für jede dieser Zeilen wird, nachdem der Zellinhalt ausgelesen ist, der Artikel in die Datei geschrieben, gefolgt vom Textöffner {\{, gefolgt vom Text, gefolgt vom Textende-Kenner }\}. (Der doppelte Backslash im Programm ist in der Datei dann jeweils ein einzelner, das ist die Art und Weise, wie man außerhalb der Baanwelt dieses Sonderzeichen "escaped"). Das ist das ganze Programm.

Jetzt müssen wirs nur noch ausführen. Wir setzen uns ins Gosu-Bin-Verzeichnis:

cd c:\wo\auch\immer\gosu-0.8.1.-C\bin

Und das einzige, was dann noch zu tun ist, ist ein

gosu.cmd C:\users\uli\temp\excelnachbaan.gsp

Und voila! Wir haben eine feine Datei gebacken, die sogar Baan Exchange versteht...








.