A Microsoft Excel használata Java-ban

1.Bevezetés

Ebben az oktatóanyagban bemutatjuk a Apache POI és JExcel API-k az Excel táblázatokkal való munkához.

Mindkét könyvtár használható dinamikusan olvasható, írható és módosítható egy Excel-táblázat tartalmával, és hatékony módon integrálható a Microsoft Excel egy Java alkalmazásba.

2. Maven-függőségek

Először hozzá kell adnunk a következő függőségeket a sajátunkhoz pom.xml fájl:

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

A poi-ooxml és a jxls-jexcel legújabb verziói letölthetők a Maven Central oldaláról.

3. Apache POI

A Az Apache POI könyvtár mindkettőt támogatja .xls és .xlsx fájlokat és bonyolultabb könyvtár, mint a többi Java könyvtár, az Excel fájlokkal való munkavégzéshez.

Ez biztosítja a Munkafüzet felület modellezésére Excel fájl, és a Lap, Sor, és Sejt interfészek, amelyek modellezik az Excel fájl elemeit, valamint az egyes interfészek megvalósításai mindkét fájlformátumhoz.

Ha az újabbal dolgozik .xlsx fájl formátumban, akkor a XSSFWorkbook, XSSFSheet, XSSFRow és XSSFCell osztályok.

Dolgozni az idősebbekkel .xls formátumban használja a HSSFWorkbook, HSSFSheet, HSSFRow, és HSSFCell osztályok.

3.1. Olvasás Excelből

Hozzunk létre egy módszert, amely megnyitja a .xlsx fájlt, majd beolvassa a fájl első lapjának tartalmát.

A cellatartalom olvasásának módja a cellában lévő adatok típusától függően változik. A sejttartalom típusa a getCellTypeEnum () módszere Sejt felület.

Először nyissuk meg a fájlt egy adott helyről:

FileInputStream file = új FileInputStream (új File (fileLocation)); Munkafüzet munkafüzet = új XSSFWorkbook (fájl);

Ezután töltsük le a fájl első lapját, és ismételjük meg az egyes sorokat:

Laplap = munkafüzet.getSheetAt (0); Térkép adatok = új HashMap (); int i = 0; for (Sor sor: lap) {data.put (i, új ArrayList ()); for (Cellasejt: sor) {switch (cell.getCellTypeEnum ()) {eset STRING: ... törés; eset SZÁM: ... törés; eset BOOLEAN: ... törés; eset FORMULA: ... törés; alapértelmezett: data.get (új egész szám (i)). add (""); }} i ++; }

Az Apache POI különböző módszerekkel olvashatja el az egyes adattípusokat. Bővítsük a fenti kapcsoló esetek tartalmát.

Amikor a cellatípus enum értéke HÚR, a tartalmat a getRichStringCellValue () a metódusa Sejt felület:

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

Sejtek, amelyek NUMERIC a tartalom típusa tartalmazhat dátumot vagy számot, és a következő módon olvasható:

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

Mert BOOLAI értékek, megvan a getBooleanCellValue () módszer:

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

És amikor a sejttípus KÉPLET, használhatjuk a getCellFormula () módszer:

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

3.2. Írás Excelbe

Az Apache POI ugyanazokat a felületeket használja, mint az előző szakaszban, az Excel fájlokba történő íráshoz, és jobban támogatja a stílust, mint a JExcel.

Hozzunk létre egy olyan módszert, amely személyek listáját írja egy lapra a címmel „Személyek”. Először létrehozunk és stilizálunk egy fejléc sort, amely tartalmazza "Név" és "Kor" cellák:

Munkafüzet munkafüzet = new XSSFWorkbook (); Laplap = munkafüzet.createSheet ("Személyek"); sheet.setColumnWidth (0, 6000); sheet.setColumnWidth (1, 4000); Sorfejléc = sheet.createRow (0); CellStyle headerStyle = munkafüzet.createCellStyle (); headerStyle.setFillForegroundColor (IndexedColors.LIGHT_BLUE.getIndex ()); headerStyle.setFillPattern (FillPatternType.SOLID_FOREGROUND); XSSFFont font = ((XSSFWorkbook) munkafüzet) .createFont (); font.setFontName ("Arial"); font.setFontHeightInPoints ((rövid) 16); font.setBold (true); headerStyle.setFont (font); Cell headerCell = header.createCell (0); headerCell.setCellValue ("Név"); headerCell.setCellStyle (headerStyle); headerCell = header.createCell (1); headerCell.setCellValue ("Age"); headerCell.setCellStyle (headerStyle);

Ezután írjuk meg a táblázat tartalmát más stílusban:

CellStyle stílus = munkafüzet.createCellStyle (); style.setWrapText (true); Sor sor = sheet.createRow (2); Cellasejt = row.createCell (0); cell.setCellValue ("John Smith"); cell.setCellStyle (stílus); cell = sor.createCell (1); cell.setCellValue (20); cell.setCellStyle (stílus);

Végül írjuk a tartalmat a ’Temp.xlsx’ fájlt az aktuális könyvtárban, és zárja be a munkafüzetet:

Fájl currDir = új Fájl ("."); Karakterlánc útvonala = currDir.getAbsolutePath (); String fileLocation = path.substring (0, path.length () - 1) + "temp.xlsx"; FileOutputStream outputStream = új FileOutputStream (fileLocation); munkafüzet.write (outputStream); munkafüzet.close ();

Teszteljük a fenti módszereket a JUnit teszt, amely tartalmat ír a temp.xlsx Ezután a fájl elolvassa ugyanazt a fájlt, hogy ellenőrizze, tartalmazza-e az általunk írt szöveget:

nyilvános osztály ExcelTest {privát ExcelPOIHelper excelPOIHelper; privát statikus karakterlánc FILE_NAME = "temp.xlsx"; privát karakterlánc fileLocation; @A nyilvános void előtt generExcelFile () dobja az IOException {File currDir = new File ("."); Karakterlánc útvonala = currDir.getAbsolutePath (); fileLocation = path.substring (0, path.length () - 1) + FILE_NAME; excelPOIHelper = új ExcelPOIHelper (); excelPOIHelper.writeExcel (); } @Test public void, amikorParsingPOIExcelFile_thenCorrect () dobja az IOException {Map adatok = excelPOIHelper.readExcel (fileLocation); assertEquals ("Név", data.get (0) .get (0)); assertEquals ("Kor", data.get (0) .get (1)); assertEquals ("John Smith", data.get (1) .get (0)); assertEquals ("20", data.get (1) .get (1)); }}

4. JExcel

A JExcel könyvtár egy könnyű könyvtár, amelynek előnye, hogy könnyebben használható, mint az Apache POI, de azzal a hátránnyal, hogy csak az Excel fájlok feldolgozását támogatja a .xls (1997-2003) formátumban.

Pillanatnyilag, .xlsx fájlok nem támogatottak.

4.1. Olvasás Excelből

Az Excel fájlokkal való munka érdekében ez a könyvtár osztályok sorozatát biztosítja, amelyek az Excel fájl különböző részeit képviselik. A Munkafüzet osztály képviseli a teljes lapgyűjteményt. A Lap osztály egyetlen lapot képvisel, és a Sejt osztály egy táblázat egyetlen celláját jelenti.

Írjunk egy metódust, amely létrehoz egy munkafüzetet egy megadott Excel fájlból, megkapja a fájl első lapját, majd bejárja annak tartalmát, és minden sort hozzáad egy HashMap:

nyilvános osztály JExcelHelper {public Map A readJExcel (String fileLocation) dobja az IOException, BiffException {Map adatok = új HashMap (); Munkafüzet munkafüzet = Workbook.getWorkbook (új fájl (fileLocation)); Laplap = munkafüzet.getSheet (0); int sorok = sheet.getRows (); int oszlopok = sheet.getColumns (); for (int i = 0; i <sorok; i ++) {data.put (i, új ArrayList ()); for (int j = 0; j <oszlopok; j ++) {data.get (i) .add (sheet.getCell (j, i) .getContents ()); }} visszatérési adatok; }}

4.2. Írás Excelbe

Excel-fájlba történő íráshoz a JExcel könyvtár a fentiekhez hasonló osztályokat kínál, amelyek táblázatfájlt modelleznek: WritableWorkbook, WritableSheet, és WritableCell.

A WritableCell osztálynak vannak alosztályai, amelyek megfelelnek a különböző típusú tartalmaknak írható: Címke, Dátum idő, Szám, Logikai, Üres, és Képlet.

Ez a könyvtár támogatja az alapvető formázásokat is, például a betűtípus, a szín és a cellaszélesség szabályozását.

Írjunk egy módszert, amellyel létrehozhatunk egy munkafüzetet „Temp.xls” az aktuális könyvtárba, majd ugyanazt a tartalmat írja, amelyet az Apache POI szakaszában írtunk.

Először hozzuk létre a munkafüzetet:

Fájl currDir = új Fájl ("."); Karakterlánc útvonala = currDir.getAbsolutePath (); String fileLocation = path.substring (0, path.length () - 1) + "temp.xls"; WritableWorkbook workbook = Munkafüzet.createWorkbook (új fájl (fileLocation));

Ezután hozzuk létre az első lapot, és írjuk meg az excel fájl fejlécét, amely tartalmazza "Név" és "Kor" cellák:

WritableSheet munkalap = munkafüzet.createSheet ("1. lap", 0); WritableCellFormat headerFormat = new WritableCellFormat (); WritableFont font = new WritableFont (WritableFont.ARIAL, 16, WritableFont.BOLD); headerFormat.setFont (font); headerFormat.setBackground (Szín.LIGHT_BLUE); headerFormat.setWrap (true); Label headerLabel = new Label (0, 0, "Név", headerFormat); sheet.setColumnView (0, 60); sheet.addCell (headerLabel); headerLabel = new Label (1, 0, "Age", headerFormat); sheet.setColumnView (0, 40); sheet.addCell (headerLabel);

Új stílusban írjuk meg a létrehozott táblázat tartalmát:

WritableCellFormat cellFormat = new WritableCellFormat (); cellFormat.setWrap (true); Label cellLabel = új címke (0, 2, "John Smith", cellFormat); sheet.addCell (cellLabel); Number cellNumber = új szám (1, 2, 20, cellFormat); sheet.addCell (cellNumber);

Nagyon fontos, hogy ne felejtsen el írni a fájlba, és bezárni a végén, hogy más folyamatok is használhassák, a ír() és Bezárás() módszerei Munkafüzet osztály:

munkafüzet.írja (); munkafüzet.close ();

5.Következtetés

Ez az oktatóanyag bemutatta a Apache POI API és JExcel API Excel fájlok Java programból történő olvasására és írására.

A cikk teljes forráskódja a GitHub projektben található.