Werken met Microsoft Excel in Java

1.Invoering

In deze tutorial demonstreren we het gebruik van de Apache POI en JExcel API's voor het werken met Excel-spreadsheets.

Beide bibliotheken kunnen worden gebruikt om de inhoud van een Excel-spreadsheet dynamisch te lezen, te schrijven en te wijzigen en bieden een effectieve manier om Microsoft Excel te integreren in een Java-applicatie.

2. Maven afhankelijkheden

Om te beginnen moeten we de volgende afhankelijkheden toevoegen aan onze pom.xml het dossier:

 org.apache.poi poi 3.15 org.apache.poi poi-ooxml 3.15 

De nieuwste versies van poi-ooxml en jxls-jexcel kunnen worden gedownload vanaf Maven Central.

3. Apache POI

De Apache POI-bibliotheek ondersteunt beide .xls en .xlsx bestanden en is een complexere bibliotheek dan andere Java-bibliotheken voor het werken met Excel-bestanden.

Het biedt de Werkboek interface voor het modelleren van een Excel bestand en het Vel, Rij, en Cel interfaces die de elementen van een Excel-bestand modelleren, evenals implementaties van elke interface voor beide bestandsindelingen.

Bij het werken met de nieuwere .xlsx bestandsformaat, zou u de XSSFWorkbook, XSSFSheet, XSSFRow en XSSFCell klassen.

Om met de ouderen te werken .xls formaat, gebruik dan het HSSFWorkbook, HSSFSheet, HSSFRow, en HSSFCell klassen.

3.1. Lezen vanuit Excel

Laten we een methode maken die een .xlsx bestand en leest vervolgens de inhoud van het eerste blad van het bestand.

De methode voor het lezen van celinhoud varieert afhankelijk van het type gegevens in de cel. Het type celinhoud kan worden bepaald met behulp van de getCellTypeEnum () methode van de Cel koppel.

Laten we eerst het bestand openen vanaf een bepaalde locatie:

FileInputStream-bestand = nieuwe FileInputStream (nieuw bestand (fileLocation)); Werkboekwerkmap = nieuw XSSFWorkbook (bestand);

Laten we vervolgens het eerste blad van het bestand ophalen en elke rij doorlopen:

Bladblad = werkmap.getSheetAt (0); Kaart data = nieuwe HashMap (); int i = 0; voor (Rij rij: blad) {data.put (i, nieuwe ArrayList ()); for (Cell cell: row) {switch (cell.getCellTypeEnum ()) {case STRING: ... break; geval NUMERIEK: ... pauze; geval BOOLEAN: ... pauze; geval FORMULE: ... pauze; standaard: data.get (nieuw geheel getal (i)). add (""); }} i ++; }

Apache POI heeft verschillende methoden om elk type gegevens te lezen. Laten we de inhoud van elke switchcase hierboven verder uitdiepen.

Wanneer de opsommingswaarde van het celtype DRAAD, wordt de inhoud gelezen met de getRichStringCellValue () methode van Cel koppel:

data.get (nieuw geheel getal (i)). add (cell.getRichStringCellValue (). getString ());

Cellen met de NUMERIEK inhoudstype kan een datum of een cijfer bevatten en wordt op de volgende manier gelezen:

if (DateUtil.isCellDateFormatted (cel)) {data.get (i) .add (cell.getDateCellValue () + ""); } anders {data.get (i) .add (cell.getNumericCellValue () + ""); }

Voor BOOLEAN waarden, we hebben de getBooleanCellValue () methode:

data.get (i) .add (cell.getBooleanCellValue () + "");

En wanneer het celtype is FORMULE, kunnen we de getCellFormula () methode:

data.get (i) .add (cell.getCellFormula () + "");

3.2. Schrijven naar Excel

Apache POI gebruikt dezelfde interfaces die in de vorige sectie zijn gepresenteerd om naar een Excel-bestand te schrijven en heeft betere ondersteuning voor styling dan JExcel.

Laten we een methode maken die een lijst met personen naar een blad met de titel schrijft "Personen". Eerst zullen we een koprij maken en opmaken die bevat "Naam" en "Leeftijd" cellen:

Werkboekwerkmap = nieuw XSSFWorkbook (); Sheet sheet = workbook.createSheet ("Personen"); sheet.setColumnWidth (0, 6000); sheet.setColumnWidth (1, 4000); Rij header = sheet.createRow (0); CellStyle headerStyle = workbook.createCellStyle (); headerStyle.setFillForegroundColor (IndexedColors.LIGHT_BLUE.getIndex ()); headerStyle.setFillPattern (FillPatternType.SOLID_FOREGROUND); XSSFFont font = ((XSSFWorkbook) werkmap) .createFont (); font.setFontName ("Arial"); font.setFontHeightInPoints ((kort) 16); font.setBold (true); headerStyle.setFont (lettertype); Cel headerCell = header.createCell (0); headerCell.setCellValue ("Naam"); headerCell.setCellStyle (headerStyle); headerCell = header.createCell (1); headerCell.setCellValue ("Leeftijd"); headerCell.setCellStyle (headerStyle);

Laten we vervolgens de inhoud van de tabel in een andere stijl schrijven:

CellStyle-stijl = werkmap.createCellStyle (); style.setWrapText (true); Rij rij = sheet.createRow (2); Celcel = rij.createCell (0); cell.setCellValue ("John Smith"); cell.setCellStyle (stijl); cell = row.createCell (1); cell.setCellValue (20); cell.setCellStyle (stijl);

Laten we tot slot de inhoud naar een ‘Temp.xlsx ' bestand in de huidige map en sluit de werkmap:

Bestand currDir = nieuw bestand ("."); Tekenreekspad = currDir.getAbsolutePath (); String fileLocation = path.substring (0, path.length () - 1) + "temp.xlsx"; FileOutputStream outputStream = nieuwe FileOutputStream (fileLocation); werkmap.write (outputStream); werkmap.close ();

Laten we de bovenstaande methoden testen in een JUnit test die inhoud naar het temp.xlsx bestand leest vervolgens hetzelfde bestand om te verifiëren dat het de tekst bevat die we hebben geschreven:

openbare klasse ExcelTest {privé ExcelPOIHelper excelPOIHelper; private static String FILE_NAME = "temp.xlsx"; private String fileLocation; @Before public void generationExcelFile () gooit IOException {File currDir = new File ("."); Tekenreekspad = currDir.getAbsolutePath (); fileLocation = path.substring (0, path.length () - 1) + FILE_NAME; excelPOIHelper = nieuwe ExcelPOIHelper (); excelPOIHelper.writeExcel (); } @Test public void whenParsingPOIExcelFile_thenCorrect () gooit IOException {Map data = excelPOIHelper.readExcel (fileLocation); assertEquals ("Naam", data.get (0) .get (0)); assertEquals ("Leeftijd", data.get (0) .get (1)); assertEquals ("John Smith", data.get (1) .get (0)); assertEquals ("20", data.get (1) .get (1)); }}

4. JExcel

De JExcel-bibliotheek is een lichtgewicht bibliotheek met het voordeel dat deze gemakkelijker te gebruiken is dan Apache POI, maar met het nadeel dat deze alleen ondersteuning biedt voor het verwerken van Excel-bestanden in de .xls (1997-2003) formaat.

Momenteel, .xlsx bestanden worden niet ondersteund.

4.1. Lezen vanuit Excel

Om met Excel-bestanden te kunnen werken, biedt deze bibliotheek een reeks klassen die de verschillende delen van een Excel-bestand vertegenwoordigen. De Werkboek class vertegenwoordigt de volledige verzameling vellen. De Vel class staat voor een enkel blad, en de Cel class vertegenwoordigt een enkele cel van een spreadsheet.

Laten we een methode schrijven die een werkmap maakt van een gespecificeerd Excel-bestand, het eerste blad van het bestand ophaalt, vervolgens de inhoud doorloopt en elke rij in een Hash kaart:

openbare klasse JExcelHelper {openbare kaart readJExcel (String fileLocation) gooit IOException, BiffException {Map data = nieuwe HashMap (); Workbook workbook = Workbook.getWorkbook (nieuw bestand (fileLocation)); Bladblad = werkmap.getSheet (0); int rijen = sheet.getRows (); int kolommen = sheet.getColumns (); voor (int i = 0; i <rijen; i ++) {data.put (i, nieuwe ArrayList ()); voor (int j = 0; j <kolommen; j ++) {data.get (i) .add (sheet.getCell (j, i) .getContents ()); }} gegevens retourneren; }}

4.2. Schrijven naar Excel

Om naar een Excel-bestand te schrijven, biedt de JExcel-bibliotheek klassen die vergelijkbaar zijn met de hierboven gebruikte klassen, die een spreadsheetbestand modelleren: WritableWorkbook, WritableSheet, en WritableCell.

De WritableCell klasse heeft subklassen die overeenkomen met de verschillende soorten inhoud dat kan worden geschreven: Etiket, Datum Tijd, Aantal, Boolean, Blank, en Formule.

Deze bibliotheek biedt ook ondersteuning voor basisopmaak, zoals het regelen van lettertype, kleur en celbreedte.

Laten we een methode schrijven die een werkmap maakt met de naam ‘Temp.xls ' in de huidige directory en schrijft vervolgens dezelfde inhoud die we schreven in de Apache POI-sectie.

Laten we eerst de werkmap maken:

Bestand currDir = nieuw bestand ("."); Tekenreekspad = currDir.getAbsolutePath (); String fileLocation = path.substring (0, path.length () - 1) + "temp.xls"; WritableWorkbook-werkmap = Workbook.createWorkbook (nieuw bestand (fileLocation));

Laten we vervolgens het eerste blad maken en de koptekst van het Excel-bestand schrijven, met daarin "Naam" en "Leeftijd" cellen:

WritableSheet sheet = workbook.createSheet ("Sheet 1", 0); WritableCellFormat headerFormat = nieuwe WritableCellFormat (); WritableFont font = nieuw WritableFont (WritableFont.ARIAL, 16, WritableFont.BOLD); headerFormat.setFont (lettertype); headerFormat.setBackground (Colour.LIGHT_BLUE); headerFormat.setWrap (true); Label headerLabel = nieuw label (0, 0, "Naam", headerFormat); sheet.setColumnView (0, 60); sheet.addCell (headerLabel); headerLabel = nieuw label (1, 0, "Age", headerFormat); sheet.setColumnView (0, 40); sheet.addCell (headerLabel);

Laten we met een nieuwe stijl de inhoud schrijven van de tabel die we hebben gemaakt:

WritableCellFormat cellFormat = nieuwe WritableCellFormat (); cellFormat.setWrap (true); Label cellLabel = nieuw label (0, 2, "Jan Smit", cellFormat); sheet.addCell (cellLabel); Number cellNumber = nieuw nummer (1, 2, 20, cellFormat); sheet.addCell (cellNumber);

Het is erg belangrijk om te onthouden om naar het bestand te schrijven en het aan het einde te sluiten, zodat het door andere processen kan worden gebruikt met behulp van de schrijven() en dichtbij() methodes van Werkboek klasse:

werkmap.write (); werkmap.close ();

5.Conclusie

Deze tutorial heeft geïllustreerd hoe je de Apache POI API en JExcel API om een ​​Excel-bestand te lezen en te schrijven vanuit een Java-programma.

De volledige broncode voor dit artikel is te vinden in het GitHub-project.