Đọc ghi file Excel bằng Java sử dụng Apache POI

Đọc ghi file Excel bằng Java sử dụng Apache POI

1. Apache POI là gì?

Apache POI là một thư viện mã nguồn mở cung cấp bởi apache được sử dụng để xử lý các file office như word, excel, powerpoint…

1.1 Xử lý file Excel với Apache POI

Apache POI xử lý các thành phần trong excel theo đúng lập trình hướng đối tượng – mỗi thành phần trong Excel đều được coi như 1 đối tượng.

Các class cơ bản được dùng để đọc ghi file Excel

  • HSSF: các class có tên bắt đầu là HSSF được dùng để sử lý các file Microsoft Excel 2003 (.xls)
  • XSSF: các class có tên bắt đầu là XSSF được dùng để sử lý các file Microsoft Excel 2007 trở về sau (.xlsx)
  • XSSFWorkbookHSSFWorkbook là các class xử lý với Excel Workbook
  • HSSFSheetXSSFSheet là các class xử lý với Excel Worksheet
  • Row: định nghĩa một dòng trong excel
  • Cell: định nghĩa một ô trong excel

(Xem thêm: phân biệt workbook với worksheet)

2. Download thư viện Apache POI

Ở đây mình sử dụng maven để lấy thư viện của Apache POI.

  • Cho các file Microsoft Excel 2003
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
  • Cho các file Microsoft Excel 2007 trở về sau
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

 

3. Đọc ghi file Excel bằng Apache POI

3.1 Ghi file Excel

Ví dụ đoạn code dưới đây tạo 1 file excel có name là “Demo-ApachePOI-Excel.xlsx”

Tạo 1 Worksheet có name là “Customer_Info”

dòng đầu tiên hiển thị “List Of Customer”

Các dòng tiếp theo hiển thị các thông tin của customer (id, name, email), mỗi thông tin ở 1 column.

package stackjava.com.apachepoiexcel.demo;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class WriteFileExcel {

  public static void main(String[] args) {
    System.out.println("Create file excel");
    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("Customer_Info");
    int rowNum = 0;
    Row firstRow = sheet.createRow(rowNum++);
    Cell firstCell = firstRow.createCell(0);
    firstCell.setCellValue("List of Customer");

    List<Customer> listOfCustomer = new ArrayList<Customer>();
    listOfCustomer.add(new Customer(1, "Sylvester Stallone", "abc@gmail.com"));
    listOfCustomer.add(new Customer(2, "Tom Cruise", "xyz@yahoo.com"));
    listOfCustomer.add(new Customer(3, "Vin Diesel", "abc@hotmail.com"));

    for (Customer customer : listOfCustomer) {
      Row row = sheet.createRow(rowNum++);
      Cell cell1 = row.createCell(0);
      cell1.setCellValue(customer.getId());

      Cell cell2 = row.createCell(1);
      cell2.setCellValue(customer.getName());

      Cell cell3 = row.createCell(2);
      cell3.setCellValue(customer.getEmail());
    }

    try {
      FileOutputStream outputStream = new FileOutputStream("Demo-ApachePOI-Excel.xlsx");
      workbook.write(outputStream);
      workbook.close();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    System.out.println("Done");
  }
}
package stackjava.com.apachepoiexcel.demo;

public class Customer {
  private int id;
  private String name;
  private String email;

  // setter - getter

}

Kết quả:

Đọc ghi file Excel bằng Java sử dụng Apache POI

3.2 Đọc file Excel

Bây giờ mình sẽ thực hiện đọc lại file Excel vừa tạo ở trên:

package stackjava.com.apachepoiexcel.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadFileExcel {

  public static void main(String[] args) {

    try {
      FileInputStream excelFile = new FileInputStream(new File("Demo-ApachePOI-Excel.xlsx"));
      Workbook workbook = new XSSFWorkbook(excelFile);
      Sheet datatypeSheet = workbook.getSheetAt(0);
      DataFormatter fmt = new DataFormatter();

      Iterator<Row> iterator = datatypeSheet.iterator();
      Row firstRow = iterator.next();
      Cell firstCell = firstRow.getCell(0);
      System.out.println(firstCell.getStringCellValue());
      List<Customer> listOfCustomer = new ArrayList<Customer>();
      while (iterator.hasNext()) {
        Row currentRow = iterator.next();
        Customer customer = new Customer();
        customer.setId(Integer.parseInt(fmt.formatCellValue(currentRow.getCell(0))));
        customer.setName(currentRow.getCell(1).getStringCellValue());
        customer.setEmail(currentRow.getCell(2).getStringCellValue());
        listOfCustomer.add(customer);
      }

      for (Customer customer : listOfCustomer) {
        System.out.println(customer);
      }
      workbook.close();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

*Lưu ý: id của customer là integer nên khi ghi vào file excel nó sẽ là kiểu numeric, do đó  khi đọc ra thì nó sẽ đọc là numeric và chuyển thành double, ví dụ 1 sẽ là 1.0. Do đó ta dùng DataFormatter để định dạng nó về kiểu string và parse lại thành integer.

Kết quả:

List of Customer
Customer [id=1, name=Sylvester Stallone, email=abc@gmail.com]
Customer [id=2, name=Tom Cruise, email=xyz@yahoo.com]
Customer [id=3, name=Vin Diesel, email=abc@hotmail.com]

 

Okay, Done!

Download code ví dụ trên tại đây

 

Đọc ghi file Excel bằng Java sử dụng Apache POI

Reference:

https://poi.apache.org/spreadsheet/index.html

stackjava.com