//导入表格数据
@RequestMapping(value = "/manage/list/insertStatics",method = RequestMethod.POST)
@ResponseBody
public String insertStatics(HttpServletRequest request, HttpServletResponse response) throws Exception {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
Map<String,String> map = new HashMap<>();
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
for (Iterator it = multiRequest.getFileNames(); it.hasNext(); ) {
String key = (String) it.next();
MultipartFile multipartFile = multiRequest.getFile(key);
String originalFileName = multipartFile.getOriginalFilename();
// b-截取后缀, 重命名文件, 使用uuid+后缀的方式命名保存到服务器上的文件
String suffix = originalFileName.substring(originalFileName
.lastIndexOf("."));
logger.info("文件后缀: " + suffix);
if (!suffix.equals("xls") && !suffix.equals("xlsx")) {
//导入EXCEL数据的校验
InputStream is = multipartFile.getInputStream();
Map<String, Object> checkResultMap = checkResult(is);
// 将数据存入redis
boolean flag = (Boolean) checkResultMap.get("flag");
if(flag){
Map<String, Object> map1 = new HashMap<>();
map1.put("titleInfo",checkResultMap.get("titleInfo"));
map1.put("timeInfo",checkResultMap.get("timeInfo"));
map1.put("check",checkResultMap.get("check"));
redisTemplate.boundValueOps(ScreenConstant.CHECK).set(JsonUtil.toJson(map1));
}else{
return new AppError("2001", (String)checkResultMap.get("errorMsg")).toString();
}
}else{
return new AppError("9999", "上传的文件不是EXCEL格式").toString();
}
}
return toObjJson("上传成功");
}else {
return new AppError("2006", "文件不存在,请重试").toString();
}
}
//封装表格数据
private Map<String, Object> checkResult(InputStream is) {
Map<String, Object> checkResultMap = new HashMap<String, Object>();
boolean flag = true;
String errorMsg = "";
String titleInfo = "";
Set<String> set = new HashSet<String>();
String timeInfo = "";
List<CheckVO> arrList = new ArrayList<>();
int num = 0;
try {
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
// 通过head获得抄表类型,对应不同操作
XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
for (int rowNum = 0; rowNum < sheet.getPhysicalNumberOfRows(); rowNum++) {
XSSFRow xssfRow = sheet.getRow(rowNum);
if(rowNum == 0){
if (xssfRow == null) {
errorMsg = "标题信息不能为空";
checkResultMap.put("flag", flag);
checkResultMap.put("errorMsg", errorMsg);
return checkResultMap;
}
titleInfo = getCellStringValue(xssfRow.getCell(0));
}else if(rowNum ==1){
num = xssfRow.getPhysicalNumberOfCells();
for(int i=0;i<num;i++){
if(i==0){
continue;
}else{
String timeName = getCellStringValue(xssfRow.getCell(i));
if(!set.add(timeName)){
errorMsg = "第"+(rowNum+1)+"行,时间已存在,请检查!";
continue;
}
timeInfo +="'"+timeName+"',";
}
}
}else{
if (xssfRow == null) {
continue;
}
CheckVO vo = new CheckVO();
List<Double> nums = new ArrayList<>();
for(int i=0;i<num;i++){
if(i==0){
String checkName = getCellStringValue(xssfRow.getCell(i));
if(StringTool.isEmpty(checkName)){
errorMsg = "第" + (rowNum + 1) + "名称不能为空!";
continue;
}else{
vo.setCheckName(checkName);
}
}else{
if(StringTool.isEmpty(xssfRow.getCell(i))){
nums.add(0.0);
}else{
String numInfo = getCellStringValue(xssfRow.getCell(i));
if(StringTool.isEmpty(numInfo)){
nums.add(0.0);
}else{
nums.add(Double.valueOf(numInfo));
}
}
}
}
vo.setNumList(nums);
arrList.add(vo);
}
}
}catch (Throwable t){
logger.debug(t.getMessage());
t.printStackTrace();
errorMsg = "导入数据出错";
flag = false;
}
// 保存到校验结果map中
checkResultMap.put("flag",flag);
checkResultMap.put("errorMsg",errorMsg);
checkResultMap.put("titleInfo",titleInfo);
checkResultMap.put("timeInfo",timeInfo);
checkResultMap.put("check",arrList);
return checkResultMap;
}
public String getCellStringValue(XSSFCell cell) {
String cellValue = "";
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING://字符串类型
cellValue = cell.getStringCellValue();
if (cellValue.trim().equals("") || cellValue.trim().length() <= 0)
cellValue = " ";
break;
case XSSFCell.CELL_TYPE_NUMERIC: //数值类型
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case XSSFCell.CELL_TYPE_FORMULA: //公式
cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK:
cellValue = " ";
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
break;
case XSSFCell.CELL_TYPE_ERROR:
break;
default:
break;
}
return cellValue;
}
//读取缓存中的数据
@RequestMapping(value = "/manage/list/model", method = RequestMethod.GET)
public String staticsModel(ModelMap map) {
String jsonInfo = String.valueOf(redisTemplate.boundValueOps(ScreenConstant.CHECK).get());
Map<String,Object> map1 = JsonUtil.fromJson(jsonInfo, HashMap.class);
map.put("titleInfo",map1.get("titleInfo"));
map.put("timeInfo",map1.get("timeInfo"));
List<CheckVO> list = (List<CheckVO>) map1.get("check");
map.put("checkJson", JsonUtil.toJson(list));
return "list/model";
}