software-trends.de

www.cyberport.de

Tutorial: Excel Dateien mit Java auslesen und beschreiben

gebloggt von Ronny | Kategorie: Software | Kommentar abgeben

Wie angekündigt nehme ich mir heute nochmal ein wenig Zeit um ein paar der Klassen der JAVA API POI HSSF vorzustellen. Mir geht es an dieser Stelle in erster Linie nicht um Vollständigkeit, sondern eher darum einen ersten Einblick in die Möglichkeiten zu bieten, die man zum Schreiben bzw. auch Auslesen von Excel-Dateien hat.

Wie ich bereits vor ein paar Tagen beschrieben hatte, habe ich nach einer Möglichkeit gesucht wiederkehrende manuelle Excel-Operationen, die hauptsächlich im Kopieren von einem CSV und Excel-Sheet in ein Anderes bestehen, möglichst zu automatisieren. Die Problemstellung kennt glaube ich fast jeder, denn viele Reports und Auswertungen liegen nunmal in einer meist nicht brauchbaren bzw. lesbaren Form vor.

Die Alternativen Access oder auch VBA bzw. Makros kamen für mich nicht in Frage, da auch ungeübte Nutzer damit umgehen sollen und ich damit noch nie warm geworden bin. Nur soviel - wer damit arbeiten möchte und Spaß daran hat, darf das natürlich auch weiterhin damit tun - ich bevorzuge jedenfalls diese JAVA API zum Schreiben und Auslesen von Excel Anwendungen.

Excel-Datei mit der JAVA POI-HSSF API einlesen

InputStream input = new FileInputStream(filename);
HSSFWorkbook wb = new HSSFWorkbook(input);
HSSFSheet sheet = wb.getSheet(sheetname);
HSSFRow row = sheet.getRow(0);
row.getCell(0).getNumericCellValue();

Um eine Excel Datei einzulesen, sind wie man sieht garnicht so viele Schritte nötig. Wie bei Java üblich benötigt man zunächst einen InputStream, dem die einzulesende Datei in Form eines String, der den Dateipfad enthält, übergeben wird. Dieser InputStream wird wiederum beim Erstellen eines Objektes HSSFWorkbook, welches sozusagen für die Excel-Datei als ganzes steht, benötigt. Über das erzeugte Workbook Objekt kann man die Funktion getSheet aufrufen, die entweder mit dem Namen des Tabellenblatts oder die Position verarbeiten kann.

Damit wären auch alle Voraussetzungen erfüllt um Zeilenweise die einzelnen Excel Zellen einlesen zu können. Dies funktioniert recht simpel über die Klasse HSSFRow, von der man ein Objekt erzeugen muss in dem man über das HSSFSheet Objekt eine bestimmte Zeile sozusagen einließt. Die einzelnen Zellen können dann problemlos über dieses Objekt angesprochen werden.

Excel-Datei mit der JAVA POI-HSSF API schreiben

public HSSFWorkbook wb = new HSSFWorkbook();
public HSSFSheet sheet = wb.createSheet("Name des Excel-Sheets");
public HSSFRow row = null;
public HSSFCell cell = null;

Analog zum Einlesen einer Excel Datei funktioniert auch das Schreiben in eine Excel Datei über die Java POI API. Erst ein Workbook anlegen, dann über dieses Workbook ein Tabellenblatt erstellen bzw. ein vorhandenes öffnen. Und nun kann man die Zellen wiederum über die Row und Cell Objekte ansprechen, mit Inhalten befüllen und formatieren.

public HSSFDataFormat format = wb.createDataFormat();
public HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
public HSSFColor color = null;
public HSSFCellStyle cellstyle = wb.createCellStyle();
cellstyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
cellstyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
cellstyle.setFillPattern( HSSFCellStyle.SOLID_FOREGROUND );
cellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellstyle .setBorderRight(HSSFCellStyle.BORDER_THIN);
cellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellstyle.setFont(font);
cellstyle.setDataFormat(format.getFormat("#,##"));

Wie man sieht ist eine Menge möglich, was die Formatierung der einzelnen Zellen betrifft. Angefangen von Ausrichtungen, über die Schriftart, Schröße und Stärke kann unter anderem auch der Hintergrund farblich angepasst oder z.B. einer Zelle ein bestimmtes Format zugewiesen werden. Mein Tipp: Am Besten einfach mal ein Beispiel in Excel anlegen und dann die Formatierungen programmieren. Ansonsten verliert man recht schnell den Überblick.

row = sheet1.createRow((short)0);
cell = row.createCell(0);
cell.setCellValue("Zeile 1 - Zelle 1");
cell.setCellStyle(cellstyle);
row = sheet1.createRow((short)1);
cell = row.createCell(1);
cell.setCellValue("Zeile 2 - Zelle 2");,
cell.setCellStyle(cellstyle);

Wenn man sich ein Standard-Set an Formatierungen in Form der CellStyles erarbeitet hat kann man nun die Zellen mit Inhalten beschreiben und anschließen den passenden CellStyle setzen.

sheet.autoSizeColumn((short)0);
sheet.autoSizeColumn((short)1);
FileOutputStream fileOut = new FileOutputStream("workbook.xls");

Nachdem ich nach längerem Suchen bisher keine Möglichkeit gefunden habe die Zellbreite manuell festzulegen, habe ich mir angewöhnt dieses über die autoSizeColumn() Funktion einfach dem Programm zu überlassen. Das macht erstens weniger Arbeit und funktioniert zweitens auch genauso wie man es aus Excel kennt. Bleibt nur noch übrig die Datei letztendlich über einen FileOutputStream auch noch zu schreiben.

Mehr Informationen und die Dokumentation zur API findet man beim Apache POI Projekt.

Tags: , ,

Links zum Thema:

Deine Meinung ist gefragt: