Arbeider med Microsoft Excel i Java

1.Introduksjon

I denne opplæringen vil vi demonstrere bruken av Apache POI og JExcel APIer for å jobbe med Excel-regneark.

Begge bibliotekene kan brukes til å lese, skrive og endre innholdet i et Excel-regneark dynamisk og gi en effektiv måte å integrere Microsoft Excel i et Java-program.

2. Maven-avhengigheter

For å begynne med må vi legge til følgende avhengigheter i vår pom.xml fil:

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

De siste versjonene av poi-ooxml og jxls-jexcel kan lastes ned fra Maven Central.

3. IP-adresse

De Apache POI-bibliotek støtter begge deler .xls og .xlsx filer og er et mer komplekst bibliotek enn andre Java-biblioteker for arbeid med Excel-filer.

Det gir Arbeidsbok grensesnitt for modellering av en utmerke filen og Ark, Rad, og Celle grensesnitt som modellerer elementene i en Excel-fil, samt implementeringer av hvert grensesnitt for begge filformatene.

Når du jobber med det nyere .xlsx filformat, vil du bruke XSSFWorkbook, XSSFSheet, XSSFRow og XSSFCell klasser.

Å jobbe med de eldre .xls format, bruk HSSF Arbeidsbok, HSSFSheet, HSSFRow, og HSSFCell klasser.

3.1. Lese fra Excel

La oss lage en metode som åpner en .xlsx filen, og leser deretter innholdet fra det første arket i filen.

Metoden for å lese celleinnhold varierer avhengig av typen data i cellen. Type celleinnhold kan bestemmes ved hjelp av getCellTypeEnum () metoden for Celle grensesnitt.

La oss først åpne filen fra et gitt sted:

FileInputStream-fil = ny FileInputStream (ny fil (fileLocation)); Arbeidsbok arbeidsbok = ny XSSF Arbeidsbok (fil);

Deretter, la oss hente det første arket i filen og gjenta det gjennom hver rad:

Arkark = arbeidsbok.getSheetAt (0); Kart data = ny HashMap (); int i = 0; for (Radrekke: ark) {data.put (i, ny ArrayList ()); for (Cellecelle: rad) {switch (cell.getCellTypeEnum ()) {case STRING: ... break; sak NUMERIKK: ... pause; sak BOOLEAN: ... pause; sak FORMEL: ... pause; standard: data.get (nytt heltal (i)). legg til (""); }} i ++; }

Apache POI har forskjellige metoder for å lese hver type data. La oss utvide innholdet i hvert bryterveske ovenfor.

Når celletypen enum verdi er STRING, innholdet vil bli lest med getRichStringCellValue () Metode av Celle grensesnitt:

data.get (nytt heltall (i)). legg til (cell.getRichStringCellValue (). getString ());

Celler som har NUMERISK innholdstype kan inneholde enten en dato eller et nummer og leses på følgende måte:

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

Til BOOLEAN verdier, vi har getBooleanCellValue () metode:

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

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

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

3.2. Skriver til Excel

Apache POI bruker de samme grensesnittene som ble presentert i forrige avsnitt for å skrive til en Excel-fil og har bedre støtte for styling enn JExcel.

La oss lage en metode som skriver en liste over personer til et ark med tittelen “Personer”. Først skal vi lage og style en overskriftsrad som inneholder "Navn" og "Alder" celler:

Arbeidsbok arbeidsbok = ny XSSF Arbeidsbok (); Arkark = arbeidsbok.createSheet ("Personer"); sheet.setColumnWidth (0, 6000); sheet.setColumnWidth (1, 4000); Radoverskrift = sheet.createRow (0); CellStyle headerStyle = arbeidsbok.createCellStyle (); headerStyle.setFillForegroundColor (IndexedColors.LIGHT_BLUE.getIndex ()); headerStyle.setFillPattern (FillPatternType.SOLID_FOREGROUND); XSSFFont font = ((XSSFWorkbook) arbeidsbok) .createFont (); font.setFontName ("Arial"); font.setFontHeightInPoints ((kort) 16); font.setBold (sant); headerStyle.setFont (font); Cell headerCell = header.createCell (0); headerCell.setCellValue ("Navn"); headerCell.setCellStyle (headerStyle); headerCell = header.createCell (1); headerCell.setCellValue ("Age"); headerCell.setCellStyle (headerStyle);

Deretter la oss skrive innholdet i tabellen med en annen stil:

CellStyle style = arbeidsbok.createCellStyle (); style.setWrapText (true); Raderad = ark. LageRow (2); Cellecelle = row.createCell (0); cell.setCellValue ("John Smith"); cell.setCellStyle (stil); celle = row.createCell (1); cell.setCellValue (20); cell.setCellStyle (stil);

Til slutt, la oss skrive innholdet til a ‘Temp.xlsx’ filen i gjeldende katalog og lukk arbeidsboken:

Fil currDir = ny fil ("."); Strengsti = currDir.getAbsolutePath (); Streng fileLocation = path.substring (0, path.length () - 1) + "temp.xlsx"; FileOutputStream outputStream = ny FileOutputStream (fileLocation); arbeidsbok.write (outputStream); arbeidsbok.lukk ();

La oss teste metodene ovenfor i a JUnit test som skriver innhold til temp.xlsx filen leser deretter den samme filen for å bekrefte at den inneholder teksten vi har skrevet:

offentlig klasse ExcelTest {privat ExcelPOIHelper excelPOIHelper; privat statisk streng FILE_NAME = "temp.xlsx"; privat strengfilLocation; @Før offentlig tomrom 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 ugyldig nårParsingPOIExcelFile_thenCorrect () kaster IOException {Map data = excelPOIHelper.readExcel (fileLocation); assertEquals ("Navn", data.get (0) .get (0)); assertEquals ("Age", 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 lett bibliotek som har den fordelen at det er lettere å bruke enn Apache POI, men med den ulempen at det bare gir støtte for behandling av Excel-filer i .xls (1997-2003) format.

For øyeblikket, .xlsx filer støttes ikke.

4.1. Lese fra Excel

For å jobbe med Excel-filer, tilbyr dette biblioteket en serie klasser som representerer de forskjellige delene av en Excel-fil. De Arbeidsbok klasse representerer hele arksamlingen. De Ark klasse representerer et enkelt ark, og Celle klasse representerer en enkelt celle i et regneark.

La oss skrive en metode som lager en arbeidsbok fra en spesifisert Excel-fil, får det første arket i filen, deretter krysser innholdet og legger til hver rad i en HashMap:

offentlig klasse JExcelHelper {offentlig kart readJExcel (String fileLocation) kaster IOException, BiffException {Map data = ny HashMap (); Arbeidsbok arbeidsbok = Arbeidsbok.getWorkbook (ny fil (fileLocation)); Arkark = arbeidsbok.getSheet (0); int-rader = ark.getRows (); int-kolonner = ark.getKolonner (); for (int i = 0; i <rader; 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. Skriver til Excel

For å skrive til en Excel-fil, tilbyr JExcel-biblioteket klasser som ligner på de som er brukt ovenfor, som modellerer en regnearkfil: Skrivbar arbeidsbok, Skrivbart ark, og WritableCell.

De WritableCell klasse har underklasser som tilsvarer de forskjellige typene innhold som kan skrives: Merkelapp, Dato tid, Nummer, Boolsk, Blank, og Formel.

Dette biblioteket gir også støtte for grunnleggende formateringer, for eksempel å kontrollere skrift, farge og cellebredde.

La oss skrive en metode som lager en arbeidsbok kalt ‘Temp.xls’ i den nåværende katalogen, og skriver deretter det samme innholdet som vi skrev i delen Apache POI.

La oss først lage arbeidsboken:

Fil currDir = ny fil ("."); Strengsti = currDir.getAbsolutePath (); Streng fileLocation = path.substring (0, path.length () - 1) + "temp.xls"; WritableWorkbook arbeidsbok = Workbook.createWorkbook (ny fil (fileLocation));

Deretter la oss lage det første arket og skrive overskriften til Excel-filen, som inneholder "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 (font); headerFormat.setBackground (Colour.LIGHT_BLUE); headerFormat.setWrap (true); Etikett headerLabel = ny etikett (0, 0, "Navn", headerFormat); sheet.setColumnView (0, 60); sheet.addCell (headerLabel); headerLabel = ny etikett (1, 0, "Age", headerFormat); sheet.setColumnView (0, 40); sheet.addCell (headerLabel);

Med en ny stil, la oss skrive innholdet i tabellen vi har laget:

WritableCellFormat cellFormat = ny WritableCellFormat (); cellFormat.setWrap (true); Label cellLabel = new Label (0, 2, "John Smith", cellFormat); sheet.addCell (cellLabel); Number cellNumber = new Number (1, 2, 20, cellFormat); sheet.addCell (cellNumber);

Det er veldig viktig å huske å skrive til filen og lukke den til slutt slik at den kan brukes av andre prosesser, ved hjelp av skrive() og Lukk() metoder for Arbeidsbok klasse:

arbeidsbok.skriv (); arbeidsbok.lukk ();

5.Konklusjon

Denne opplæringen har illustrert hvordan du bruker Apache POI API og JExcel API for å lese og skrive en Excel-fil fra et Java-program.

Den komplette kildekoden for denne artikkelen finner du i GitHub-prosjektet.


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