转载请标明出处:
https://blog.csdn.net/weixin_41965979/article/details/91044971
本文出自付付讶的博客
公司要求增加一个上传excel,并读取其中数据批量写入数据库的功能,测试完遂整理一下方便以后使用,同时也给大家实现类似功能一个参考,框架使用ssm,导入excel使用的第三方依赖Poi,结合自身业务修改即可。
备注:因为公司excel模板里存在下拉框多选项情况,又因为这些多选项都必须用数据字典解析成code码,所以其中有拆分 和拼接逗号代码,可以忽略,我代码里有写注释。
org.apache.poi
poi-ooxml
3.12-beta1
org.apache.poi
poi-ooxml-schemas
3.12-beta1
org.apache.poi
poi
3.12-beta1
@ApiOperation(value = "批量上传")
@PostMapping(value="/exportExcel",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Result exportExcel(String dataTime,MultipartFile file)throws Exception{
List error = facilityService.exportExcel(dataTime,file);
if(ValidateUtil.isNotEmpty(error)){
return Result.error(500,JSONArray.toJSONString(error));
}else {
return Result.ok();
}
}
public List exportExcel(int reportType, String dataTime, MultipartFile file) throws Exception {
//错误返回
List error = new ArrayList();
//读取工作簿
Workbook workBook = WorkbookFactory.create(file.getInputStream());
//读取工作表
Sheet sheet = workBook.getSheetAt(0);
int rowNumber = sheet.getPhysicalNumberOfRows();
//校验是否填写内容
if (rowNumber <= 2) {
error.add("文件无内容");
return error;
}
//循环读取每一行数据并校验
for (int i = 2; i < rowNumber; i++) {
try {
//读取行
Row row = sheet.getRow(i);
//读取单元格
FacilityVo facilityVo = new FacilityVo();
facilityVo.setFacId(UUIDUtil.uuid());
facilityVo.setReportType(reportType);//上报区分
facilityVo.setReportCity(SecurityUtil.getCity());//上报城市
facilityVo.setDataTime(dataTime);//上报时间
row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setTitle(row.getCell(0).getStringCellValue());//项目名称
row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setChargeUnit(row.getCell(1).getStringCellValue());//项目单位
row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setLocation(row.getCell(2).getStringCellValue());//位置
row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setArea(row.getCell(3).getStringCellValue());//占地面积
row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setType(row.getCell(4).getStringCellValue());//类型
row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setBuildStates(row.getCell(5).getStringCellValue());//建设状态
row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setConsumptionCapacity(row.getCell(6).getStringCellValue());//消纳能力
row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setRemainingCapacity(row.getCell(7).getStringCellValue());//剩余容量
row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setChargePerson(row.getCell(8).getStringCellValue());//负责人
row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setPhone(row.getCell(9).getStringCellValue());//联系方式
row.getCell(10).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setPositionDescription(row.getCell(10).getStringCellValue());//状况描述
//如果第12列不为空,获取状况描述说明数据
if (row.getCell(11) != null) {
row.getCell(11).setCellType(Cell.CELL_TYPE_STRING);
facilityVo.setPositionDescriptionFill(row.getCell(11).getStringCellValue());//状况描述说明
}
//校验数据格式
validator(facilityVo);
//拆分读取到数据里的中文逗号,调用formatCode()方法为其拼接英文逗号
//(这里是因为数据里有下拉框多选的情况,所以需要解析逗号和转换数据字典里)
//(的格式, 没有这种情况的可以删除这几个判断的代码)
String type = formatCode(facilityVo.getType().split(","), reportType);
if (type.isEmpty()) {
throw new ValidateException("填埋场类型填写错误");
}
String buildState = formatCode(facilityVo.getBuildStates().split(","), reportType);
if (buildState.isEmpty()) {
throw new ValidateException("建设状态填写错误");
}
String positionDescription = formatCode(facilityVo.getPositionDescription().split(","), reportType);
if (positionDescription.isEmpty()) {
throw new ValidateException("状况描述填写错误");
}
facilityVo.setType(type);
facilityVo.setBuildStates(buildState);
facilityVo.setPositionDescription(positionDescription);
//如果每条数据都没问题,通过校验,才去新增
if (error.size() == 0) {
facilityDao.insertLandfillRep(facilityVo);
}
} catch (Exception e) {
//错误信息提示
error.add("第" + (i + 1) + "行数据有错误," + e.getMessage());
}
}
workBook.close();
return error;
}
以上就是解析excel内容上传数据的代码,可以复制过去改成你自己的字段数据即可。
格式化code、拼接逗号和转数据字典的code码(与批量上传解析excel无关,没有这类需求的不用看这里)
/**
* title转code(因为一个title对应多个code,获取数据会乱,所以写死)--给exportExcel()调用
*/
public String codeByTitle(String title, int reportType) {
String code = "";
switch (title) {
case "纳入规划":
code = "planning-1";
break;
case "未纳入规划":
code = "planning-2";
break;
case "临时":
code = "timeup-1";
break;
case "长期":
code = "timeup-2";
break;
case "已建成":
code = "conState-1";
break;
case "在建中":
code = "conState-2";
break;
case "规划中":
code = "conState-3";
break;
case "山坳":
code = "landfill-1";
break;
case "废弃矿坑":
code = "landfill-2";
break;
case "平地堆放":
code = "landfill-3";
break;
case "其他":
code = "landfill-4";
break;
default:
code = "";
}
}
return code;
}
/**
* 格式化code 拼接英文逗号--给exportExcel()调用
*/
public String formatCode(String[] arrCodes) throws Exception {
List codes = new ArrayList<>();
for (String title : arrCodes) {
String code = codeByTitle(title);
// if(StringUtils.isEmpty(code)){
// throw new Exception(title+"不正确");
// }
codes.add(code);
}
return StringUtils.join(codes, ",");
}
excel填入内容:
上传完成后页面列表: