Rad s Microsoft Excelom na Javi

1.Uvod

U ovom uputstvu pokazat ćemo upotrebu API-ji Apache POI i JExcel za rad s proračunskim tablicama Excel.

Obje se knjižnice mogu koristiti za dinamičko čitanje, pisanje i izmjenu sadržaja Excel proračunske tablice i pružaju učinkovit način integracije Microsoft Excela u Java aplikaciju.

2. Ovisnosti Mavena

Za početak trebamo dodati sljedeće ovisnosti u našu pom.xml datoteka:

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

Najnovije verzije poi-ooxml i jxls-jexcel mogu se preuzeti s Maven Central.

3. Apache POI

The Apache POI knjižnica podržava oboje .xls i .xlsx datoteke i složenija je knjižnica od ostalih Java knjižnica za rad s Excel datotekama.

Pruža Radna bilježnica sučelje za modeliranje Excel datoteku i List, Red, i Ćelija sučelja koja modeliraju elemente Excel datoteke, kao i implementacije svakog sučelja za oba formata datoteka.

Pri radu s novijim .xlsx format datoteke, koristili biste XSSFWorkbook, XSSFSheet, XSSFRow i XSSFCell razreda.

Za rad sa starijima .xls formatu, koristite HSSFRadna knjiga, HSSFSheet, HSSFRow, i HSSFCell razreda.

3.1. Čitanje iz Excela

Stvorimo metodu koja otvara a .xlsx datoteku, a zatim čita sadržaj s prvog lista datoteke.

Metoda čitanja sadržaja ćelije razlikuje se ovisno o vrsti podataka u ćeliji. Vrsta sadržaja stanice može se odrediti pomoću getCellTypeEnum () metoda Ćelija sučelje.

Prvo otvorimo datoteku s određenog mjesta:

FileInputStream datoteka = novi FileInputStream (nova datoteka (fileLocation)); Radna bilježnica radne bilješke = nova XSSFWorkbook (datoteka);

Dalje, dohvatimo prvi list datoteke i prelistajmo svaki red:

List listova = workbook.getSheetAt (0); Karta podaci = nova HashMap (); int i = 0; za (Red reda: list) {data.put (i, novi ArrayList ()); za (ćelijska ćelija: red) {prekidač (cell.getCellTypeEnum ()) {slučaj STRING: ... break; PARCELA NUMERIČKA: ... prekid; slučaj BOOLEAN: ... prekid; slučaj FORMULA: ... prekid; zadano: data.get (novi Integer (i)). add (""); }} i ++; }

Apache POI ima različite metode za čitanje svake vrste podataka. Proširimo sadržaj svakog gore navedenog slučaja prekidača.

Kada je vrijednost enum tipa ćelije NIZ, sadržaj će se čitati pomoću getRichStringCellValue () metoda Ćelija sučelje:

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

Stanice koje imaju NUMERIČKI vrsta sadržaja može sadržavati datum ili broj i čita se na sljedeći način:

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

Za BOOLEAN vrijednosti, imamo getBooleanCellValue () metoda:

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

A kad je tip stanice FORMULA, možemo koristiti getCellFormula () metoda:

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

3.2. Pisanje u Excel

Apache POI koristi ista sučelja predstavljena u prethodnom odjeljku za zapisivanje u Excel datoteku i ima bolju podršku za oblikovanje od JExcela.

Stvorimo metodu koja zapisuje popis osoba na list s naslovom "Osobe". Prvo ćemo stvoriti i oblikovati redak zaglavlja koji sadrži "Ime" i "Dob" Stanice:

Radna bilježnica radne bilješke = nova XSSFWorkbook (); List listova = workbook.createSheet ("Osobe"); sheet.setColumnWidth (0, 6000); sheet.setColumnWidth (1, 4000); Zaglavlje retka = list.createRow (0); CellStyle headerStyle = workbook.createCellStyle (); headerStyle.setFillForegroundColor (IndexedColors.LIGHT_BLUE.getIndex ()); headerStyle.setFillPattern (FillPatternType.SOLID_FOREGROUND); XSSFFont font = ((XSSFWorkbook) radna knjiga) .createFont (); font.setFontName ("Arial"); font.setFontHeightInPoints ((kratki) 16); font.setBold (true); headerStyle.setFont (font); HeaderCell ćelije = header.createCell (0); headerCell.setCellValue ("Ime"); headerCell.setCellStyle (headerStyle); headerCell = header.createCell (1); headerCell.setCellValue ("Dob"); headerCell.setCellStyle (headerStyle);

Dalje, napišimo sadržaj tablice drugim stilom:

CellStyle style = workbook.createCellStyle (); style.setWrapText (true); Red reda = list.createRow (2); Ćelija ćelije = row.createCell (0); cell.setCellValue ("John Smith"); cell.setCellStyle (stil); ćelija = redak.createCell (1); cell.setCellValue (20); cell.setCellStyle (stil);

Na kraju, napišimo sadržaj u a "Temp.xlsx" datoteku u trenutnom direktoriju i zatvorite radnu knjigu:

Datoteka currDir = nova datoteka ("."); Put niza = currDir.getAbsolutePath (); String fileLocation = path.substring (0, path.length () - 1) + "temp.xlsx"; FileOutputStream outputStream = novi FileOutputStream (fileLocation); radna knjiga.write (outputStream); radna bilježnica.close ();

Isprobajmo gore navedene metode u a JUNIT test koji zapisuje sadržaj na temp.xlsx datoteka zatim čita istu datoteku kako bi potvrdila da sadrži tekst koji smo napisali:

javna klasa ExcelTest {privatni ExcelPOIHelper excelPOIHelper; privatni statički niz FILE_NAME = "temp.xlsx"; private String fileLocation; @ Prije javne praznine generirajExcelFile () baca IOException {Datoteka currDir = nova datoteka ("."); Put niza = currDir.getAbsolutePath (); fileLocation = path.substring (0, path.length () - 1) + FILE_NAME; excelPOIHelper = novi ExcelPOIHelper (); excelPOIHelper.writeExcel (); } @Test public void whenParsingPOIExcelFile_thenCorrect () baca IOException {Map podaci = excelPOIHelper.readExcel (lokacija datoteke); assertEquals ("Ime", data.get (0) .get (0)); assertEquals ("Dob", data.get (0) .get (1)); assertEquals ("John Smith", data.get (1) .get (0)); assertEquals ("20", data.get (1) .get (1)); }}

4. JExcel

Knjižnica JExcel lagana je knjižnica koja ima prednost što je jednostavnija za upotrebu od Apache POI, ali s nedostatkom što pruža samo podršku za obradu Excel datoteka u .xls (1997-2003) format.

Trenutno, .xlsx datoteke nisu podržane.

4.1. Čitanje iz Excela

Kako bi se radilo s Excel datotekama, ova knjižnica nudi niz klasa koje predstavljaju različite dijelove excel datoteke. The Radna bilježnica razred predstavlja cjelokupnu zbirku listova. The List klasa predstavlja jedan list, a Ćelija klasa predstavlja jednu ćeliju proračunske tablice.

Napišimo metodu koja stvara radnu knjigu iz navedene Excel datoteke, dobiva prvi list datoteke, zatim prelazi njezin sadržaj i dodaje svaki redak u HashMap:

javna klasa JExcelHelper {javna karta readJExcel (String fileLocation) baca IOException, BiffException {Map podaci = nova HashMap (); Radna bilježnica radne knjige = Workbook.getWorkbook (nova datoteka (fileLocation)); List listova = workbook.getSheet (0); int redovi = sheet.getRows (); int stupci = list.getColumns (); for (int i = 0; i <redovi; i ++) {data.put (i, novi ArrayList ()); za (int j = 0; j <stupci; j ++) {data.get (i) .add (sheet.getCell (j, i) .getContents ()); }} vratiti podatke; }}

4.2. Pisanje u Excel

Za pisanje u Excel datoteku, JExcel knjižnica nudi klase slične onima koje su gore korištene, a koje modeliraju datoteku proračunske tablice: WritableWorkbook, WritableSheet, i WritableCell.

The WritableCell razred ima potklase koje odgovaraju različitim vrstama sadržaja to se može napisati: Označiti, Datum vrijeme, Broj, Booleova, Prazan, i Formula.

Ova knjižnica također pruža podršku za osnovno oblikovanje, poput upravljanja fontom, bojom i širinom ćelije.

Napišimo metodu koja stvara radnu knjigu pod nazivom "Temp.xls" u trenutni direktorij, zatim piše isti sadržaj koji smo napisali u odjeljku Apache POI.

Prvo, kreirajmo radnu knjigu:

Datoteka currDir = nova datoteka ("."); Put niza = currDir.getAbsolutePath (); String fileLocation = path.substring (0, path.length () - 1) + "temp.xls"; WritableWorkbook workbook = Workbook.createWorkbook (nova datoteka (fileLocation));

Dalje, kreirajmo prvi list i napišite zaglavlje excelove datoteke koja sadrži "Ime" i "Dob" Stanice:

WritableSheet sheet = workbook.createSheet ("Sheet 1", 0); WritableCellFormat headerFormat = novi WritableCellFormat (); WritableFont font = novi WritableFont (WritableFont.ARIAL, 16, WritableFont.BOLD); headerFormat.setFont (font); headerFormat.setBackground (Colour.LIGHT_BLUE); headerFormat.setWrap (true); Oznaka headerLabel = nova oznaka (0, 0, "Ime", headerFormat); sheet.setColumnView (0, 60); sheet.addCell (headerLabel); headerLabel = nova oznaka (1, 0, "Dob", headerFormat); sheet.setColumnView (0, 40); sheet.addCell (headerLabel);

S novim stilom napišimo sadržaj tablice koju smo stvorili:

WritableCellFormat cellFormat = novi WritableCellFormat (); cellFormat.setWrap (true); Oznaka cellLabel = nova oznaka (0, 2, "John Smith", cellFormat); sheet.addCell (cellLabel); Number cellNumber = novi broj (1, 2, 20, cellFormat); sheet.addCell (cellNumber);

Vrlo je važno upamtiti da napišete u datoteku i zatvorite je na kraju kako bi je mogli koristiti drugi procesi, koristeći pisati() i Zatvoriti() metode Radna bilježnica razred:

radna bilježnica.write (); radna bilježnica.close ();

5.Zaključak

Ovaj je vodič ilustrirao kako se koristi Apache POI API i JExcel API za čitanje i pisanje Excel datoteke iz Java programa.

Kompletni izvorni kôd za ovaj članak nalazi se u projektu GitHub.