Cách đọc tệp Excel chung bằng Apache POI là cách đọc tệp excel theo cách có thể định cấu hình động để đọc tệp excel trong tương lai nếu bạn thêm nhiều cột hơn hoặc xóa cột khỏi excel thì bạn gần như không cần phải chạm vào Java
Ở đây chúng ta sẽ xem cách chúng ta có thể xác định cấu hình trong tệp JSON và đọc tệp excel bằng Apache POI để thiết lập ánh xạ giữa JSON và Java POJO
bài viết liên quan
- Cách viết tệp Excel chung bằng cách sử dụng Apache POI
- Cách ghi dữ liệu chung vào nhiều trang tính trong excel bằng cách sử dụng apache poi
Rõ ràng bất cứ khi nào bạn muốn đọc hoặc ghi vào tệp excel, bạn cần sử dụng Java Reflection API mặc dù không nên sử dụng Java Reflection API nhưng trong một số trường hợp hiếm hoi, bạn có thể cần sử dụng Reflection
Bạn cũng có thể muốn đọc
- Khởi tạo đối tượng từ một lớp chứa hàm tạo riêng
- Đọc file excel bằng Python
Apache POI là để tạo và duy trì các API Java để thao tác các định dạng tệp khác nhau dựa trên các tiêu chuẩn Office Open XML [OOXML] và định dạng Tài liệu Hợp chất OLE 2 của Microsoft [OLE2]. Bạn có thể đọc và ghi các tệp MS Excel bằng Java với sự trợ giúp của thư viện Apache POI. Ngoài ra, bạn có thể đọc và ghi các tệp MS Word và MS PowerPoint bằng Java. Apache POI là giải pháp Java Excel [dành cho Excel 97-2008]
điều kiện tiên quyết
Java 8 hoặc 12, Eclipse 4. 12, Apache POI 4. 1. 1, Jackson API 2. 10. 1
Tạo dự án
Tạo dự án dựa trên Gradle trong Eclipse và cập nhật tập lệnh xây dựng như bên dưới
Chúng tôi đã thêm Apache POI phiên bản 4. 1. 1 như một sự phụ thuộc. Chúng tôi cũng đã sử dụng phụ thuộc jackson để chuyển đổi kiểu dữ liệu JSON sang Java POJO hoặc ngược lại
Khi bạn tạo dự án trống với tập lệnh xây dựng bên dưới, vui lòng xây dựng dự án Gradle để kiểm tra xem dự án có tải xuống các thư viện cần thiết và xây dựng thành công hay không
plugins {
id 'java-library'
}
sourceCompatibility = 12
targetCompatibility = 12
repositories {
jcenter[]
}
dependencies {
implementation 'org.apache.poi:poi-ooxml:4.1.1'
implementation['com.fasterxml.jackson.core:jackson-databind:2.10.1']
}
Tạo tập tin cấu hình JSONn
Tạo tệp cấu hình JSON có tên excel. json trong thư mục đường dẫn lớp src/main/resources, nơi chúng tôi xác định ánh xạ giữa tên cột tệp Excel, chỉ mục cột, loại cột, giá trị cột [ban đầu là null] và thuộc tính của lớp POJO mà cột này sẽ được ánh xạ hoặc giá trị của cột excel sẽ là
Chúng tôi đã xác định tệp JSON dựa trên phần khôn ngoan của tệp Excel
[
{
"Order":
[
{
"excelHeader": "Order Date",
"excelIndex": 0,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "orderDate"
},
{
"excelHeader": "Region",
"excelIndex": 1,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "region"
},
{
"excelHeader": "Rep",
"excelIndex": 2,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "rep"
},
{
"excelHeader": "Item",
"excelIndex": 3,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "item"
},
{
"excelHeader": "Units",
"excelIndex": 4,
"excelColType": "Integer",
"excelValue": null,
"pojoAttribute": "units"
},
{
"excelHeader": "Unit Cost",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "unitCost"
},
{
"excelHeader": "Total",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "total"
}
]
},
{
"Profit":
[
{
"excelHeader": "Date",
"excelIndex": 8,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "date"
},
{
"excelHeader": "Profit",
"excelIndex": 9,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "profit"
}
]
}
]
Tạo cấu hình POJO
Ở trên, chúng tôi đã xác định tệp cấu hình JSON để ánh xạ dữ liệu excel sang Java. Ở đây chúng tôi sẽ tạo một lớp tương đương Java sẽ chứa thông tin cột của tệp excel
Lưu ý rằng chúng tôi có tên giống hệt như trong cấu hình tệp JSON. Nếu bạn có tên khác nhau giữa tệp JSOn và lớp Java cho cùng một thuộc tính thì bạn sử dụng chú thích
[
{
"Order":
[
{
"excelHeader": "Order Date",
"excelIndex": 0,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "orderDate"
},
{
"excelHeader": "Region",
"excelIndex": 1,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "region"
},
{
"excelHeader": "Rep",
"excelIndex": 2,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "rep"
},
{
"excelHeader": "Item",
"excelIndex": 3,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "item"
},
{
"excelHeader": "Units",
"excelIndex": 4,
"excelColType": "Integer",
"excelValue": null,
"pojoAttribute": "units"
},
{
"excelHeader": "Unit Cost",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "unitCost"
},
{
"excelHeader": "Total",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "total"
}
]
},
{
"Profit":
[
{
"excelHeader": "Date",
"excelIndex": 8,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "date"
},
{
"excelHeader": "Profit",
"excelIndex": 9,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "profit"
}
]
}
]
0 phía trên thuộc tính POJO để cho biết bạn muốn ánh xạ với cái nàopublic class ExcelField {
private String excelHeader;
private int excelIndex;
private String excelColType;
private String excelValue;
private String pojoAttribute;
//getters and setters
}
Tạo Enum
Định nghĩa enum dưới đây để khai báo một số hằng enum để biểu diễn các loại cột hoặc trường trong file excel
package com.roytuts.generic.way.to.read.excel.apache.poi.enums;
public enum FieldType {
DOUBLE["Double"], //
INTEGER["Integer"], //
STRING["String"], //
DATE["Date"];
final String typeValue;
private FieldType[final String typeValue] {
this.typeValue = typeValue;
}
public String getName[] {
return name[];
}
public String getValue[] {
return typeValue;
}
@Override
public String toString[] {
return name[];
}
}
Đọc Excel
Lớp bên dưới này đọc tệp excel một cách chung chung. Chúng tôi đọc tệp cấu hình JSON theo phương thức
[
{
"Order":
[
{
"excelHeader": "Order Date",
"excelIndex": 0,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "orderDate"
},
{
"excelHeader": "Region",
"excelIndex": 1,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "region"
},
{
"excelHeader": "Rep",
"excelIndex": 2,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "rep"
},
{
"excelHeader": "Item",
"excelIndex": 3,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "item"
},
{
"excelHeader": "Units",
"excelIndex": 4,
"excelColType": "Integer",
"excelValue": null,
"pojoAttribute": "units"
},
{
"excelHeader": "Unit Cost",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "unitCost"
},
{
"excelHeader": "Total",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "total"
}
]
},
{
"Profit":
[
{
"excelHeader": "Date",
"excelIndex": 8,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "date"
},
{
"excelHeader": "Profit",
"excelIndex": 9,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "profit"
}
]
}
]
1 và chúng tôi ánh xạ chúng vào lớp POJO của chúng tôi theo phương thức [
{
"Order":
[
{
"excelHeader": "Order Date",
"excelIndex": 0,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "orderDate"
},
{
"excelHeader": "Region",
"excelIndex": 1,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "region"
},
{
"excelHeader": "Rep",
"excelIndex": 2,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "rep"
},
{
"excelHeader": "Item",
"excelIndex": 3,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "item"
},
{
"excelHeader": "Units",
"excelIndex": 4,
"excelColType": "Integer",
"excelValue": null,
"pojoAttribute": "units"
},
{
"excelHeader": "Unit Cost",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "unitCost"
},
{
"excelHeader": "Total",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "total"
}
]
},
{
"Profit":
[
{
"excelHeader": "Date",
"excelIndex": 8,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "date"
},
{
"excelHeader": "Profit",
"excelIndex": 9,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "profit"
}
]
}
]
2Cuối cùng, chúng tôi đọc bảng excel và bằng cách lặp lại từng hàng, chúng tôi đặt giá trị vào mảng
[
{
"Order":
[
{
"excelHeader": "Order Date",
"excelIndex": 0,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "orderDate"
},
{
"excelHeader": "Region",
"excelIndex": 1,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "region"
},
{
"excelHeader": "Rep",
"excelIndex": 2,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "rep"
},
{
"excelHeader": "Item",
"excelIndex": 3,
"excelColType": "String",
"excelValue": null,
"pojoAttribute": "item"
},
{
"excelHeader": "Units",
"excelIndex": 4,
"excelColType": "Integer",
"excelValue": null,
"pojoAttribute": "units"
},
{
"excelHeader": "Unit Cost",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "unitCost"
},
{
"excelHeader": "Total",
"excelIndex": 5,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "total"
}
]
},
{
"Profit":
[
{
"excelHeader": "Date",
"excelIndex": 8,
"excelColType": "Date",
"excelValue": null,
"pojoAttribute": "date"
},
{
"excelHeader": "Profit",
"excelIndex": 9,
"excelColType": "Double",
"excelValue": null,
"pojoAttribute": "profit"
}
]
}
]
3 và cuối cùng trả về kết quảChúng tôi bắt đầu lặp lại ở hàng số 2 vì hai hàng đầu tiên chứa tên phần và tiêu đề cột trong tệp excel
Lớp này hiển thị cách đọc tệp Excel chung bằng Apache POI
________số 8_______Tạo các lớp POJO
Chúng tôi phải tạo các tệp POJO bên dưới sẽ chứa dữ liệu của tệp excel thực tế. Lớp POJO này sẽ đại diện cho dữ liệu của phần excel. Lớp Đơn hàng sẽ chứa tất cả dữ liệu từ phần Đơn hàng và lớp Lợi nhuận sẽ chứa tất cả dữ liệu từ phần Lợi nhuận
Gọi món
public class Order {
private LocalDate orderDate;
private String region;
private String rep;
private String item;
private int units;
private double unitCost;
private double total;
//getters and setters
}
Lợi nhuận
public class Profit {
private LocalDate date;
private double profit;
//getters and setters
}
Excel to POJO Mapper
Lớp này sẽ ánh xạ giá trị excel tới các lớp POJO của chúng tôi. Ở đây, chúng tôi sử dụng API phản chiếu của Java để đặt giá trị giá trị excel cho thuộc tính của Java. Chúng tôi đang đặt giá trị cho thuộc tính của lớp theo cách Chung bằng API phản chiếu. Vì vậy, bạn không cần biết tên thuộc tính của lớp Java. Vì vậy, lần đầu tiên chúng tôi thấy cách đọc tệp Excel chung bằng cách sử dụng Apache POI và sau đó chúng tôi đang viết các giá trị cột excel đó vào các thuộc tính lớp Java
Ở đây bạn cũng có thể nhận thấy cách trả về một danh sách cho bất kỳ loại đối tượng nào. Vì vậy, nó cũng hiển thị cách chung để trả về danh sách các đối tượng chung
package com.roytuts.generic.way.to.read.excel.apache.poi.mapper;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import com.roytuts.generic.way.to.read.excel.apache.poi.enums.FieldType;
import com.roytuts.generic.way.to.read.excel.apache.poi.model.ExcelField;
public final class ExcelFieldMapper {
final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern["dd-MM-yyyy"];
public static List getPojos[List excelFields, Class clazz] {
List list = new ArrayList[];
excelFields.forEach[evc -> {
T t = null;
try {
t = clazz.getConstructor[].newInstance[];
} catch [InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException | SecurityException e1] {
e1.printStackTrace[];
}
Class