Đọc ghi excel file sử dụng Apache POI

Tệp Excel (bảng tính) được sử dụng rộng rãi trên khắp thế giới cho các công việc khác nhau liên quan đến việc tổ chức, phân tích và lưu trữ dữ liệu dạng bảng.Vì các tệp excel rất phổ biến, các lập trình viên sẽ thường xuyên gặp phải các công việc cần xử lý các tập tin excel như phân tích, thống kê và lập báo cáo.

Do vậy, trong bài viết này, mình đã giới thiệu về Apache POI là một thư viện mã nguồn mở cho phép chúng ta thao tác với các tập tin định dạng microsoft office. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu cách đọc và ghi excel file sử dụng Apache POI.

Maven denpendency

Để thao tác được với Excel file, chúng ta cần thêm các denpendency cần thiết.

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>

Một số lưu ý khi sử dụng Apache POI

Bài viết này sẽ hướng dẫn các bạn cách đọc và ghi file excel sử dụng thư viện Apache POI. Tuy nhiên có một số lưu ý sau các bạn cần chú ý để có thể triển khai cho từng trường hợp của mình. 

apache-poi-classes-and-interfaces

  • Tiền tố HSSF được đặt trước các tên class dùng để thao tác với các file định dạng Microsoft Excel 2003.
  • Tiền tố XSFF được đặt trước các tên class dùng để thao tác với các file định dạng Microsoft Excel 2007.
  • XSSFWorkbook và HSSFWorkbook là các class đại diện cho một excel workbook.
  • HSSFSheet và XSSFSheet là các class đại diện cho một excel WorkSheet.
  • Row đại diện cho một dòng.
  • Cell đại diện cho một ô trong một hàng xác định.

Trong bài hướng dẫn này, các bạn sẽ được hướng dẫn cách đọc ghi file excel Microsoft Excel 2007 có đôi là xlsx, có nghĩa là chúng ta sẽ sử dụng các class có tiền tố là XSFF để đọc file exel.

Ghi excel file

Để ghi một excel file cần qua những bước cơ bản sau:

  • Tạo workbook.
  • Tạo một sheet trong workbook.
  • Tạo một dòng trong sheet.
  • Thêm một cột trong sheet.
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;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        // Khởi tạo workbook cho tệp xlsx 
        XSSFWorkbook workbook = new XSSFWorkbook();

        // Khởi tạo một worksheet mới từ workbook 
        XSSFSheet sheet = workbook.createSheet("student Details");

        // Dữ liệu sẽ được ghi xuống file exel
        Map<String, Object[]> data = new TreeMap<String, Object[]>();
        data.put("1", new Object[]{"ID", "NAME", "LASTNAME"});
        data.put("2", new Object[]{1, "Pankaj", "Kumar"});
        data.put("3", new Object[]{2, "Prakashni", "Yadav"});
        data.put("4", new Object[]{3, "Ayan", "Mondal"});
        data.put("5", new Object[]{4, "Virat", "kohli"});

        // Duyệt và thêm dữ liệu từng row
        Set<String> keyset = data.keySet();
        int rownum = 0;
        for (String key : keyset) {
            // this creates a new row in the sheet
            Row row = sheet.createRow(rownum++);
            Object[] objArr = data.get(key);
            int cellnum = 0;
            for (Object obj : objArr) {
                Cell cell = row.createCell(cellnum++);
                if (obj instanceof String)
                    cell.setCellValue((String) obj);
                else if (obj instanceof Integer)
                    cell.setCellValue((Integer) obj);
            }
        }
        try {
            // ghi dữ liệu xuống file
            FileOutputStream out = new FileOutputStream(new File("gfgcontribute.xlsx"));
            workbook.write(out);
            out.close();
            System.out.println("gfgcontribute.xlsx written successfully on disk.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Đọc file excel

Để đọc một excel file chúng ta cũng có các bước sau:

  • Khởi tạo một workbook instance từ excel file.
  • Lấy sheet từ workbook.
  • Đọc từng dòng, mỗi dòng lấy giá trị từ từng cột.
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;

import java.io.File;
import java.io.FileInputStream;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
            try {
                FileInputStream file = new FileInputStream(new File("gfgcontribute.xlsx"));

                // Khởi tạo workbook cho tệp xlsx 
                XSSFWorkbook workbook = new XSSFWorkbook(file);

                // Lấy worksheet đầu tiên trong workbook
                XSSFSheet sheet = workbook.getSheetAt(0);

                // Duyệt qua từng row
                Iterator<Row> rowIterator = sheet.iterator();
                while (rowIterator.hasNext()) {
                    Row row = rowIterator.next();
                    // For each row, iterate through all the columns
                    Iterator<Cell> cellIterator = row.cellIterator();

                    while (cellIterator.hasNext()) {
                        Cell cell = cellIterator.next();
                        // Check the cell type and format accordingly
                        switch (cell.getCellType()) {
                            case Cell.CELL_TYPE_NUMERIC:
                                System.out.print(cell.getNumericCellValue() + "t");
                                break;
                            case Cell.CELL_TYPE_STRING:
                                System.out.print(cell.getStringCellValue() + "t");
                                break;
                        }
                    }
                    System.out.println("");
                }
                file.close();
            } catch (Exception e) {
                e.printStackTrace();

            }
    }
}

Output:

IDtNAMEtLASTNAMEt
1.0tPankajtKumart
2.0tPrakashnitYadavt
3.0tAyantMondalt
4.0tVirattkohlit

Note: Nếu bạn muốn đọc một file tại một đường dẫn khác, thì bạn chỉ việc thay 

FileInputStream file = new FileInputStream(new File("gfgcontribute.xlsx"));

thành đường dẫn bạn mong muốn.

Thêm dữ liệu vào sheet

Nếu bạn đã có một excel sẵn và muốn ghi thêm dự liệu vào đó, thì chỉ cần lấy sheet đó ra từ workbook, đi đến dòng cuối cùng và bắt đầu ghi thêm dữ liệu vào.

private static final String FILE_NAME 
    = "C:\\Users\\pankaj\\Desktop\\projectOutput\\blo.xlsx"; 
public static void write() throws IOException, InvalidFormatException 
{ 
    InputStream inp = new FileInputStream(FILE_NAME); 
    Workbook wb = WorkbookFactory.create(inp); 
    Sheet sheet = wb.getSheetAt(0); 
    int num = sheet.getLastRowNum(); 
    Row row = sheet.createRow(++num); 
    row.createCell(0).setCellValue("xyz"); 
    ..... 
        .. 
        // Now this Write the output to a file 
        FileOutputStream fileOut = new FileOutputStream(FILE_NAME); 
    wb.write(fileOut); 
    fileOut.close(); 
}

Nguồn tham khảo

https://www.geeksforgeeks.org/reading-writing-data-excel-file-using-apache-poi/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x