Đọc tệp excel vào đối tượng java

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ào

public 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"
			}
		]
	}
]
2

Cuố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 classz = t.getClass();

			for (int i = 0; i < evc.length; i++) {

				for (Field field : classz.getDeclaredFields()) {
					field.setAccessible(true);

					if (evc[i].getPojoAttribute().equalsIgnoreCase(field.getName())) {

						try {
							if (FieldType.STRING.getValue().equalsIgnoreCase(evc[i].getExcelColType())) {
								field.set(t, evc[i].getExcelValue());
							} else if (FieldType.DOUBLE.getValue().equalsIgnoreCase(evc[i].getExcelColType())) {
								field.set(t, Double.valueOf(evc[i].getExcelValue()));
							} else if (FieldType.INTEGER.getValue().equalsIgnoreCase(evc[i].getExcelColType())) {
								field.set(t, Double.valueOf(evc[i].getExcelValue()).intValue());
							} else if (FieldType.DATE.getValue().equalsIgnoreCase(evc[i].getExcelColType())) {
								field.set(t, LocalDate.parse(evc[i].getExcelValue(), dtf));
							}
						} catch (IllegalArgumentException | IllegalAccessException e) {
							e.printStackTrace();
						}

						break;
					}
				}
			}

			list.add(t);
		});

		return list;
	}

}

Phần trang tính Excel

Tạo enum cho tên phần của bảng excel. Điều này sẽ giúp chúng tôi lấy đối tượng từ bản đồ

package com.roytuts.generic.way.to.read.excel.apache.poi.enums;

public enum ExcelSection {

	ORDERS("Order"), //
	PROFIT("Profit");

	final String typeValue;

	private ExcelSection(final String typeValue) {
		this.typeValue = typeValue;
	}

	public String getName() {
		return name();
	}

	public String getValue() {
		return typeValue;
	}

	@Override
	public String toString() {
		return name();
	}

}

Tạo lớp chính

Tạo lớp chính bên dưới để kiểm tra ví dụ về Cách đọc tệp Excel chung bằng Apache POI

Chúng tôi đọc tệp excel mẫu đầu tiên nằm trong một thư mục. Sau đó, chúng tôi lặp qua dữ liệu tệp excel và chỉ cần in những dữ liệu đó vào bảng điều khiển

Làm cách nào để chuyển đổi tệp excel thành đối tượng Java?

Cách chuyển đổi tệp excel sang json trong java .
Đầu tiên tạo một dự án maven đơn giản
Thêm các phụ thuộc sau vào pom. xml được hiển thị bên dưới
bây giờ hãy tạo một bộ điều khiển còn lại sẽ nhận tệp excel và chuyển đổi tệp excel thành đối tượng java được hiển thị bên dưới

Làm cách nào để đọc dữ liệu từ tệp excel trong Java?

Ví dụ đọc file excel (. xls) .
nhập java. io. Tập tin;
nhập java. io. FileInputStream;
nhập java. io. IOException;
tổ chức nhập khẩu. apache. poi. hssf. mô hình người dùng. Bảng HSSF;
tổ chức nhập khẩu. apache. poi. hssf. mô hình người dùng. Sổ tay HSSF;
tổ chức nhập khẩu. apache. poi. ss. mô hình người dùng. Tế bào;
tổ chức nhập khẩu. apache. poi. ss. mô hình người dùng. Trình đánh giá công thức;

Làm cách nào để đọc tệp XLSX trong Java?

Một ô có thể là bất kỳ loại e. g Chuỗi, số, boolean, v.v., vì vậy chúng tôi cần kiểm tra loại ô trước khi đọc, vì chúng tôi có trường hợp chuyển đổi để kiểm tra loại trước khi đọc giá trị ô cụ thể bằng cách gọi getStringValue(), getNumericValue(), v.v. Đây là cách chính xác bạn có thể đọc tệp XLSX trong java

Chúng ta có thể đọc excel trong Java không?

Trong Java, việc đọc tệp Excel không giống như đọc tệp Word do các ô trong tệp Excel. JDK không cung cấp API trực tiếp để đọc dữ liệu từ các tệp Excel mà chúng tôi phải chuyển sang thư viện của bên thứ ba là Apache POI .