1.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
2.
@RestController
@RequestMapping("/file")
@Slf4j
public class ExcelFileUploadParsing {
/**
*
* @param file
* @return ArrayList<HashMap<String,ArrayList>>
*/
@PostMapping(value = "/detectDisease",produces = {"application/json;charset=utf-8"})
@ResponseBody
public ArrayList<HashMap<String,ArrayList>> fileUpload(@RequestParam("file") MultipartFile file){
String fileName = file.getOriginalFilename();
System.out.println(fileName);
String filePath = "D:\\WorkPlace";
File dir = new File(filePath);
if(!dir.exists()){
dir.mkdir();
}
filePath = filePath+File.separator+fileName;
System.out.println(filePath);
try {
return DetectDiseaseCodeDescUtil.detectDiseaseCodeDesc(filePath);
} catch (Exception e) {
log.error("文件解析失败");
return null;
}
}
3.
public class DetectDiseaseCodeDescUtil {
/**
* 比对文件: 多次给付重疾险智核问卷0810.xlsx.
* 比对方法: 以 核保结论标识 (记为sheet2 B,C 列) 为基准, 比对 问卷及核保结论 (记为sheet1 R,V 列).
* 将 sheet1 中不合法的行号打印到控制台
*
* @param filePath xlsx 文件路径
*/
public static ArrayList<HashMap<String,ArrayList>> detectDiseaseCodeDesc(String filePath) throws Exception {
//将文件读入
FileInputStream in = new FileInputStream(new File(filePath));
//创建工作薄
Workbook workbook = new XSSFWorkbook(in);
workbook.close();
Sheet sheet0 = workbook.getSheetAt(0);
int lastRowIndex = sheet0.getLastRowNum();
int codeColumnIndex = 17;
int descColumnIndex = 21;
Map<String, String> enumMap = DetectDiseaseCodeDescUtil.getEnumMap();
ArrayList<HashMap<String,ArrayList>> result = new ArrayList<>();
HashMap<String, ArrayList> map = new HashMap<>();
//不合法codeList
ArrayList<Integer> illegalCodeRowNumList = new ArrayList<>(enumMap.size());
//不合法文字描述 List
ArrayList<Integer> illegalDescRowNumList = new ArrayList<>(enumMap.size());
for (int i = 1; i <= lastRowIndex; i++) {
Row rowI = sheet0.getRow(i);
String cellCode = rowI.getCell(codeColumnIndex).getStringCellValue();
if (enumMap.containsKey(cellCode)) {
if (!enumMap.get(cellCode).equals(rowI.getCell(descColumnIndex).getStringCellValue())) {
//excel使用的 code 在枚举类内, 但描述和该code 在枚举类内的描述不对应, 记录行号
illegalDescRowNumList.add(i + 1);
}
} else {
//excel使用的 code 不在枚举类内, 记录行号
illegalCodeRowNumList.add(i + 1);
}
}
map.put("illegalDescRowNumList",illegalDescRowNumList);
map.put("illegalCodeRowNumList",illegalCodeRowNumList);
result.add(map);
System.out.println("illegalCodeRowNumList: " + illegalCodeRowNumList);
System.out.println("illegalDescRowNumList: " + illegalDescRowNumList);
return result;
}
/**
* 将疾病 {@link cn.tk.demo.enums.SurveyDiseaseEnum} 放到 map 中
*
* @return map
*/
private static Map<String, String> getEnumMap() {
SurveyDiseaseEnum[] values = SurveyDiseaseEnum.values();
HashMap<String, String> map = new HashMap<>(values.length);
for (SurveyDiseaseEnum value : values) {
map.put(value.getCode(), value.getDescription());
}
return map;
}
public static void main(String[] args) throws Exception {
String filePath = "D:\\WorkPlace\\多次给付重疾险智核问卷0810.xlsx";
DetectDiseaseCodeDescUtil.detectDiseaseCodeDesc(filePath);
}
}
4.
public enum SurveyDiseaseEnum {
//======次标体除组
CiBiaoTiChuZu_$_EXingZhongLiuLeiZhongDaJiBing("B000", "恶性肿瘤类重大疾病"),
CiBiaoTiChuZu_$_XinZangHuoXinXueGuanLeiZhongDaJiBing("B001", "心脏或心血管类重大疾病"),
CiBiaoTiChuZu_$_NaoZhongFengHuoShenJingXiTongLeiZhongDaJiBing("B002", "脑中风或神经系统类重大疾病"),
CiBiaoTiChuZu_$_QiTaLeiZhongDaJiBing("B003", "其他类重大疾病"),
CiBiaoTiChuZu_$_TeShuLeiZhongDaJiBing("B004", "特殊类重大疾病"),
CiBiaoTiChuZu_$_XinZangHuoXinXueGuanLei_NaoZhongFengHuoShenJingXiTongLei_QiTaLei_TeShuLeiZhongDaJiBing("B005", "心脏或心血管类重大疾病、脑中风或神经系统类重大疾病、其他类重大疾病、特殊类重大疾病"),
CiBiaoTiChuZu_$_XinZangHuoXinXueGuanLei_NaoZhongFengHuoShenJingXiTongLei("B006", "心脏或心血管类重大疾病、脑中风或神经系统类重大疾病"),
CiBiaoTiChuZu_$_XinZangHuoXinXueGuanLei_NaoZhongFengHuoShenJingXiTongLei_QiTaLeiZhongDaJiBing("B007", "心脏或心血管类重大疾病、脑中风或神经系统类重大疾病、其他类重大疾病"),
CiBiaoTiChuZu_$_QiTaLei_TeShuLeiZhongDaJiBing("B008", "其他类重大疾病、特殊类重大疾病"),
CiBiaoTiChuZu_$_EXingZhongLiuLei_XinZangHuoXinXueGuanLeiZhongDaJiBing("B009", "恶性肿瘤类重大疾病、心脏或心血管类重大疾病"),
CiBiaoTiChuZu_$_XinZangHuoXinXueGuanLei_TeShuLeiZhongDaJiBing("B010", "心脏或心血管类重大疾病、特殊类重大疾病"),
CiBiaoTiChuZu_$_EXingZhongLiuLei_XinZangHuoXinXueGuanLei_TeShuLeiZhongDaJiBing("B011", "恶性肿瘤类重大疾病、心脏或心血管类重大疾病、特殊类重大疾病"),
CiBiaoTiChuZu_$_EXingZhongLiuLei_TeShuLeiZhongDaJiBing("B012", "恶性肿瘤类重大疾病、特殊类重大疾病"),
//======确诊除组
QueZhenZu_$_EXingZhongLiuLeiZhongDaJiBing("T000", "恶性肿瘤类重大疾病"),
QueZhenZu_$_XinZangHuoXinXueGuanLeiZhongDaJiBing("T001", "心脏或心血管类重大疾病"),
QueZhenZu_$_NaoZhongFengHuoShengJingXiTongLeiZhongDaJiBing("T002", "脑中风或神经系统类重大疾病"),
QueZhenZu_$_QiTaLeiZhongDaJiBing("T003", "其他类重大疾病"),
//======未分组
JuBao("D001", "拒保"),
//======普通除外
PuTongChuWai_$_ChengBao("A000", "承保"),
PuTongChuWai_$_YuanYouCanJiBuWei("A001", "原有残疾部位"),
PuTongChuWai_$_JiaZhuangXianEXingZhongLiuJiQiFuFaHeZhuanYi("A002", "甲状腺恶性肿瘤及其复发和转移"),
PuTongChuWai_$_YanZhongXingZangBing("A003", "严重心肌病"),
PuTongChuWai_$_ShenDuHunMi("A004", "深度昏迷"),
PuTongChuWai_$_RuXianEXingZhongLiu$BaoKuoYuanWeiAi$JiQiFuFaHeZhuanYi("A005", "乳腺恶性肿瘤(包括原位癌)及其复发和转移"),
PuTongChuWai_$_QinShiXingPuTaoTai$HuoChengEXingPuTaoTai$("A006", "侵蚀性葡萄胎(或称恶性葡萄胎)"),
//编号不连续
PuTongChuWai_$_ShuangMuShiMing("A011", "双目失明"),
PuTongChuWai_$_ShuangErShiCong("A012", "双耳失聪"),
//编号不连续
PuTongChuWai_$_YanZhongChangWeiDaoJiBingBingFaZheng("A016", "严重肠道疾病并发症"),
PuTongChuWai_$_DanDaoChongJianShouShu("A020", "胆道重建手术"),
PuTongChuWai_$_LuanChaoEXingZhongLiu$BaoKuoYuanWeiAi$JiQiFuFaHeZhuanYi("A025", "卵巢恶性肿瘤(包括原位癌)及其复发和转移");
/**
* 疾病编码
*/
private String code;
/**
* 疾病描述
*/
private String description;
SurveyDiseaseEnum(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
}
POI解析excel文件---校验指定数据是否正确
于 2022-08-14 04:18:16 首次发布