Browse Source

修改:

修改excel表头解析方法,使更通用
master
wangxianzhang 4 years ago
parent
commit
7c0a297579
  1. 189
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

189
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserServiceImpl.java

@ -435,9 +435,12 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
@Override
public Object importIcResiInfoFromExcel(String currUserAgencyId) {
String excelPathName = "/opt/test/基础信息表/resi_info.xls";
CustomerAgencyDTO agencyInfo = getResultDataOrThrowsException(govOrgOpenFeignClient.getAgencyById(currUserAgencyId), ServiceConstant.GOV_ORG_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), null);
String loginUserId = loginUserUtil.getLoginUserId();
return importIcResiInfoFromExcel(0, 3, currUserAgencyId, agencyInfo.getPids(), loginUserId);
//return importIcResiInfoFromExcel(excelPathName, 0, 3, currUserAgencyId, agencyInfo.getPids(), loginUserId);
return importIcResiExtraInfoFromExcel(excelPathName, 1, 2, currUserAgencyId, agencyInfo.getPids(), loginUserId);
// imporExcel(1, 1);
// imporExcel(2, 1);
// imporExcel(3, 1);
@ -448,9 +451,18 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
// imporExcel(8, 1);
}
private Object importIcResiInfoFromExcel(int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId) {
/**
* excel导入居民基本信息
* @param sheetNo
* @param headRowNumber
* @param currUserAgencyId
* @param currUserAgencyPids
* @param currentUserId
* @return
*/
private Object importIcResiInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId) {
DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
EasyExcelFactory.read(new File("/opt/test/基础信息表/resi_info.xls")).registerReadListener(readListener).headRowNumber(3).sheet(sheetNo).doRead();
EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead();
List<Map<Integer, String>> headList = readListener.getHeadList();
List<Map<Integer, String>> dataList = readListener.getDataList();
@ -458,10 +470,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
Map<Integer, List<String>> headers = mergeHead(headList);
// 查询form相关信息
CustomerFormQueryDTO form = new CustomerFormQueryDTO();
form.setFormCode("resi_base_info");
Result<List<FormItem>> result = operCustomizeOpenFeignClient.listItems(form);
List<FormItem> customerItems = getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败");
List<FormItem> customerItems = listFormItems("resi_base_info");
// 清洗表头数据
Map<Integer, String> abandonedHeaders = washHeaders(headers, customerItems);
@ -481,12 +490,57 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
}
}, formItem -> formItem)
);
Map<String, ColumnWrapper> headerColumnWrapper = integrate(formItemMap, combinedHeaders, dataList, abandonedHeaders);
Map<String, ColumnWrapper> headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders);
// 持久化
persist(headerColumnWrapper, dataList, currUserAgencyId, abandonedHeaders, customerItems.get(0).getTableName(), currUserAgencyPids, currentUserId);
return headerColumnWrapper;
return headers;
}
/**
* excel导入居民附加信息
* @param excelPathName
* @param sheetNo
* @param headRowNumber
* @param currUserAgencyId
* @param currUserAgencyPids
* @param currentUserId
* @return
*/
private Object importIcResiExtraInfoFromExcel(String excelPathName, int sheetNo, int headRowNumber, String currUserAgencyId, String currUserAgencyPids, String currentUserId) {
DynamicEasyExcelListener readListener = new DynamicEasyExcelListener();
EasyExcelFactory.read(new File(excelPathName)).registerReadListener(readListener).headRowNumber(headRowNumber).sheet(sheetNo).doRead();
List<Map<Integer, String>> headList = readListener.getHeadList();
List<Map<Integer, String>> dataList = readListener.getDataList();
Map<Integer, List<String>> headers = mergeHead(headList);
// 查询form相关信息
List<FormItem> customerItems = listFormItems("resi_base_info");
// 清洗表头数据
Map<Integer, String> abandonedHeaders = washHeaders(headers, customerItems);
//合并多级表头
HashMap<String, List<Integer>> combinedHeaders = combineHeaders(headers);
// 得到客户配置item数据
Map<String, FormItem> formItemMap = customerItems.stream().collect(
Collectors.toMap(formItem -> {
String groupLabel = formItem.getGroupLabel();
String label = formItem.getLabel();
if (StringUtils.isNotBlank(groupLabel)) {
return groupLabel.concat(":").concat(label);
} else {
return label;
}
}, formItem -> formItem)
);
Map<String, ColumnWrapper> headerColumnWrapper = convertExcelHeaders2DBColumnWrappers(formItemMap, combinedHeaders, dataList, abandonedHeaders);
return formItemMap;
}
/**
@ -574,6 +628,18 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
}
}
/**
* 根据formCode查询该form的item列表
* @param formCode
* @return
*/
private List<FormItem> listFormItems(String formCode) {
CustomerFormQueryDTO form = new CustomerFormQueryDTO();
form.setFormCode(formCode);
Result<List<FormItem>> result = operCustomizeOpenFeignClient.listItems(form);
return getResultDataOrThrowsException(result, ServiceConstant.OPER_CUSTOMIZE_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "【居民信息excel导入】查询表单相关信息失败");
}
/**
* @description 合并头
*
@ -626,14 +692,21 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
}
/**
* @description 数据整合
*
* @description 数据整合将excel表头汉字信息转化成ColumnWrapper列封装数据
* * key:itemId
* * value:ColumnWrapper列包装信息
* @param formItemMap item map
* key:itemId;
* value: 合并之后的head字符串例如健康信息:监护人
* @param combinedHeaders 合并之后的head信息
* key合并之后head字符串(例如党员信息:入党时间)
* value列号组成的列表(例如[1,2,3])
* @param datas
* @param abandonedHeaders
* @return
* @author wxz
* @date 2021.10.28 17:08:51
*/
private Map<String, ColumnWrapper> integrate(Map<String, FormItem> formItemMap, Map<String, List<Integer>> combinedHeaders,
List<Map<Integer, String>> datas, Map<Integer, String> abandonedHeaders) {
private Map<String, ColumnWrapper> convertExcelHeaders2DBColumnWrappers(Map<String, FormItem> formItemMap, Map<String, List<Integer>> combinedHeaders,
List<Map<Integer, String>> datas, Map<Integer, String> abandonedHeaders) {
// HashMap<String, List<ColumnWrapper>> tables = new HashMap<>();
Map<String, ColumnWrapper> columns = new LinkedHashMap<>(combinedHeaders.size());
@ -806,6 +879,7 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
/**
* @description 合并表头
* Map<Integer, List<String>>
*
* @param headList
* @return
@ -813,67 +887,42 @@ public class IcResiUserServiceImpl extends BaseServiceImpl<IcResiUserDao, IcResi
* @date 2021.10.27 16:17:34
*/
private Map<Integer, List<String>> mergeHead(List<Map<Integer, String>> headList) {
Map<Integer, String> l1 = headList.get(0);
Map<Integer, String> l2 = headList.get(1);
Map<Integer, String> l3 = headList.get(2);
String l1LastHeadName = "";
String l2LastHeadName = "";
//Map<Integer, String> resultMap = new HashMap<>();
HashMap<Integer, List<String>> result = new HashMap<>();
for (Map.Entry<Integer, String> entry : l1.entrySet()) {
StringBuilder headerNameConcatStr = new StringBuilder();
Integer key = entry.getKey();
String l1TempValue = entry.getValue();
Map<Integer, String> lastNotNullHeads = new LinkedHashMap<>();
Map<Integer, List<String>> mergedHead = new LinkedHashMap<>();
int levelCount = headList.size();
String l2TempValue = l2.get(key);
String l3TempValue = l3.get(key);
Map<Integer, String> firstLevel = headList.get(0);
// 遍历所有列
for (Map.Entry<Integer, String> column : firstLevel.entrySet()) {
Integer columIndex = column.getKey();
if (StringUtils.isNotBlank(l1TempValue)) {
l1LastHeadName = l1TempValue;
}
if (StringUtils.isNotBlank(l2TempValue)) {
l2LastHeadName = l2TempValue;
}
// 开始拼接
if (StringUtils.isNotBlank(l3TempValue)) {
//headerNameConcatStr.append(l1LastHeadName).append(":").append(l2LastHeadName).append(":").append(l3TempValue);
//resultMap.put(key, headerNameConcatStr.toString());
ArrayList<String> parts = new ArrayList<>();
parts.add(l1LastHeadName);
parts.add(l2LastHeadName);
parts.add(l3TempValue);
result.put(key, parts);
continue;
}
if (StringUtils.isNotBlank(l2TempValue)) {
//headerNameConcatStr.append(l1LastHeadName).append(":").append(l2LastHeadName);
//resultMap.put(key, headerNameConcatStr.toString());
ArrayList<String> parts = new ArrayList<>();
parts.add(l1LastHeadName);
parts.add(l2LastHeadName);
result.put(key, parts);
continue;
}
if (StringUtils.isNotBlank(l1TempValue)) {
//headerNameConcatStr.append(l1LastHeadName);
//resultMap.put(key, headerNameConcatStr.toString());
ArrayList<String> parts = new ArrayList<>();
parts.add(l1LastHeadName);
result.put(key, parts);
continue;
List<String> labels = new ArrayList<>();
// 竖着遍历该列的所有行
for (int currentLevel = 0; currentLevel < levelCount; currentLevel ++) {
String label = headList.get(currentLevel).get(columIndex);
if (StringUtils.isNotBlank(label)) {
lastNotNullHeads.put(currentLevel, label);
} else {
if (currentLevel == 0 || StringUtils.isBlank(headList.get(currentLevel - 1).get(columIndex))) {
label = lastNotNullHeads.get(currentLevel);
}
}
if (StringUtils.isNotBlank(label)) {
labels.add(label);
}
}
mergedHead.put(columIndex, labels);
}
return result;
return mergedHead;
}
/**

Loading…
Cancel
Save