Práca s programom Microsoft Excel v prostredí Java

1.Úvod

V tomto výučbe si ukážeme použitie Apache POI a JExcel API pre prácu s tabuľkami Excel.

Obidve knižnice sa dajú použiť na dynamické čítanie, zápis a úpravu obsahu tabuľky programu Excel a poskytujú efektívny spôsob integrácie programu Microsoft Excel do aplikácie Java.

2. Maven závislosti

Najprv budeme musieť pridať do našej závislosti nasledujúce závislosti pom.xml spis:

 org.apache.poi poi 3,15 org.apache.poi poi-ooxml 3,15 

Najnovšie verzie poi-ooxml a jxls-jexcel si môžete stiahnuť z Maven Central.

3. Apache POI

The Knižnica Apache POI podporuje oboje .xls a .xlsx súbory a je pre prácu so súbormi Excel zložitejšou knižnicou ako iné knižnice Java.

Poskytuje Pracovný zošit rozhranie pre modelovanie a Excel súbor a List, Riadoka Bunka rozhrania, ktoré modelujú prvky súboru Excel, ako aj implementácie každého rozhrania pre oba formáty súborov.

Pri práci s novšou .xlsx formát súboru, použili by ste XSSFWorkbook, XSSFSheet, XSSFRow a XSSFCell triedy.

Pracovať so staršími .xls formáte, použite HSSFWorkbook, HSSFSheet, HSSFRow, a HSSFCell triedy.

3.1. Čítanie z Excelu

Vytvorme metódu, ktorá otvorí a .xlsx súbor, potom načíta obsah z prvého hárku súboru.

Metóda čítania obsahu bunky sa líši v závislosti od typu údajov v bunke. Typ obsahu bunky je možné určiť pomocou getCellTypeEnum () metóda Bunka rozhranie.

Najskôr otvorme súbor z daného umiestnenia:

FileInputStream file = nový FileInputStream (nový súbor (fileLocation)); Zošit zošit = nový XSSFWorkbook (súbor);

Ďalej získame prvý hárok súboru a iterujeme každý riadok:

Hárok listu = workbook.getSheetAt (0); Mapa data = new HashMap (); int i = 0; pre (Riadok riadku: list) {data.put (i, nový ArrayList ()); pre (Cell cell: row) {switch (cell.getCellTypeEnum ()) {case STRING: ... break; prípad Numerický: ... zlomiť; prípad BOOLEAN: ... zlomiť; prípad FORMULA: ... zlomiť; predvolené: data.get (new Integer (i)). add (""); }} i ++; }

Apache POI má rôzne metódy na čítanie každého typu údajov. Rozšírime obsah vyššie uvedených prípadov prepínania.

Keď je hodnota enum typu bunky STRING, obsah sa bude čítať pomocou getRichStringCellValue () metóda Bunka rozhranie:

data.get (new Integer (i)). add (cell.getRichStringCellValue (). getString ());

Bunky s NUMERICKÉ typ obsahu môže obsahovať buď dátum, alebo číslo a čítajú sa nasledujúcim spôsobom:

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

Pre BOOLEAN hodnoty, máme getBooleanCellValue () metóda:

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

A keď je typ bunky FORMULA, môžeme použiť getCellFormula () metóda:

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

3.2. Zápis do Excelu

Apache POI používa na zápis do súboru programu Excel rovnaké rozhrania uvedené v predchádzajúcej časti a má lepšiu podporu pre styling ako JExcel.

Vytvorme metódu, ktorá zapíše zoznam osôb na hárok s názvom „Osoby“. Najskôr vytvoríme a upravíme štýl riadku hlavičky, ktorý obsahuje "Názov" a "Vek" bunky:

Zošit zošit = nový XSSFWorkbook (); Hárok listu = workbook.createSheet ("Osoby"); sheet.setColumnWidth (0, 6000); sheet.setColumnWidth (1 4000); Hlavička riadku = sheet.createRow (0); CellStyle headerStyle = workbook.createCellStyle (); headerStyle.setFillForegroundColor (IndexedColors.LIGHT_BLUE.getIndex ()); headerStyle.setFillPattern (FillPatternType.SOLID_FOREGROUND); Písmo XSSFFont = (zošit ((XSSFWorkbook) zošit)) .createFont (); font.setFontName ("Arial"); font.setFontHeightInPoints ((krátke) 16); font.setBold (true); headerStyle.setFont (písmo); Cell headerCell = header.createCell (0); headerCell.setCellValue ("Názov"); headerCell.setCellStyle (headerStyle); headerCell = header.createCell (1); headerCell.setCellValue ("Vek"); headerCell.setCellStyle (headerStyle);

Ďalej napíšme obsah tabuľky iným štýlom:

Štýl CellStyle = workbook.createCellStyle (); style.setWrapText (true); Riadok riadku = sheet.createRow (2); Bunka bunka = row.createCell (0); cell.setCellValue ("John Smith"); cell.setCellStyle (štýl); bunka = riadok.createCell (1); cell.setCellValue (20); cell.setCellStyle (štýl);

Nakoniec napíšme obsah do a „Temp.xlsx“ súbor v aktuálnom adresári a zatvorte zošit:

File proudDir = new File ("."); Cesta reťazca = currentDir.getAbsolutePath (); Reťazec fileLocation = path.substring (0, path.length () - 1) + "temp.xlsx"; FileOutputStream outputStream = nový FileOutputStream (fileLocation); workbook.write (outputStream); workbook.close ();

Vyskúšajme vyššie uvedené metódy v a JUnit test, ktorý zapíše obsah do temp.xlsx súbor potom načíta ten istý súbor a overí, či obsahuje text, ktorý sme napísali:

verejná trieda ExcelTest {súkromná ExcelPOIHelper excelPOIHelper; súkromný statický reťazec FILE_NAME = "temp.xlsx"; private String fileLocation; @ Pred verejnou neplatnosťou generateExcelFile () vyvolá IOException {File proudDir = new File ("."); Cesta reťazca = currentDir.getAbsolutePath (); fileLocation = cesta.substring (0, cesta.lenka () - 1) + SÚBOR_NAME; excelPOIHelper = nový ExcelPOIHelper (); excelPOIHelper.writeExcel (); } @Test public void whenParsingPOIExcelFile_thenCorrect () vyvolá IOException {Map data = excelPOIHelper.readExcel (fileLocation); assertEquals ("Názov", data.get (0) .get (0)); assertEquals ("Vek", data.get (0) .get (1)); assertEquals ("John Smith", data.get (1) .get (0)); assertEquals ("20", data.get (1) .get (1)); }}

4. JExcel

Knižnica JExcel je ľahká knižnica, ktorá má výhodu v tom, že je ľahšie použiteľná ako Apache POI, ale s nevýhodou, že poskytuje podporu iba pre spracovanie súborov Excel v .xls (1997-2003) formáte.

Práve teraz, .xlsx súbory nie sú podporované.

4.1. Čítanie z Excelu

Aby bolo možné pracovať so súbormi programu Excel, táto knižnica poskytuje sériu tried, ktoré predstavujú rôzne časti súboru programu Excel. The Pracovný zošit trieda predstavuje celú zbierku listov. The List trieda predstavuje jeden hárok a znak Bunka trieda predstavuje jednu bunku tabuľky.

Poďme napísať metódu, ktorá vytvorí zošit zo zadaného súboru programu Excel, získa prvý hárok súboru, potom prejde jeho obsahom a pridá každý riadok do HashMap:

verejná trieda JExcelHelper {verejná mapa readJExcel (String fileLocation) vyvolá IOException, BiffException {Map data = new HashMap (); Workbook workbook = Workbook.getWorkbook (new File (fileLocation)); Hárok listu = workbook.getSheet (0); int riadky = sheet.getRows (); int stĺpce = sheet.getColumns (); pre (int i = 0; i <riadky; i ++) {data.put (i, nový ArrayList ()); pre (int j = 0; j <stĺpce; j ++) {data.get (i) .add (sheet.getCell (j, i) .getContents ()); }} vrátiť údaje; }}

4.2. Zápis do Excelu

Na zápis do súboru Excel ponúka knižnica JExcel triedy podobné tým, ktoré sa používajú vyššie a ktoré modelujú tabuľkový súbor: WritableWorkbook, Zapisovateľný hároka WritableCell.

The WritableCell trieda má podtriedy zodpovedajúce rôznym typom obsahu možno napísať: Štítok, Dátum Čas, Číslo, Boolovský, Prázdnea Vzorec.

Táto knižnica poskytuje podporu aj pre základné formátovanie, ako je napríklad kontrola písma, farby a šírky buniek.

Poďme napísať metódu, ktorá vytvorí zošit s názvom „Temp.xls“ v aktuálnom adresári, potom napíše rovnaký obsah, aký sme napísali v časti Apache POI.

Najskôr vytvorme zošit:

File proudDir = new File ("."); Cesta reťazca = currentDir.getAbsolutePath (); Reťazec fileLocation = path.substring (0, path.length () - 1) + "temp.xls"; Zošit WritableWorkbook = Workbook.createWorkbook (nový súbor (fileLocation));

Ďalej vytvoríme prvý hárok a napíšeme hlavičku súboru programu Excel, ktorá obsahuje "Názov" a "Vek" bunky:

List WritableSheet = workbook.createSheet ("List 1", 0); WritableCellFormat headerFormat = nový WritableCellFormat (); Písmo WritableFont = nové WritableFont (WritableFont.ARIAL, 16, WritableFont.BOLD); headerFormat.setFont (písmo); headerFormat.setBackground (Colour.LIGHT_BLUE); headerFormat.setWrap (true); Label headerLabel = nový štítok (0, 0, "Názov", headerFormat); sheet.setColumnView (0, 60); sheet.addCell (headerLabel); headerLabel = nový štítok (1, 0, "Vek", headerFormat); sheet.setColumnView (0, 40); sheet.addCell (headerLabel);

S novým štýlom poďme napísať obsah tabuľky, ktorú sme vytvorili:

WritableCellFormat cellFormat = nový WritableCellFormat (); cellFormat.setWrap (true); Štítok cellLabel = nový štítok (0, 2, "John Smith", cellFormat); sheet.addCell (cellLabel); Číslo cellNumber = nové číslo (1, 2, 20, cellFormat); sheet.addCell (cellNumber);

Je veľmi dôležité pamätať na to, že do súboru chcete zapísať a na konci ho uzavrieť, aby ho mohli použiť iné procesy pomocou znaku napíš () a Zavrieť() metódy Pracovný zošit trieda:

workbook.write (); workbook.close ();

5.Záver

Tento výukový program ilustroval, ako používať Apache POI API a JExcel API na čítanie a zápis súboru Excel z programu Java.

Kompletný zdrojový kód tohto článku nájdete v projekte GitHub.


$config[zx-auto] not found$config[zx-overlay] not found