diff --git a/pom.xml b/pom.xml index a57869d..a90ec89 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,21 @@ 2.0.26 + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + + io.jsonwebtoken jjwt 0.9.0 diff --git a/src/main/java/com/iflytop/nuclear/controller/UploadController.java b/src/main/java/com/iflytop/nuclear/controller/UploadController.java index 4cf46bd..efa36bc 100644 --- a/src/main/java/com/iflytop/nuclear/controller/UploadController.java +++ b/src/main/java/com/iflytop/nuclear/controller/UploadController.java @@ -1,6 +1,10 @@ package com.iflytop.nuclear.controller; +import com.alibaba.fastjson2.JSONObject; +import com.iflytop.nuclear.service.UploadService; +import com.iflytop.nuclear.utils.ResponseData; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; @@ -24,13 +28,21 @@ import java.util.Set; @RestController @CrossOrigin public class UploadController { + + @Autowired + UploadService uploadService; + @PostMapping("/upload") - public String uploadToLocal(MultipartFile file){ + public ResponseData uploadToLocal(MultipartFile file) throws IOException { + // 对当前文件中内容格式进行校验 + boolean isValid = uploadService.verifyFileFormat(file); + if (!isValid) { + return ResponseData.fail("上传文件内容未按照标准版式排版"); + } // 获取文件原本的名字 String originName = file.getOriginalFilename(); // 判断文件是否是pdf文件 Set set = new HashSet<>(); - set.add(".xls"); set.add(".xlsx"); // 取出文件的后缀 int count = 0; @@ -43,10 +55,9 @@ public class UploadController { String endName = originName.substring(count); //取出文件类型 String fileType = originName.substring(count + 1); //文件类型 if(!set.contains(endName)){ - return new String("上传的文件类型错误,只能上传xls,xlsx类型的文件"); + return ResponseData.fail("上传的文件类型错误,只能上传xlsx类型的文件"); } - // 创建保存路径 - //日期格式 + // 创建保存路径 后期使用保存在数据库中的id进行取名 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String format = sdf.format(new Date()); String savePath = System.getProperty("user.dir") + "/" + "uploadfiles" + "/" + fileType + "/" + format; @@ -60,9 +71,11 @@ public class UploadController { try { file.transferTo(new File(folder,saveName)); String filePath = savePath + "\\" + saveName; - return new String("文件路径为:" + filePath); + JSONObject res = new JSONObject(); + res.put("path", filePath); + return ResponseData.success(res); } catch (IOException e){ - return new String(e.getMessage()); + return ResponseData.fail(e.getMessage()); } } } diff --git a/src/main/java/com/iflytop/nuclear/service/UploadService.java b/src/main/java/com/iflytop/nuclear/service/UploadService.java new file mode 100644 index 0000000..90e79e9 --- /dev/null +++ b/src/main/java/com/iflytop/nuclear/service/UploadService.java @@ -0,0 +1,16 @@ +package com.iflytop.nuclear.service; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + * @author cool + * @date 2023/6/28 14:20 + */ +@Transactional +public interface UploadService { + boolean verifyFileFormat(MultipartFile file) throws IOException; + +} diff --git a/src/main/java/com/iflytop/nuclear/service/impl/UploadServiceImpl.java b/src/main/java/com/iflytop/nuclear/service/impl/UploadServiceImpl.java new file mode 100644 index 0000000..fbffbcc --- /dev/null +++ b/src/main/java/com/iflytop/nuclear/service/impl/UploadServiceImpl.java @@ -0,0 +1,38 @@ +package com.iflytop.nuclear.service.impl; + +import com.iflytop.nuclear.service.UploadService; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; + +/** + * @author cool + * @date 2023/6/28 14:21 + */ +@Service +public class UploadServiceImpl implements UploadService { + @Override + public boolean verifyFileFormat(MultipartFile file) throws IOException { + InputStream inputStream = file.getInputStream(); + Workbook wb = new XSSFWorkbook(inputStream); + //默认会跳过第一行标题 + // 得到第一个shell + Sheet sheet = wb.getSheetAt(0); + // 得到Excel的行数 + int physicalNumberOfRows = sheet.getPhysicalNumberOfRows(); + int totalCells = 0; + // 得到Excel的列数(前提是有行数) + if (physicalNumberOfRows > 1 && sheet.getRow(1) != null) { + totalCells = sheet.getRow(1).getPhysicalNumberOfCells(); + } + if (physicalNumberOfRows == 41 && totalCells == 14) { + return true; + } + return false; + } +} diff --git a/src/main/java/com/iflytop/nuclear/utils/ExcelUtils.java b/src/main/java/com/iflytop/nuclear/utils/ExcelUtils.java new file mode 100644 index 0000000..b736032 --- /dev/null +++ b/src/main/java/com/iflytop/nuclear/utils/ExcelUtils.java @@ -0,0 +1,162 @@ +// package com.iflytop.nuclear.utils; +// +// import com.iflytop.nuclear.model.NuclearCoreConfig; +// import org.apache.poi.hssf.usermodel.HSSFCell; +// import org.apache.poi.hssf.usermodel.HSSFWorkbook; +// import org.apache.poi.ss.usermodel.*; +// import org.apache.poi.xssf.usermodel.XSSFWorkbook; +// import org.springframework.web.multipart.MultipartFile; +// +// import java.io.IOException; +// import java.io.InputStream; +// import java.text.DecimalFormat; +// import java.time.LocalDate; +// import java.time.LocalDateTime; +// import java.time.format.DateTimeFormatter; +// import java.util.ArrayList; +// import java.util.List; +// +// /** +// * @author xjt +// * @version 1.0 +// */ +// public class ExcelUtils { +// //总行数 +// private static int totalRows = 0; +// //总条数 +// private static int totalCells = 0; +// //错误信息接收器 +// private static String errorMsg; +// +// /** +// * 读EXCEL文件,获取信息集合 +// * @return +// */ +// public static List getExcelInfo(MultipartFile mFile) { +// String fileName = mFile.getOriginalFilename();//获取文件名 +// try { +// if (!validateExcel(fileName)) {// 验证文件名是否合格 +// return null; +// } +// boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本 +// if (isExcel2007(fileName)) { +// isExcel2003 = false; +// } +// List userList = createExcel(mFile.getInputStream(), isExcel2003); +// return userList; +// } catch (Exception e) { +// e.printStackTrace(); +// } +// return null; +// } +// /** +// * 根据excel里面的内容读取客户信息 +// * @param is 输入流 +// * @param isExcel2003 excel是2003还是2007版本 +// * @return +// * @throws IOException +// */ +// public static List createExcel(InputStream is, boolean isExcel2003) { +// try{ +// Workbook wb = null; +// if (isExcel2003) {// 当excel是2003时,创建excel2003 +// wb = new HSSFWorkbook(is); +// } else {// 当excel是2007时,创建excel2007 +// wb = new XSSFWorkbook(is); +// } +// List userList = readExcelValue(wb);// 读取Excel里面客户的信息 +// return userList; +// } catch (IOException e) { +// e.printStackTrace(); +// } +// return null; +// } +// /** +// * 读取Excel里面客户的信息 +// * @param wb +// * @return +// */ +// private static List readExcelValue(Workbook wb) { +// //默认会跳过第一行标题 +// // 得到第一个shell +// Sheet sheet = wb.getSheetAt(0); +// // 得到Excel的行数 +// totalRows = sheet.getPhysicalNumberOfRows(); +// // 得到Excel的列数(前提是有行数) +// if (totalRows > 1 && sheet.getRow(0) != null) { +// totalCells = sheet.getRow(0).getPhysicalNumberOfCells(); +// } +// List userList = new ArrayList(); +// // 循环Excel行数 +// for (int r = 1; r < totalRows; r++) { +// Row row = sheet.getRow(r); +// if (row == null){ +// continue; +// } +// BuiPatientInfo user = new BuiPatientInfo(); +// // 循环Excel的列 +// for (int c = 0; c < totalCells-1; c++) { +// Cell cell = row.getCell(c); +// if (null != cell) { +// if (c == 0) { //第一列 +// //如果是纯数字,将单元格类型转为String +// if(cell.getCellTypeEnum() == CellType.NUMERIC){ +// cell.setCellType(CellType.STRING); +// } +// user.setPatientName(cell.getStringCellValue());//将单元格数据赋值给user +// } +// else if (c == 1){ +// if(cell.getCellTypeEnum() == CellType.NUMERIC){ +// cell.setCellType(CellType.STRING); +// } +// user.setPatientIdentity(cell.getStringCellValue()); +// } +// else if (c == 2){ +// if(cell.getCellTypeEnum() == CellType.NUMERIC){ +// cell.setCellType(CellType.STRING); +// } +// String stringCellValue = cell.getStringCellValue(); +// user.setHealingId(stringCellValue); +// } +// else if (c == 3){ +// if(cell.getCellTypeEnum() == CellType.NUMERIC){ +// cell.setCellType(CellType.STRING); +// } +// user.setElseInfo(String.valueOf(cell.getStringCellValue())); +// } +// } +// } +// //将excel解析出来的数据赋值给对象添加到list中 +// user.setUpdateTime(LocalDateTime.now()); +// user.setPatientBirthdate(IdentityUtil.getPatientBirth(user.getPatientIdentity())); //拿到身份中好通过已经写好的通过身份证信息获取出生年月工具类 +// user.setPatientSex(IdentityUtil.getPatientSex(user.getPatientIdentity())); //通过省份证号,获取男女信息工具类 +// user.setPatientState(1); //当前实体类字段是固定的,不是excel数据中的。每个对象都可以再遍历完后增加固定属性值 +// user.setCreateId(2L); +// user.setCreateTime(LocalDateTime.now()); +// // 添加到list +// userList.add(user); +// } +// return userList; +// } +// /** +// * 验证EXCEL文件 +// * +// * @param filePath +// * @return +// */ +// public static boolean validateExcel(String filePath) { +// if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) { +// errorMsg = "文件名不是excel格式"; +// return false; +// } +// return true; +// } +// // @描述:是否是2003的excel,返回true是2003 +// public static boolean isExcel2003(String filePath) { +// return filePath.matches("^.+\\.(?i)(xls)$"); +// } +// //@描述:是否是2007的excel,返回true是2007 +// public static boolean isExcel2007(String filePath) { +// return filePath.matches("^.+\\.(?i)(xlsx)$"); +// } +// } diff --git a/src/main/resources/public/a.xlsx b/src/main/resources/public/a.xlsx new file mode 100644 index 0000000..200b98c Binary files /dev/null and b/src/main/resources/public/a.xlsx differ diff --git a/uploadfiles/xlsx/20230628/堆芯模版.xlsx b/uploadfiles/xlsx/20230628/堆芯模版.xlsx new file mode 100644 index 0000000..3c6cbc0 Binary files /dev/null and b/uploadfiles/xlsx/20230628/堆芯模版.xlsx differ