Bekerja dengan Microsoft Excel di Java

1. Pengenalan

Dalam tutorial ini, kami akan menunjukkan penggunaan API Apache POI dan JExcel untuk bekerja dengan spreadsheet Excel .

Kedua-dua perpustakaan dapat digunakan untuk membaca, menulis, dan mengubah kandungan spreadsheet Excel secara dinamis dan menyediakan cara yang berkesan untuk mengintegrasikan Microsoft Excel ke dalam Aplikasi Java.

2. Pergantungan Maven

Untuk memulakan, kita perlu menambahkan kebergantungan berikut ke fail pom.xml kami :

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

Versi terbaru poi-ooxml dan jxls-jexcel boleh dimuat turun dari Maven Central.

3. POI Apache

The perpustakaan Apache POI menyokong kedua-dua .xls dan .xlsx fail dan perpustakaan yang lebih kompleks daripada perpustakaan Java yang lain untuk bekerja dengan fail Excel.

Ini menyediakan antara muka Buku Kerja untuk memodelkan fail Excel , dan antara muka Lembaran , Baris , dan Sel yang memodelkan elemen-elemen fail Excel, serta pelaksanaan setiap antara muka untuk kedua-dua format fail.

Apabila bekerja dengan yang lebih baru .xlsx format fail, anda akan menggunakan XSSFWorkbook, XSSFSheet, XSSFRow dan XSSFCell kelas .

Untuk bekerja dengan yang lebih tua .xls format, gunakan HSSFWorkbook, HSSFSheet, HSSFRow, dan HSSFCell kelas .

3.1. Membaca dari Excel

Mari buat kaedah yang membuka fail .xlsx , kemudian membaca kandungan dari helaian pertama fail.

Kaedah untuk membaca kandungan sel berbeza bergantung pada jenis data dalam sel. Jenis kandungan sel boleh ditentukan dengan menggunakan getCellTypeEnum () kaedah yang Cell antara muka.

Pertama, mari buka fail dari lokasi tertentu:

FileInputStream file = new FileInputStream(new File(fileLocation)); Workbook workbook = new XSSFWorkbook(file);

Seterusnya, mari kita ambil helaian pertama fail dan berulang setiap baris:

Sheet sheet = workbook.getSheetAt(0); Map
    
      data = new HashMap(); int i = 0; for (Row row : sheet) { data.put(i, new ArrayList()); for (Cell cell : row) { switch (cell.getCellTypeEnum()) { case STRING: ... break; case NUMERIC: ... break; case BOOLEAN: ... break; case FORMULA: ... break; default: data.get(new Integer(i)).add(" "); } } i++; }
    

Apache POI mempunyai kaedah yang berbeza untuk membaca setiap jenis data. Mari kembangkan kandungan setiap kotak suis di atas.

Apabila nilai enum jenis sel STRING , kandungan yang akan dibaca menggunakan getRichStringCellValue () kaedah Cell muka:

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

Sel yang mempunyai jenis kandungan NUMERIC boleh mengandungi tarikh atau nombor dan dibaca dengan cara berikut:

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

Untuk nilai BOOLEAN , kami mempunyai kaedah getBooleanCellValue () :

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

Dan apabila jenis selnya FORMULA , kita boleh menggunakan kaedah getCellFormula () :

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

3.2. Menulis ke Excel

Apache POI menggunakan antara muka yang sama yang ditunjukkan pada bahagian sebelumnya untuk menulis ke fail Excel dan mempunyai sokongan yang lebih baik untuk gaya daripada JExcel.

Mari buat kaedah yang menulis senarai orang ke helaian bertajuk "Orang" . Pertama, kita akan membuat dan menggayakan baris tajuk yang mengandungi sel "Nama" dan "Umur" :

Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Persons"); sheet.setColumnWidth(0, 6000); sheet.setColumnWidth(1, 4000); Row header = sheet.createRow(0); CellStyle headerStyle = workbook.createCellStyle(); headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex()); headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); XSSFFont font = ((XSSFWorkbook) workbook).createFont(); font.setFontName("Arial"); font.setFontHeightInPoints((short) 16); font.setBold(true); headerStyle.setFont(font); Cell headerCell = header.createCell(0); headerCell.setCellValue("Name"); headerCell.setCellStyle(headerStyle); headerCell = header.createCell(1); headerCell.setCellValue("Age"); headerCell.setCellStyle(headerStyle);

Seterusnya, mari tulis isi jadual dengan gaya yang berbeza:

CellStyle style = workbook.createCellStyle(); style.setWrapText(true); Row row = sheet.createRow(2); Cell cell = row.createCell(0); cell.setCellValue("John Smith"); cell.setCellStyle(style); cell = row.createCell(1); cell.setCellValue(20); cell.setCellStyle(style);

Akhirnya, mari tulis kandungan ke fail 'temp.xlsx' di direktori semasa dan tutup buku kerja:

File currDir = new File("."); String path = currDir.getAbsolutePath(); String fileLocation = path.substring(0, path.length() - 1) + "temp.xlsx"; FileOutputStream outputStream = new FileOutputStream(fileLocation); workbook.write(outputStream); workbook.close();

Mari kita uji kaedah di atas dalam ujian JUnit yang menulis kandungan ke fail temp.xlsx kemudian membaca fail yang sama untuk mengesahkan bahawa ia mengandungi teks yang telah kita tulis:

public class ExcelTest { private ExcelPOIHelper excelPOIHelper; private static String FILE_NAME = "temp.xlsx"; private String fileLocation; @Before public void generateExcelFile() throws IOException { File currDir = new File("."); String path = currDir.getAbsolutePath(); fileLocation = path.substring(0, path.length() - 1) + FILE_NAME; excelPOIHelper = new ExcelPOIHelper(); excelPOIHelper.writeExcel(); } @Test public void whenParsingPOIExcelFile_thenCorrect() throws IOException { Map
    
      data = excelPOIHelper.readExcel(fileLocation); assertEquals("Name", 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

Perpustakaan JExcel adalah perpustakaan ringan yang mempunyai kelebihan bahawa lebih mudah digunakan daripada Apache POI, tetapi dengan kekurangannya hanya menyediakan sokongan untuk memproses fail Excel dalam format .xls (1997-2003).

Pada masa ini, fail .xlsx tidak disokong.

4.1. Membaca dari Excel

Untuk bekerja dengan fail Excel, perpustakaan ini menyediakan rangkaian kelas yang mewakili bahagian-bahagian yang berbeza dari fail excel. The Workbook kelas mewakili keseluruhan koleksi daripada helaian. The Lembaran kelas mewakili satu helaian, dan Cell kelas mewakili satu sel hamparan.

Mari tulis kaedah yang membuat buku kerja dari fail Excel yang ditentukan, mendapatkan helaian pertama fail, kemudian melintasi kandungannya dan menambahkan setiap baris dalam HashMap :

public class JExcelHelper { public Map
    
      readJExcel(String fileLocation) throws IOException, BiffException { Map
     
       data = new HashMap(); Workbook workbook = Workbook.getWorkbook(new File(fileLocation)); Sheet sheet = workbook.getSheet(0); int rows = sheet.getRows(); int columns = sheet.getColumns(); for (int i = 0; i < rows; i++) { data.put(i, new ArrayList()); for (int j = 0; j < columns; j++) { data.get(i) .add(sheet.getCell(j, i) .getContents()); } } return data; } }
     
    

4.2. Menulis ke Excel

Untuk menulis ke fail Excel, perpustakaan JExcel menawarkan kelas yang serupa dengan yang digunakan di atas, yang memodelkan fail spreadsheet: WritableWorkbook , WritableSheet , dan WritableCell .

The WritableCell kelas mempunyai subkelas sepadan dengan pelbagai jenis kandungan yang boleh ditulis: Label , DateTime , Nombor , Boolean , Blank , dan Formula .

Perpustakaan ini juga memberikan sokongan untuk format asas, seperti mengawal font, warna dan lebar sel.

Mari tulis kaedah yang membuat buku kerja yang disebut 'temp.xls' di direktori semasa, kemudian tuliskan kandungan yang sama seperti yang kita tulis di bahagian Apache POI.

Pertama, mari buat buku kerja:

File currDir = new File("."); String path = currDir.getAbsolutePath(); String fileLocation = path.substring(0, path.length() - 1) + "temp.xls"; WritableWorkbook workbook = Workbook.createWorkbook(new File(fileLocation));

Seterusnya, mari buat helaian pertama dan tulis tajuk fail excel, yang mengandungi sel "Nama" dan "Umur" :

WritableSheet sheet = workbook.createSheet("Sheet 1", 0); WritableCellFormat headerFormat = new WritableCellFormat(); WritableFont font = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD); headerFormat.setFont(font); headerFormat.setBackground(Colour.LIGHT_BLUE); headerFormat.setWrap(true); Label headerLabel = new Label(0, 0, "Name", headerFormat); sheet.setColumnView(0, 60); sheet.addCell(headerLabel); headerLabel = new Label(1, 0, "Age", headerFormat); sheet.setColumnView(0, 40); sheet.addCell(headerLabel);

Dengan gaya baru, mari tulis isi jadual yang telah kami buat:

WritableCellFormat cellFormat = new 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);

Ia sangat penting untuk ingat untuk menulis dalam fail dan tutup pada akhir supaya ia boleh digunakan oleh proses lain, menggunakan write () dan rapat () kaedah Workbook kelas:

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

5. Kesimpulannya

Tutorial ini telah menggambarkan cara menggunakan Apache POI API dan JExcel API untuk membaca dan menulis fail Excel dari program Java.

Kod sumber lengkap untuk artikel ini boleh didapati di projek GitHub.