diff --git a/schoolNewsServ/common/common-util/pom.xml b/schoolNewsServ/common/common-util/pom.xml
index 40be126..3724a5f 100644
--- a/schoolNewsServ/common/common-util/pom.xml
+++ b/schoolNewsServ/common/common-util/pom.xml
@@ -18,4 +18,19 @@
21
+
+
+
+ org.apache.poi
+ poi
+ ${poi.version}
+
+
+
+ org.apache.poi
+ poi-ooxml
+ ${poi.version}
+
+
+
\ No newline at end of file
diff --git a/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelColumnMapping.java b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelColumnMapping.java
new file mode 100644
index 0000000..fcfc146
--- /dev/null
+++ b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelColumnMapping.java
@@ -0,0 +1,208 @@
+package org.xyzh.common.utils.excel;
+
+import org.xyzh.common.utils.validation.ValidationParam;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description Excel列映射配置
+ * @filename ExcelColumnMapping.java
+ * @author yslg
+ * @copyright xyzh
+ * @since 2025-10-16
+ */
+public class ExcelColumnMapping {
+
+ /**
+ * @description Excel列名(表头名称)
+ */
+ private String columnName;
+
+ /**
+ * @description Excel列索引(从0开始,优先级高于列名)
+ */
+ private Integer columnIndex;
+
+ /**
+ * @description 对象字段名
+ */
+ private String fieldName;
+
+ /**
+ * @description 字段类型
+ */
+ private Class> fieldType;
+
+ /**
+ * @description 是否必填
+ */
+ private boolean required = false;
+
+ /**
+ * @description 默认值
+ */
+ private String defaultValue;
+
+ /**
+ * @description 日期格式(当字段类型为Date时使用)
+ */
+ private String dateFormat = "yyyy-MM-dd";
+
+ /**
+ * @description 校验参数列表
+ */
+ private List validationParams;
+
+ private ExcelColumnMapping() {
+ this.validationParams = new ArrayList<>();
+ }
+
+ public String getColumnName() {
+ return columnName;
+ }
+
+ public Integer getColumnIndex() {
+ return columnIndex;
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public Class> getFieldType() {
+ return fieldType;
+ }
+
+ public boolean isRequired() {
+ return required;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public String getDateFormat() {
+ return dateFormat;
+ }
+
+ public List getValidationParams() {
+ return validationParams;
+ }
+
+ /**
+ * @description Builder类
+ */
+ public static class Builder {
+ private ExcelColumnMapping mapping = new ExcelColumnMapping();
+
+ /**
+ * 设置Excel列名
+ */
+ public Builder columnName(String columnName) {
+ mapping.columnName = columnName;
+ return this;
+ }
+
+ /**
+ * 设置Excel列索引(从0开始)
+ */
+ public Builder columnIndex(int columnIndex) {
+ mapping.columnIndex = columnIndex;
+ return this;
+ }
+
+ /**
+ * 设置对象字段名
+ */
+ public Builder fieldName(String fieldName) {
+ mapping.fieldName = fieldName;
+ return this;
+ }
+
+ /**
+ * 设置字段类型
+ */
+ public Builder fieldType(Class> fieldType) {
+ mapping.fieldType = fieldType;
+ return this;
+ }
+
+ /**
+ * 设置是否必填
+ */
+ public Builder required(boolean required) {
+ mapping.required = required;
+ return this;
+ }
+
+ /**
+ * 设置为必填
+ */
+ public Builder required() {
+ mapping.required = true;
+ return this;
+ }
+
+ /**
+ * 设置默认值
+ */
+ public Builder defaultValue(String defaultValue) {
+ mapping.defaultValue = defaultValue;
+ return this;
+ }
+
+ /**
+ * 设置日期格式
+ */
+ public Builder dateFormat(String dateFormat) {
+ mapping.dateFormat = dateFormat;
+ return this;
+ }
+
+ /**
+ * 添加校验参数
+ */
+ public Builder addValidation(ValidationParam param) {
+ mapping.validationParams.add(param);
+ return this;
+ }
+
+ /**
+ * 设置校验参数列表
+ */
+ public Builder validations(List params) {
+ mapping.validationParams = params;
+ return this;
+ }
+
+ public ExcelColumnMapping build() {
+ if (mapping.fieldName == null || mapping.fieldName.isEmpty()) {
+ throw new IllegalArgumentException("字段名不能为空");
+ }
+ if (mapping.columnName == null && mapping.columnIndex == null) {
+ throw new IllegalArgumentException("必须指定列名或列索引");
+ }
+ if (mapping.fieldType == null) {
+ mapping.fieldType = String.class;
+ }
+ return mapping;
+ }
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @Override
+ public String toString() {
+ return "ExcelColumnMapping{" +
+ "columnName='" + columnName + '\'' +
+ ", columnIndex=" + columnIndex +
+ ", fieldName='" + fieldName + '\'' +
+ ", fieldType=" + (fieldType != null ? fieldType.getSimpleName() : "null") +
+ ", required=" + required +
+ '}';
+ }
+}
+
diff --git a/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelReadResult.java b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelReadResult.java
new file mode 100644
index 0000000..34ee9cb
--- /dev/null
+++ b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelReadResult.java
@@ -0,0 +1,142 @@
+package org.xyzh.common.utils.excel;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description Excel读取结果
+ * @filename ExcelReadResult.java
+ * @author yslg
+ * @copyright xyzh
+ * @since 2025-10-16
+ */
+public class ExcelReadResult {
+
+ /**
+ * @description 是否成功
+ */
+ private boolean success;
+
+ /**
+ * @description 成功读取的数据列表
+ */
+ private List dataList;
+
+ /**
+ * @description 失败的行数据(行号 -> 错误信息)
+ */
+ private Map errorRowsMap;
+
+ /**
+ * @description 总行数(不包括表头)
+ */
+ private int totalRows;
+
+ /**
+ * @description 成功行数
+ */
+ private int successRows;
+
+ /**
+ * @description 失败行数
+ */
+ private int errorRowsCount;
+
+ /**
+ * @description 错误信息
+ */
+ private String errorMessage;
+
+ public ExcelReadResult() {
+ this.success = true;
+ this.dataList = new ArrayList<>();
+ this.errorRowsMap = new HashMap<>();
+ this.totalRows = 0;
+ this.successRows = 0;
+ this.errorRowsCount = 0;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public List getDataList() {
+ return dataList;
+ }
+
+ public void setDataList(List dataList) {
+ this.dataList = dataList;
+ }
+
+ public Map getErrorRows() {
+ return errorRowsMap;
+ }
+
+ public void setErrorRows(Map errorRowsMap) {
+ this.errorRowsMap = errorRowsMap;
+ }
+
+ public int getTotalRows() {
+ return totalRows;
+ }
+
+ public void setTotalRows(int totalRows) {
+ this.totalRows = totalRows;
+ }
+
+ public int getSuccessRows() {
+ return successRows;
+ }
+
+ public void setSuccessRows(int successRows) {
+ this.successRows = successRows;
+ }
+
+ public int getErrorRowsCount() {
+ return errorRowsCount;
+ }
+
+ public void setErrorRowsCount(int errorRowsCount) {
+ this.errorRowsCount = errorRowsCount;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ public void addData(T data) {
+ this.dataList.add(data);
+ this.successRows++;
+ }
+
+ public void addError(int rowNum, String error) {
+ this.errorRowsMap.put(rowNum, error);
+ this.errorRowsCount++;
+ }
+
+ public boolean hasErrors() {
+ return this.errorRowsCount > 0;
+ }
+
+ @Override
+ public String toString() {
+ return "ExcelReadResult{" +
+ "success=" + success +
+ ", totalRows=" + totalRows +
+ ", successRows=" + successRows +
+ ", errorRows=" + errorRowsCount +
+ ", errorMessage='" + errorMessage + '\'' +
+ '}';
+ }
+}
+
diff --git a/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelReaderUtils.java b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelReaderUtils.java
new file mode 100644
index 0000000..3790970
--- /dev/null
+++ b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/excel/ExcelReaderUtils.java
@@ -0,0 +1,426 @@
+package org.xyzh.common.utils.excel;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.xyzh.common.utils.validation.ValidationParam;
+import org.xyzh.common.utils.validation.ValidationResult;
+import org.xyzh.common.utils.validation.ValidationUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @description Excel读取工具类(非泛型版本)
+ * @filename ExcelReaderUtils.java
+ * @author yslg
+ * @copyright xyzh
+ * @since 2025-10-16
+ */
+public class ExcelReaderUtils {
+
+ /**
+ * @description 从文件读取Excel
+ * @param file Excel文件
+ * @param targetClass 目标对象Class
+ * @param columnMappings Excel列映射配置列表
+ * @return ExcelReadResult
+ */
+ public static ExcelReadResult