Wie Sie Java für das automatisierte Berichtswesen über Excel verwenden
Wissen Sie, welche Technologie die medizinische Forschung, das Financial Engineering, die Eisenbahn, die Banken, unterschiedliche Dienstleistungen (und im Grunde genommen jeder Bereich, den Sie sich vorstellen können) gemeinsam haben? Wenn Sie an „Microsoft Excel“ denken, dann liegen Sie richtig: Das „grüne X“ ist der gemeinsame Nenner für alle, die ein Berichtswesen brauchen, unabhängig von der Branche.
Ja, wir wissen, Excel kann langweilig sein. Es steckt kaum etwas Spektakuläres in Datenzeilen und -spalten, Zellformeln, Linien- und Balkendiagrammen, Tortendiagrammen oder was auch immer, Excel noch alles kann – es ist alles langweilig. Wir sind aber der festen Überzeugung, dass Sie wenig Software in Ihrem Werkzeugkasten finden, die so leistungsfähig und so einfach zu bedienen ist wie Excel.
Besonders bei der Arbeit mit vielen Daten macht Excel das Ordnen, Filtern, Berechnen, Visualisieren und Berichten recht einfach. Sogar das Erweitern auf hohe Datenmengen^2 und das Hinzufügen von Automatisierungskomponenten sind relativ einfach: Indem Sie Excel einfach mit Java verbinden, erledigt das Programm die harte Arbeit des Datendurchsuchens und das Bereitstellen von sauberen Blättern von alleine.
Nun dann, los geht’s: Wenn Sie Unternehmer/in, C-Suit Executive, Produktmanager/in, Finanz-„Ingenieur/in“ oder in irgendeiner anderen Position sind, die mit Reporting (und/oder Datenbanken) zu tun hat, sollten Sie mit Ihrem Software-Entwicklungsteam darüber sprechen, wie die Leistungsfähigkeit von Java bei der Automatisierung der Leistungsfähigkeit von Excel genutzt werden kann.
(Außerdem: Beachten Sie bitte, dass Sie – obwohl wir uns in der Folge nur noch auf Excel beziehen werden) – mit derselben Technologie auch Word automatisieren können).
Wie funktioniert es?
Der gesamte Weg von „Java zu Excel“ besteht aus insgesamt vier Schritten:- Bringen Sie Ihre Daten (/Datenbank) in Ordnung;
- Verwenden Sie Apache POI („die Java-API für Microsoft-Dokumente“), um Ihre Daten mit Java zu integrieren;
- Lassen Sie Java die Dinge, die Sie benötigen, auswählen, berechnen und formatieren (siehe Funktionen und Code-Beispiele weiter unten);
- Bericht an Excel (möglicherweise: „in Excel herunterladen“, wenn Sie alles in einem Webbrowser machen).
- Schriftarten bis auf Zellebene
- Farben (Hintergrund und Text) bis auf Zellebene
- Schattierung bis auf Zellenebene
- Zellmuster bis auf Zellebene
- Zell-Initialisierung
- Fenster fixieren
- Kennwörter
- Abbildungen/Fotos sowohl statisch als auch dynamisch
- Überschriften
- Seitenumbrüche
- Blattumbrüche
- Einfügen von Text und vieles mehr
- Funktionen/Formeln
- Zellen verbinden
- Zeilenhöhe
- Ausrichtung von Zelltext
- Textdrehung
- Arbeitsblatt per E-Mail senden
- Die Arbeitsblätter können archiviert werden, so dass historische Arbeitsblätter abgerufen werden können.
Details
Unsere Erfahrung mit dem Apache POI – Java – Excel-Ökosystem sind positiv, da wir regelmäßig komplexe Excel-Dateien erstellen. Lassen Sie uns einige (nicht alle) spezifische Funktionen anschauen, um Ihnen zu zeigen, wie einfach es ist:1. Erstellen einer Excel-Datei
Der Apache POI funktioniert mit allen Excel-Elementen: der Datei selbst, den Arbeitsblättern, Zeilen und Spalten usw;HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("New Sheet"); final File excelFile = new File("myExcelFile.xls"); FileOutputStream fileOut = new FileOutputStream(excelFile, false); workbook.write(fileOut); workbook.close();
2. Größe ändern und bestücken
Es ist auch möglich, die Spalten- und Zeilengrößen entsprechend den Daten zu ändern. Es ist einfach, Zeilen, Spalten und Zellen zu erstellen und sie mit Daten zu füllen:HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); cell.setCellValue("Text value");
3. Stil-Bearbeitung
Mit Apache POI können Sie die Bearbeitung auf Zellenebene durchführen:
- die Hintergrundfarbe der Zellen einstellen,
- Art und Farbe der Rahmenlinien,
- Schriftart, Schriftgröße oder Farbe,
- Designs definieren und nach Bedarf verwenden (z.B. das gleiche Design für mehrere Zellen verwenden, ohne das Design neu zu definieren).
final HSSFFont arialRed8Font = workbook.createFont(); arialRed8Font.setFontHeightInPoints((short) 8); arialRed8Font.setFontName( "Arial"); arialRed8Font.setColor(IndexedColors.RED.getIndex()); arialRed8Font.setBold(true); final HSSFCellStyle cellWithThinBordersStyle = workbook.createCellStyle(); cellWithThinBordersStyle.setBorderBottom(BorderStyle.MEDIUM); cellWithThinBordersStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); cellWithThinBordersStyle.setBorderRight(BorderStyle.MEDIUM); cellWithThinBordersStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); cellWithThinBordersStyle.setBorderLeft(BorderStyle.MEDIUM); cellWithThinBordersStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); cellWithThinBordersStyle.setBorderTop(BorderStyle.MEDIUM); cellWithThinBordersStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); cellWithThinBordersStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); cellWithThinBordersStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); cellWithThinBordersStyle.setFont(arialRed8Font); cellWithStyle.setCellStyle( cellWithThinBordersStyle); cellWithStyle.setCellValue( "Defined cellstyle");
Natürlich können Sie, wie in unserem Beispiel, mehrere Schriftarten in einer einzigen Zelle haben:
- der erste Teil ist [Farbe: rot], [Schriftart: Arial Black], [Schriftgrad: 10 Punkt];
- der Rest des Textes ist [Farbe: schwarz], [Schriftart: Arial], [Schriftgrad: 8 Punkt], [bold];
HSSFFont firstFont = workbook.createFont(); firstFont.setFontHeightInPoints((short) 10); firstFont.setFontName("Arial Black"); firstFont.setColor(IndexedColors.RED.getIndex()); firstFont.setBold(false); HSSFFont secondFont = workbook.createFont(); secondFont.setFontHeightInPoints((short) 8); secondFont.setFontName("Arial"); secondFont.setColor(IndexedColors.BLACK.getIndex()); secondFont.setBold(true); final HSSFCell cellWith2fonts = firstRow.createCell(0); final String font1Text = "Validation failed! "; final String font2Text = " Please fill all required data!"; final String allText = font1Text + font2Text; final HSSFRichTextString cellValue = new HSSFRichTextString(allText); cellValue.applyFont(0, font1Text.length(), firstFont); cellValue.applyFont(font1Text.length(), (allText).length(), secondFont); cellWith2fonts.setCellValue(cellValue);
4. Kommentare einfügen
HSSFPatriarch hpt = sheet.createDrawingPatriarch(); HSSFComment comment = hpt.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 12, 7)); comment.setString(new HSSFRichTextString("The comment added to the cell." + System.getProperty("line.separator") + " New information...")); newCell.setCellComment(comment); newCell.setCellValue("This cell has a note!");
5. Formeln einfügen
Sie können programmatische, komplexe Formel-Zellen mit Werten aus anderen Zellen erstellen. Zum Beispiel,sumCell.setCellFormula("SUM(" + columnLetter + firstRow + ":" + columnLetter + lastRow + ")");
String formula = "IF("+ columnLetter + estimationRow + "=0,0,(" + columnLetter + cumulatedRow + "/" + columnLetter + estimationRow + ")*100)"; percentCell.setCellFormula(formula);
6. Hyperlinks hinzufügen
Diese können auf eine Web-URL, eine Datei, eine E-Mail-Anwendung oder auf eine beliebige Zelle innerhalb der Datei (auf einem beliebigen Arbeitsblatt derselben Excel-Datei) verweisen.HSSFCell cell = row4.createCell((short) 0); CreationHelper createHelper = workbook.getCreationHelper(); Hyperlink link = createHelper.createHyperlink(HyperlinkType.URL); link.setAddress("https://berg-software.com/"); cell.setHyperlink(link); cell.setCellValue("URL Link - to our company site"); cell = sheet.createRow(5).createCell((short) 0); cell.setCellValue("File Link"); link = createHelper.createHyperlink(HyperlinkType.FILE); link.setAddress("myFile.doc"); cell.setHyperlink(link); cell = sheet.createRow(6).createCell((short) 0); cell.setCellValue("Email Link"); link = createHelper.createHyperlink(HyperlinkType.EMAIL); link.setAddress("mailto:contact@bergsoftprod.wpengine.com?" + "subject = Hyperlink"); cell.setHyperlink(link); cell.setCellStyle(hlinkstyle);
7. Sicherheit
Sie können ein Kennwort festlegen, um ein ganzes Blatt vor Änderungen zu schützen. Auf diese Weise können Sie sicherstellen, dass Vorgänge wie das Löschen, Ausblenden und Bearbeiten von Zellinhalten nur von autorisiertem Personal durchgeführt werden können. Bei Bedarf können jedoch einige Zellen ganz entsperrt werden.protected_sheet.protectSheet( "mypassword"); CellStyle unlockedCellStyle = workbook.createCellStyle(); unlockedCellStyle.setLocked(false); row.createCell( 2).setCellValue("Cell value protected !"); final HSSFCell oneCell = row.createCell(4); oneCell.setCellValue("This cell value can be changed !"); oneCell.setCellStyle(unlockedCellStyle);
8. Fenster fixieren
Sie können die ersten Zeilen oder die ersten Spalten fixieren (d.h. sowohl vertikales als auch horizontales Fixieren ist möglich). Zum Beispiel:sheet3.createFreezePane( 2, 2 );
9. Reduzierende Gruppe für Spalten oder Zeilen
Das ist auch sehr einfach zu machen:sheet.groupColumn(2, 5); sheet.groupRow(7, 9);
10. Zellvalidierung
Es ist möglich, Datenvalidierungszellen zu setzen. Im Beispiel unten verwenden wir eine beschreibbare Zelle, um zu prüfen, ob der Benutzer einen der Werte 10, 20 oder 30 eingestellt hat, und wir lassen nicht zu, dass ein anderer Wert eingestellt wird. Der Benutzer wird über eine Eingabeaufforderung (die ebenfalls entweder definiert oder voreingestellt sein kann) informiert.sheet.createRow(25).createCell((short) 3).setCellValue("10"); CellRangeAddressList addressList = new CellRangeAddressList( 25, 25, 3, 3); DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint( new String[]{"10", "20", "30"}); DataValidation dataValidation = new HSSFDataValidation (addressList, dvConstraint); dataValidation.setSuppressDropDownArrow(true); dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP); dataValidation.createErrorBox("Validation Error", "The accepted values are: 10, 20 and 30!"); sheet.addValidationData(dataValidation);
11. Kopf- und Fußzeilen zu erstellen ist nicht schwierig
Sie können Überschriften links, zentriert oder rechts (oder alle) mit benutzerdefinierten Schriftarten festlegen:Header header = sheet.getHeader(); header.setCenter("Center Header"); header.setLeft("Left Header"); header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") + HSSFHeader.fontSize((short) 16) + "Right Header - special font"); sheet.getFooter().setCenter( "Center Footer"); sheet.getFooter().setLeft( "Left Footer"); sheet.getFooter().setRight("Right Footer");
12. Zellen verbinden
Sie benötigen nur einen einzigen Befehl, um den Bereich der zu verbindenden Zellen anzugeben:sheet.addMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, mergedCellFirstCol, mergedCellLastCol));
13. Grafiken
Apache POI kann bei der Erstellung verschiedener Diagramme (z.B. Linien-, Balken-, Tortendiagramme usw.) einschließlich ihrer 3D-Varianten helfen:Einschränkungen
Wahrscheinlich haben Sie inzwischen herausgefunden, dass Sie beliebige Excel-Funktionalitäten über Java/Apache POI ausführen können. Wenn jedoch zwei spezielle Einstellungen für den gleichen Zellensatz gelten, kann es Einschränkungen geben.
Zum Beispiel:
- Sie können ein Bild hinzufügen oder Zellen ausblenden/zuklappen. Wenn Sie jedoch beides gleichzeitig tun (ein Bild in eine Zeile einfügen, die später zugeklappt wird), wird das Bild nicht vollständig angezeigt. Als Abhilfe können Sie den Bildanker mit der Anzahl der sichtbaren Zeilen/Spalten setzen – so bleibt das Bild vollständig sichtbar, unabhängig davon, ob Zellen erweitert oder zugeklappt werden.
- Wenn einklappbare Spalten verwendet werden, kann es schwierig sein, den Kommentaranker anzupassen.
- Bei Verwendung von HSSF gibt es eine Begrenzung auf 256 Spalten pro Blatt.
—
Bei der Arbeit mit großen Datensätzen, die einen beliebigen Automatisierungsgrad erfordern, empfehlen wir dringend die Verwendung von Java zum Erstellen, Bearbeiten, Berechnen und Herunterladen der zugehörigen Excel-Dateien. Für die meisten Funktionen benötigen Sie nur wenige Zeilen Code. Danach erweist sich eine Excel-Datei, an der Sie weiter herumbasteln können, als unbezahlbar.—
Benötigen Sie weitere Ideen oder Anleitungen für den Weg „von Java zu Excel“? Dann lassen Sie es uns wissen!