将excel动态解析成bean,支持多行嵌套式表头,根据表头行数构建entity模板,然后每条数据对模板深拷贝后将参数写入,代码如下:
public static void main(String[] args) {
File file = new File("xlsxPath");
List<JSONObject> testEntityList = dr(2, file, new TypeReference<JSONObject>() {});
System.out.println(JSONObject.toJSONString(testEntityList));
}
public static <T> List<T> dr(int titleRowNum, File excelFile, TypeReference<T> typeReference) {
ExcelReader excelReader = ExcelUtil.getReader(excelFile);
int sheetCount = excelReader.getSheetCount();
List<T> resultList = new ArrayList<>();
for (int sheetNum = 0; sheetNum < sheetCount; sheetNum++) {
excelReader.setSheet(sheetNum);
// 构建表头结构
List<List<Object>> titleRowsList = excelReader.read(0, titleRowNum - 1);
List<List<String>> titleColumnList = new ArrayList<>(titleRowsList.get(0).size());
// 将表头第一行初始化到表头list
titleRowsList.get(0).forEach(titleRowColumnValue -> {
List<String> titleColumnValueList = new ArrayList<>();
titleColumnValueList.add(titleRowColumnValue.toString());
titleColumnList.add(titleColumnValueList);
});
// 拼接表头其他行
for (int titleRowIndex = 1; titleRowIndex < titleRowsList.size(); titleRowIndex++) {
List<Object> titleRowList = titleRowsList.get(titleRowIndex);
for (int rowIndex = 0; rowIndex < titleRowList.size(); rowIndex++) {
if (!titleRowList.get(rowIndex).toString()
.equals(titleColumnList.get(rowIndex).get(titleColumnList.get(rowIndex).size() - 1))) {
titleColumnList.get(rowIndex).add(titleRowList.get(rowIndex).toString());
}
}
}
// 初始化json解析模板
JSONObject jsonDataTemplate = new JSONObject();
titleColumnList.forEach(columnList -> {
if (columnList.size() > 1) {
for (int columnIndex = 0; columnIndex < columnList.size() - 1; columnIndex++) {
jsonDataTemplate.put(columnList.get(columnIndex), new JSONObject());
}
}
});
// 读取数据
List<List<Object>> valueRowsList = excelReader.read(titleRowNum);
valueRowsList.forEach(valueRowList -> {
JSONObject rowValueJson = JSONObject.parseObject(jsonDataTemplate.toJSONString());
for (int valueRowIndex = 0; valueRowIndex < valueRowList.size(); valueRowIndex++) {
List<String> columnTitleList = titleColumnList.get(valueRowIndex);
if (columnTitleList.size() > 1) {
JSONObject tmeJson = rowValueJson;
for (int columnTitleIndex = 0; columnTitleIndex < columnTitleList.size(); columnTitleIndex++) {
if (columnTitleIndex != columnTitleList.size() - 1) {
tmeJson = rowValueJson.getJSONObject(columnTitleList.get(columnTitleIndex));
} else {
tmeJson.put(columnTitleList.get(columnTitleIndex), valueRowList.get(valueRowIndex));
}
}
} else {
rowValueJson.put(columnTitleList.get(0), valueRowList.get(valueRowIndex));
}
}
resultList.add(JSON.parseObject(rowValueJson.toJSONString(), typeReference));
});
}
return resultList;
}