Bekerja dengan Microsoft Excel di Java

1. Pendahuluan

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

Kedua pustaka tersebut dapat digunakan untuk membaca, menulis, dan memodifikasi konten spreadsheet Excel secara dinamis dan menyediakan cara yang efektif untuk mengintegrasikan Microsoft Excel ke dalam Aplikasi Java.

2. Ketergantungan Maven

Untuk memulai, kita perlu menambahkan dependensi berikut ke file pom.xml kita :

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

Versi terbaru poi-ooxml dan jxls-jexcel dapat diunduh dari Maven Central.

3. Apache POI

The Apache POI perpustakaan mendukung kedua .xls dan .xlsx file dan perpustakaan lebih kompleks dari perpustakaan Jawa lainnya untuk bekerja dengan file Excel.

Ini menyediakan antarmuka Buku Kerja untuk memodelkan file Excel , dan antarmuka Lembar , Baris , dan Sel yang memodelkan elemen file Excel, serta implementasi setiap antarmuka untuk kedua format file.

Ketika bekerja dengan lebih baru xlsx format file, Anda akan menggunakan XSSFWorkbook, XSSFSheet, XSSFRow, dan XSSFCell kelas .

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

3.1. Membaca dari Excel

Mari buat metode yang membuka file .xlsx , lalu membaca konten dari lembar pertama file.

Metode untuk membaca konten sel berbeda-beda bergantung pada tipe data di dalam sel. Jenis konten sel bisa ditentukan menggunakan metode getCellTypeEnum () dari antarmuka Sel .

Pertama, mari buka file dari lokasi tertentu:

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

Selanjutnya, mari ambil lembar pertama file dan lakukan iterasi melalui 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 memiliki metode berbeda untuk membaca setiap jenis data. Mari kita kembangkan konten setiap switch case di atas.

Jika nilai enum jenis sel adalah STRING , konten akan dibaca menggunakan metode getRichStringCellValue () dari antarmuka Sel :

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

Sel yang memiliki tipe konten NUMERIC dapat berisi tanggal atau angka dan dibaca dengan cara berikut:

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

Untuk Boolean nilai-nilai, kita memiliki () getBooleanCellValue metode:

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

Dan jika jenis selnya FORMULA , kita bisa menggunakan metode getCellFormula () :

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

3.2. Menulis ke Excel

Apache POI menggunakan antarmuka yang sama yang disajikan di bagian sebelumnya untuk menulis ke file Excel dan memiliki dukungan yang lebih baik untuk penataan gaya daripada JExcel.

Mari buat metode yang menulis daftar orang ke lembar berjudul "Orang" . Pertama, kita akan membuat dan memberi gaya pada baris header yang berisi sel "Nama" dan "Usia" :

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);

Selanjutnya, mari kita tulis konten tabel dengan gaya berbeda:

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);

Terakhir, mari tulis konten ke file 'temp.xlsx' di direktori saat ini 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 metode di atas dalam pengujian JUnit yang menulis konten ke file temp.xlsx lalu membaca file yang sama untuk memverifikasi bahwa itu berisi 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

Pustaka JExcel adalah pustaka ringan yang memiliki keunggulan karena lebih mudah digunakan daripada Apache POI, tetapi dengan kerugiannya hanya menyediakan dukungan untuk memproses file Excel dalam format .xls (1997-2003).

Saat ini, file .xlsx tidak didukung.

4.1. Membaca dari Excel

Untuk bekerja dengan file Excel, pustaka ini menyediakan serangkaian kelas yang mewakili bagian berbeda dari file excel. Kelas Workbook mewakili seluruh koleksi sheet. Kelas Lembar mewakili satu lembar, dan kelas Sel mewakili satu sel spreadsheet.

Let's write a method that creates a workbook from a specified Excel file, gets the first sheet of the file, then traverses its content and adds each row in a 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. Writing to Excel

For writing to an Excel file, the JExcel library offers classes similar to the ones used above, that model a spreadsheet file: WritableWorkbook, WritableSheet, and WritableCell.

The WritableCell class has subclasses corresponding to the different types of content that can be written: Label, DateTime, Number, Boolean, Blank, and Formula.

This library also provides support for basic formattings, such as controlling font, color and cell width.

Let's write a method that creates a workbook called ‘temp.xls' in the current directory, then writes the same content we wrote in the Apache POI section.

First, let's create the workbook:

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));

Next, let's create the first sheet and write the header of the excel file, containing “Name” and “Age” cells:

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);

With a new style, let's write the content of the table we've created:

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);

It's very important to remember to write to the file and close it at the end so it can be used by other processes, using the write() and close() methods of Workbook class:

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

5. Kesimpulan

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

Kode sumber lengkap untuk artikel ini dapat ditemukan di proyek GitHub.