Schreiben von Microsoft Office Dateien mit Java Dietmar Steinbichler 1 Das Apache Jakarta Projekt Das Apache Jakarta Projekt erzeugt und verwaltet Open Source Projekte, die für Jedermann kostenlos zur Verfügung stehen. Programmiersprache in allen Projekten ist Java. Ein Teilprojekt ist POI. 2
Das POI Projekt Das POI Projekt besteht aus Java-APIs zum Erstellen und Bearbeiten von Dateiformaten, die auf dem Microsoft-Dateiformat»OLE-2 Compound Document«beruhen. In diesem Format sind unter anderem die meisten Microsoft Office Dateien, wie zum Beispiel Excel und Word Dateien. 3 Formate im POI Projekt POIFS POI File System HWPF Horrible Wordpad Format HSSF Horrible Spreadsheet Format HPSF Horrible Property Set Format 4
POIFS Das POI File System POIFS ist die Java Implementierung des»ole-2 Compound Document«Formats. Alle APIs im POI Projekt benutzen POIFS in irgendeiner Weise. 5 HWPF Java API zum Zugriff auf Microsoft Word Dateien HWPF ist noch nicht sehr weit entwickelt, jedoch sind einfache Lese- und Schreibfunktionen bereits implementiert. 6
HSSF Java API zum Zugriff auf Microsoft Excel Dateien HSSF ist der am weitesten entwickelte Teil des POI Projekts. HSSF unterstützt fast alle Operationen mit Excel Tabellen bis auf Makros, Diagramme und Pivot Tabellen. 7 Beispiele 1. Word Dokument mit HWPF lesen und schreiben 2. Excel Datei mit HSSF auslesen 3. Excel Datei mit HSSF schreiben 8
Klassenstruktur HWPF HWPFDocument Dokument Range Bereich CharacterRun Schriftarten/Formate 9 HWPF Beispiel 10
HWPF Beispiel (1) Datei öffnen und Infos auslesen // Dokument HWPFDocument doc = new HWPFDocument(new FileInputStream("doc\\read.doc")); // Bereich Range range = doc.getrange(); // Schriftart CharacterRun run; // Anzahl der Zeilenumbrüche ausgeben System.out.println("Das Dokument enthält:\t" + range.numparagraphs() + " Zeilenumbrüche,"); // Anzahl der Abschnitte ausgeben System.out.println("\t\t\t" + range.numsections() + " Abschnitte,"); // Anzahl der Schrifarten ausgeben System.out.println("und\t\t\t" + range.numcharacterruns() + " Schriftarten."); 11 HWPF Beispiel (2) Schriftarten abfragen // Info über Schriftarten ausgeben System.out.println("----- Schriftarten -----"); for (int i=0; i<range.numcharacterruns(); i++) { run = range.getcharacterrun(i); System.out.print ("Font " + (i+1) + ": "); System.out.print ("Fontgröße:" + run.getfontsize()); System.out.println(", Zeichenabstand:" + run.getcharacterspacing()); } 12
HWPF Beispiel (3) Inhalt ausgeben und ergänzen // Inhalt ausgeben String content = range.text(); System.out.println("----- Inhalt: -----"); System.out.println(content); System.out.println("-------------------"); // Ein Paar Worte hinzufügen range.insertbefore("*** von HWPF eingefügt ***"); 13 HWPF Beispiel (4) Dokument schreiben und schließen // Ausgabestream öffnen OutputStream out = new FileOutputStream("doc\\Write.doc"); // Ausgabedokument schreiben doc.write(out); // Ausgabestream schließen out.flush(); out.close(); 14
Klassenstruktur HSSF HSSFWorkbook Mappe HSSFSheet Tabelle HSSFRow Zeile HSSFCell Zelle HSSFCellStyle Zellformat 15 HSSF Beispiel Lesen 16
HSSF Beispiel Lesen (1) Excel Mappe öffnen und Objekte erzeugen // Excel Mappe öffnen HSSFWorkbook wb = new HSSFWorkbook( new FileInputStream("doc\\Read.xls")); // Tabelle1 auswählen HSSFSheet sh = wb.getsheet("tabelle1"); // Objektreferenz auf Zeile erzeugen HSSFRow row = null; // Objektreferenz auf Zelle erzeugen HSSFCell cell = null; 17 HSSF Beispiel Lesen (2) Zelleninhalte ausgeben // Für jede Zeile for (int i=0; i<=sh.getlastrownum(); i++) { // Zeile auswählen row = sh.getrow(i); // Für jede Zelle in der Zeile for (int j=0; j<row.getlastcellnum(); j++) { // Zelle auswählen cell = row.getcell((short) j); // Zelleninhalt ausgeben System.out.print ("Zelle[" + i + "," + j + "] = " ); System.out.println(cell.getStringCellValue()); } } 18
HSSF Beispiel Schreiben 19 HSSF Beispiel Schreiben (1) Objekte erzeugen // Neue Mappe erzeugen HSSFWorkbook wb = new HSSFWorkbook(); // Neue Tabelle erzeugen HSSFSheet sh = wb.createsheet(); // Objektreferenz auf Reihe erzeugen HSSFRow row = null; // Objektreferenz auf Zelle erzeugen HSSFCell cell = null; // Zellformat Objekt erzeugen HSSFCellStyle csty = wb.createcellstyle(); // Datenformat Objekt erzeugen HSSFDataFormat df = wb.createdataformat(); 20
HSSF Beispiel Schreiben (2) Schriftart einstellen // Font-Objekt erzeugen HSSFFont font = wb.createfont(); // Schriftgröße auf 12pt einstellen font.setfontheightinpoints((short) 12); // Schriftfarbe blau font.setcolor((short)0xc); // Schriftart font.setfontname("times New Roman"); // Fett font.setboldweight(hssffont.boldweight_bold); // Schriftart auf Zellformat-Objekt anwenden csty.setfont(font); 21 HSSF Beispiel Schreiben (3) Rahmen einstellen // Rahmen einstellen csty.setborderbottom(hssfcellstyle.border_thin); csty.setbottombordercolor(hssfcolor.pink.index); csty.setborderleft(hssfcellstyle.border_thick); 22
HSSF Beispiel Schreiben (4) Zellen schreiben // Tabelle mit 30 Zeilen erzeugen for (short rownum = 0; rownum < 30; rownum++) { // Zeile erzeugen row = sh.createrow(rownum); // Für jede Zelle der Reihe for (short cellnum = 0; cellnum < 10; cellnum += 2) { // String Zelle erzeugen cell = row.createcell((short) (cellnum + 1)); // Format setzen cell.setcellstyle(csty); // String eintragen cell.setcellvalue( "HSSF Test" ); } } 23 HSSF Beispiel Schreiben (5) Fenster fixieren und Zoom setzen // Eine Zeile und eine Spalte fixieren sh.createfreezepane( 1, 1); // Zoom auf 75% setzen sh.setzoom(3,4); 24
HSSF Beispiel Schreiben (6) Datei schreiben und schließen // Ausgabedatei ereugen FileOutputStream out = new FileOutputStream("doc\\Write.xls"); // Mappe schreiben und Datei schließen wb.write(out); out.close(); 25 Schreiben von Microsoft Office Dateien mit Java http://jakarta.apache.org/poi/ 26