Arbejde med Microsoft Excel i Java

1.Introduktion

I denne vejledning vil vi demonstrere brugen af Apache POI og JExcel API'er til arbejde med Excel-regneark.

Begge biblioteker kan bruges til dynamisk at læse, skrive og ændre indholdet af et Excel-regneark og give en effektiv måde at integrere Microsoft Excel i en Java-applikation.

2. Maven-afhængigheder

For at begynde med bliver vi nødt til at tilføje følgende afhængigheder til vores pom.xml fil:

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

De nyeste versioner af poi-ooxml og jxls-jexcel kan downloades fra Maven Central.

3. Apache IP

Det Apache POI-bibliotek understøtter begge dele .xls og .xlsx filer og er et mere komplekst bibliotek end andre Java-biblioteker til arbejde med Excel-filer.

Det giver den Arbejdsbog interface til modellering af en Excel fil og Ark, Rækkeog Celle grænseflader, der modellerer elementerne i en Excel-fil samt implementeringer af hver grænseflade til begge filformater.

Når du arbejder med det nyere .xlsx filformat, bruger du XSSFWorkbook, XSSFSheet, XSSFRow og XSSFCell klasser.

At arbejde med de ældre .xls format, skal du bruge HSSFWorkbook, HSSFSheet, HSSFRow, og HSSFCell klasser.

3.1. Læsning fra Excel

Lad os oprette en metode, der åbner en .xlsx fil, læser derefter indhold fra det første ark i filen.

Metoden til læsning af celleindhold varierer afhængigt af typen af ​​data i cellen. Celleindholdet kan bestemmes ved hjælp af getCellTypeEnum () metode til Celle interface.

Lad os først åbne filen fra en given placering:

FileInputStream-fil = ny FileInputStream (ny fil (fileLocation)); Arbejdsbog projektmappe = ny XSSF Arbejdsbog (fil);

Lad os derefter hente det første ark i filen og gentage det gennem hver række:

Arkark = projektmappe.getSheetAt (0); Kort data = nyt HashMap (); int i = 0; for (Række række: ark) {data.put (i, ny ArrayList ()); for (Cellecelle: række) {switch (cell.getCellTypeEnum ()) {case STRING: ... break; sag NUMERIK: ... pause; sag BOOLEAN: ... pause; sag FORMEL: ... pause; standard: data.get (nyt heltal (i)). tilføj (""); }} i ++; }

Apache POI har forskellige metoder til læsning af hver type data. Lad os udvide indholdet af hver switch case ovenfor.

Når celletypens enumværdi er SNOR, indholdet læses ved hjælp af getRichStringCellValue () metode til Celle grænseflade:

data.get (nyt heltal (i)). tilføj (cell.getRichStringCellValue (). getString ());

Celler, der har NUMERISK indholdstype kan indeholde enten en dato eller et nummer og læses på følgende måde:

hvis (DateUtil.isCellDateFormatted (celle)) {data.get (i) .add (cell.getDateCellValue () + ""); } andet {data.get (i) .add (cell.getNumericCellValue () + ""); }

Til BOOLEAN værdier, vi har getBooleanCellValue () metode:

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

Og når celletypen er FORMEL, kan vi bruge getCellFormula () metode:

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

3.2. Skrivning til Excel

Apache POI bruger de samme grænseflader, der blev præsenteret i det foregående afsnit til at skrive til en Excel-fil og har bedre understøttelse af styling end JExcel.

Lad os oprette en metode, der skriver en liste over personer til et ark med titlen “Personer”. Først opretter og stiler vi en overskriftrække, der indeholder "Navn" og "Alder" celler:

Arbejdsbog projektmappe = ny XSSF Arbejdsbog (); Arkark = projektmappe.createSheet ("Personer"); sheet.setColumnWidth (0, 6000); sheet.setColumnWidth (1, 4000); Rækkeoverskrift = sheet.createRow (0); CellStyle headerStyle = projektmappe.createCellStyle (); headerStyle.setFillForegroundColor (IndexedColors.LIGHT_BLUE.getIndex ()); headerStyle.setFillPattern (FillPatternType.SOLID_FOREGROUND); XSSFFont font = ((XSSFWorkbook) projektmappe) .createFont (); font.setFontName ("Arial"); font.setFontHeightInPoints ((kort) 16); font.setBold (sand); headerStyle.setFont (skrifttype); Cell headerCell = header.createCell (0); headerCell.setCellValue ("Navn"); headerCell.setCellStyle (headerStyle); headerCell = header.createCell (1); headerCell.setCellValue ("Alder"); headerCell.setCellStyle (headerStyle);

Lad os derefter skrive indholdet af tabellen i en anden stil:

CellStyle style = workbook.createCellStyle (); style.setWrapText (sand); Række række = ark. Skab Række (2); Cellecelle = række.createCell (0); cell.setCellValue ("John Smith"); cell.setCellStyle (stil); celle = række.createCell (1); cell.setCellValue (20); cell.setCellStyle (stil);

Lad os endelig skrive indholdet til en 'Temp.xlsx' fil i det aktuelle bibliotek, og luk projektmappen:

Fil currDir = ny fil ("."); Strengsti = currDir.getAbsolutePath (); Streng fileLocation = sti.substring (0, sti.længde () - 1) + "temp.xlsx"; FileOutputStream outputStream = ny FileOutputStream (fileLocation); workbook.write (outputStream); workbook.close ();

Lad os teste ovenstående metoder i a JUnit test der skriver indhold til temp.xlsx filen læser derefter den samme fil for at kontrollere, at den indeholder den tekst, vi har skrevet:

offentlig klasse ExcelTest {privat ExcelPOIHelper excelPOIHelper; privat statisk streng FILE_NAME = "temp.xlsx"; privat streng filLocation; @Før offentlig tomrum generererExcelFile () kaster IOException {File currDir = ny fil ("."); Strengsti = currDir.getAbsolutePath (); fileLocation = path.substring (0, path.length () - 1) + FILE_NAME; excelPOIHelper = ny ExcelPOIHelper (); excelPOIHelper.writeExcel (); } @Test offentlig ugyldigt nårParsingPOIExcelFile_thenCorrect () kaster IOException {Map data = excelPOIHelper.readExcel (fileLocation); assertEquals ("Navn", data.get (0) .get (0)); assertEquals ("Alder", data.get (0) .get (1)); assertEquals ("John Smith", data.get (1) .get (0)); assertEquals ("20", data.get (1) .get (1)); }}

4. JExcel

JExcel-biblioteket er et letvægtsbibliotek med den fordel, at det er lettere at bruge end Apache POI, men med den ulempe, at det kun understøtter behandling af Excel-filer i .xls (1997-2003) format.

I øjeblikket, .xlsx filer understøttes ikke.

4.1. Læsning fra Excel

For at arbejde med Excel-filer tilbyder dette bibliotek en række klasser, der repræsenterer de forskellige dele af en excel-fil. Det Arbejdsbog klasse repræsenterer hele samlingen af ​​ark. Det Ark klasse repræsenterer et enkelt ark, og Celle klasse repræsenterer en enkelt celle i et regneark.

Lad os skrive en metode, der opretter en projektmappe ud fra en bestemt Excel-fil, får det første ark i filen, derefter gennemgår dets indhold og tilføjer hver række i en HashMap:

offentlig klasse JExcelHelper {offentligt kort readJExcel (String fileLocation) kaster IOException, BiffException {Map data = nyt HashMap (); Workbook workbook = Workbook.getWorkbook (ny fil (fileLocation)); Arkark = projektmappe.getSheet (0); int-rækker = ark.getRows (); int-kolonner = ark.getKolonner (); for (int i = 0; i <rækker; i ++) {data.put (i, ny ArrayList ()); for (int j = 0; j <kolonner; j ++) {data.get (i) .add (sheet.getCell (j, i) .getContents ()); }} returner data }}

4.2. Skrivning til Excel

For at skrive til en Excel-fil tilbyder JExcel-biblioteket klasser svarende til dem, der er brugt ovenfor, der modellerer et regnearkfil: Skrivbar Arbejdsbog, Skrivbart arkog WritableCell.

Det WritableCell klasse har underklasser svarende til de forskellige typer indhold der kan skrives: Etiket, Dato tid, Nummer, Boolsk, Blankog Formel.

Dette bibliotek understøtter også grundlæggende formatering, såsom styring af skrifttype, farve og cellebredde.

Lad os skrive en metode, der opretter en projektmappe kaldet 'Temp.xls' i den aktuelle mappe, skriver derefter det samme indhold, som vi skrev i afsnittet Apache POI.

Lad os først oprette projektmappen:

Fil currDir = ny fil ("."); Strengsti = currDir.getAbsolutePath (); Streng fileLocation = sti.substring (0, sti.længde () - 1) + "temp.xls"; WritableWorkbook-projektmappe = Workbook.createWorkbook (ny fil (fileLocation));

Lad os derefter oprette det første ark og skrive overskriften til excel-filen, der indeholder "Navn" og "Alder" celler:

WritableSheet sheet = workbook.createSheet ("Sheet 1", 0); WritableCellFormat headerFormat = ny WritableCellFormat (); WritableFont font = new WritableFont (WritableFont.ARIAL, 16, WritableFont.BOLD); headerFormat.setFont (skrifttype); headerFormat.setBackground (Colour.LIGHT_BLUE); headerFormat.setWrap (sand); Label headerLabel = ny etiket (0, 0, "Navn", headerFormat); sheet.setColumnView (0, 60); sheet.addCell (headerLabel); headerLabel = ny etiket (1, 0, "Alder", headerFormat); sheet.setColumnView (0, 40); sheet.addCell (headerLabel);

Med en ny stil, lad os skrive indholdet af den tabel, vi har oprettet:

WritableCellFormat cellFormat = ny WritableCellFormat (); cellFormat.setWrap (sand); Mærke cellLabel = ny etiket (0, 2, "John Smith", cellFormat); sheet.addCell (cellLabel); Number cellNumber = nyt nummer (1, 2, 20, cellFormat); sheet.addCell (cellNumber);

Det er meget vigtigt at huske at skrive til filen og lukke den i slutningen, så den kan bruges af andre processer ved hjælp af skrive() og tæt() metoder til Arbejdsbog klasse:

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

5.Konklusion

Denne vejledning har illustreret, hvordan du bruger Apache IP API og JExcel API til at læse og skrive en Excel-fil fra et Java-program.

Den komplette kildekode til denne artikel kan findes i GitHub-projektet.