场景

SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/88660466

在Excel导入到数据库后进行格式验证,如果有错误则将错误的Cell标红然后验证完成后

将标红的Excel下载到客户端。

实现

js中发送请求

//解析Excel操作
function parseExcel(){var url = "/wmsReceiveOrder/parseExcel";$.ajax({type: 'POST',url: url,cache: false,  //禁用缓存contentType: false,dataType: "json",processData:false,success: function (result) {//250则为验证不通过则下载不正确的excelif(result.statusCode=="250"){alert(result.message)window.location.href="/wmsReceiveOrder/downloadMistakeExcel";}else{alert(result.message)if(result.statusCode=="200"){window.location.reload()}}}})return false;
}

后台解析Excel的方法

 @Description("解析Excel")@ResponseBody@RequestMapping("/parseExcel")@Transactionalpublic Map<String, Object> parseExcel(HttpServletRequest request) {return receiveOrderService.parseExcel(request);}

serviceImpl

/**** 解析excel* @param request* @return*/@Override@Transactionalpublic Map<String, Object> parseExcel(HttpServletRequest request) {Map<String, Object> result = new HashMap<String, Object>();Workbook workbook = null;//验证标识Boolean isValidatePass = true;//获取文件路径String path = (String)request.getSession().getAttribute("currFilePath");if(path==null||path==""){result.put("statusCode", "300");result.put("message", "请先上传excel文件再导入");}else{//获取文件格式String fileType = path.substring(path.lastIndexOf(".") + 1, path.length());try {InputStream stream = new FileInputStream(path);//如果后缀名为xls,使用HSSFif (fileType.equals("xls")) {workbook = new HSSFWorkbook(stream);//如果后缀名是xlsx,使用XSSF}else if (fileType.equals("xlsx")){workbook = new XSSFWorkbook(stream);}Sheet sheet= workbook.getSheet("sheet1");//获取行数int rows=sheet.getPhysicalNumberOfRows();WmsReceiveOrder receiveOrder =new WmsReceiveOrder();//获取第一行数据Row row1 =sheet.getRow(0);if(row1!=null){//获取采购订单号row1.getCell(1).setCellType(Cell.CELL_TYPE_STRING);String purchaseCode =row1.getCell(1).getStringCellValue();receiveOrder.setPurchaseCode(purchaseCode);}//获取第二行数据Row row2 =sheet.getRow(1);if(row2!=null){//获取供应商送货单号row2.getCell(1).setCellType(Cell.CELL_TYPE_STRING);String deliveryCode =row2.getCell(1).getStringCellValue();receiveOrder.setDeliveryCode(deliveryCode);//日期格式加校验Cell deliveryTimeCell = row2.getCell(3);if(deliveryTimeCell!=null){//如果是数值类型if(deliveryTimeCell.getCellType()==0){if(HSSFDateUtil.isCellDateFormatted(deliveryTimeCell)){//获取送货日期Date deliveryTime =deliveryTimeCell.getDateCellValue();receiveOrder.setDeliveryTime(deliveryTime);}else{//设置送货时间为红色CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);deliveryTimeCell.setCellStyle(style);isValidatePass=false;}}else{//设置送货时间为红色CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);deliveryTimeCell.setCellStyle(style);isValidatePass=false;}}//获取供应商编号row2.getCell(5).setCellType(Cell.CELL_TYPE_STRING);String supplierCode =row2.getCell(5).getStringCellValue();receiveOrder.setSupplierCode(supplierCode);//获取供应商名称row2.getCell(6).setCellType(Cell.CELL_TYPE_STRING);String supplierName =row2.getCell(6).getStringCellValue();receiveOrder.setSupplierName(supplierName);}//获取第三行数据Row row3 =sheet.getRow(2);if(row3!=null){//获取ERP入货单号row3.getCell(1).setCellType(Cell.CELL_TYPE_STRING);String erpInCode =row3.getCell(1).getStringCellValue();receiveOrder.setErpInCod(erpInCode);Cell inTimeCell= row3.getCell(3);//如果是数值类型if(inTimeCell!=null&&inTimeCell.getCellType()==0){if(HSSFDateUtil.isCellDateFormatted(inTimeCell)){//获取入库日期Date inTime =row3.getCell(3).getDateCellValue();receiveOrder.setInTime(inTime);}else{CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);inTimeCell.setCellStyle(style);isValidatePass=false;}}else{CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);inTimeCell.setCellStyle(style);isValidatePass=false;}}receiveOrder.setType(1);receiveOrder.setStatus("1");//校验子表各条的数量以及生产日期以及物料编号是否存在for (int currentRow=4;currentRow<rows;currentRow++) {WmsReceiveOrderDetails wmsReceiveOrderDetails =new WmsReceiveOrderDetails();//获取物料编号sheet.getRow(currentRow).getCell(1).setCellType(Cell.CELL_TYPE_STRING);String materielNumber = sheet.getRow(currentRow).getCell(1).getStringCellValue();//获取生产日期Cell productDateCell= sheet.getRow(currentRow).getCell(4);//如果是数值类型if(productDateCell!=null&&productDateCell.getCellType()==0){if(!HSSFDateUtil.isCellDateFormatted(productDateCell)) {CellStyle style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);productDateCell.setCellStyle(style);isValidatePass = false;}}else{//设置生产日期为红色CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);productDateCell.setCellStyle(style);isValidatePass=false;}//对数量进行验证Cell numCell =sheet.getRow(currentRow).getCell(5);//如果是数值类型if(numCell!=null&&numCell.getCellType()==0){if(HSSFDateUtil.isCellDateFormatted(numCell)){//设置数量单元格为红色CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);numCell.setCellStyle(style);isValidatePass=false;}else{if(!String.valueOf(numCell.getNumericCellValue()).contains(".0")){//设置数量单元格为红色CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);numCell.setCellStyle(style);isValidatePass=false;}}}else{//设置为红色CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);numCell.setCellStyle(style);isValidatePass=false;}//对物料编号进行验证QueryWrapper<BusMaterielInfo> busMaterielInfoQueryWrapper =new QueryWrapper<BusMaterielInfo>();busMaterielInfoQueryWrapper.eq("materiel_number",materielNumber);BusMaterielInfo busMaterielInfo = busMaterielInfoMapper.selectOne(busMaterielInfoQueryWrapper);Cell materialNumberCell=sheet.getRow(currentRow).getCell(1);if(busMaterielInfo==null){CellStyle style =  workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex());style.setFillPattern(CellStyle.SOLID_FOREGROUND);materialNumberCell.setCellStyle(style);isValidatePass=false;}}//验证完成if(!isValidatePass){//将错误文件下载result.put("statusCode", "250");result.put("message", "Excel存在错误(红色部分)!");FileOutputStream fileOut = new FileOutputStream(path);workbook.write(fileOut);fileOut.close();}else {//查询条件Map<String, Object> map = new HashMap<String, Object>();map.put("delivery_code", receiveOrder.getDeliveryCode());map.put("supplier_code", receiveOrder.getSupplierCode());List<WmsReceiveOrder> wmsReceicveOrderList = wmsReceiveOrderMapper.selectByMap(map);if (wmsReceicveOrderList.size() == 0 || wmsReceicveOrderList == null) {boolean isSaveReceiveOrder = false;//如果前面主表验证通过则插入主表if (isValidatePass) {//插入receiveOrder表数据isSaveReceiveOrder = this.save(receiveOrder);}List<WmsReceiveOrderDetails> receiveOrderDetailsList = new ArrayList<WmsReceiveOrderDetails>();if (isSaveReceiveOrder) {//如果插入表头成功,获取插入数据的ID并插入详情表Long receiveId = receiveOrder.getId();for (int currentRow = 4; currentRow < rows; currentRow++) {WmsReceiveOrderDetails wmsReceiveOrderDetails = new WmsReceiveOrderDetails();wmsReceiveOrderDetails.setReceiveId(receiveId);//获取物料编号sheet.getRow(currentRow).getCell(1).setCellType(Cell.CELL_TYPE_STRING);String materielId = sheet.getRow(currentRow).getCell(1).getStringCellValue();wmsReceiveOrderDetails.setMaterielNumber(materielId);//获取物料名称sheet.getRow(currentRow).getCell(2).setCellType(Cell.CELL_TYPE_STRING);String materielName = sheet.getRow(currentRow).getCell(2).getStringCellValue();wmsReceiveOrderDetails.setMaterielName(materielName);//获取供应商批次sheet.getRow(currentRow).getCell(3).setCellType(Cell.CELL_TYPE_STRING);String supplierBatch = sheet.getRow(currentRow).getCell(3).getStringCellValue();wmsReceiveOrderDetails.setSupplierBatch(supplierBatch);//获取生产日期Date productDate = sheet.getRow(currentRow).getCell(4).getDateCellValue();wmsReceiveOrderDetails.setProductDate(productDate);//获取数量sheet.getRow(currentRow).getCell(5).setCellType(Cell.CELL_TYPE_STRING);Long num = Long.parseLong(sheet.getRow(currentRow).getCell(5).getStringCellValue());wmsReceiveOrderDetails.setNum(num);//获取托盘编号String salverCode = sheet.getRow(currentRow).getCell(6).getStringCellValue();wmsReceiveOrderDetails.setSalverCode(salverCode);wmsReceiveOrderDetails.setStatus("0");receiveOrderDetailsList.add(wmsReceiveOrderDetails);}if (receiveOrderDetailsList != null) {for (WmsReceiveOrderDetails wmsReceiveOrderDetails : receiveOrderDetailsList) {boolean isSaveReceiveOrderDetails = wmsReceiveOrderDetailsService.save(wmsReceiveOrderDetails);if (!isSaveReceiveOrderDetails) {result.put("statusCode", "300");result.put("message", "导入物料编号为:" + wmsReceiveOrderDetails.getMaterielNumber() + "出错了!");} else {if (isValidatePass == true) {result.put("statusCode", "200");result.put("message", "导入收货单成功!");} else {result.put("statusCode", "300");result.put("message", "导入收货单失败!");}}}}} else {result.put("statusCode", "300");result.put("message", "导入收货单失败!");}} else {//是否已经导入过判断结束result.put("statusCode", "300");result.put("message", "此收货单已经导入,请勿重复导入!!");}}//验证通过后的插入数据库} catch (FileNotFoundException e) {e.printStackTrace();result.put("statusCode", "300");result.put("message", e.toString());} catch (IOException e) {e.printStackTrace();result.put("statusCode", "300");result.put("message", e.toString());}}//判断是否已经上传文件return result;}

错误excel文件下载方法

 @Description("错误Excel下载")@RequestMapping("/downloadMistakeExcel")public String downloadMistakeExcel(HttpServletRequest request, HttpServletResponse response) {String path = (String)request.getSession().getAttribute("currFilePath");if (path != null) {//设置文件路径File file = new File(path);if (file.exists()) {//时间格式化格式SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyyMMddHHmmss");//获取当前时间并作为时间戳String timeStamp=simpleDateFormat.format(new Date());response.setContentType("application/force-download");// 设置强制下载不打开response.addHeader("Content-Disposition", "attachment;fileName="+timeStamp+"mistake.xlsx" );// 设置文件名byte[] buffer = new byte[1024];FileInputStream fis = null;BufferedInputStream bis = null;try {fis = new FileInputStream(file);bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream();int i = bis.read(buffer);while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}System.out.println("success");} catch (Exception e) {e.printStackTrace();} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}}return null;}

流程图

SpringBoot+POI实现导入Excel时验证并返回错误Cell标红的文件相关推荐

  1. 实现pandas导入excel时保留公式的文本内容

    实现pandas导入excel时保留公式的文本内容 excel数据(存在公式): 直接使用pandas读取excel时,无法保留公式的文本信息: 结合使用openpyxl模块中的data_only=F ...

  2. java中poi导入excel_java中使用poi实现导入Excel

    1.java中使用poi实现导入Excel public class XlsDto { /** * 选课号 */ private Integer xkh; /** * 学号 */ private St ...

  3. SpringBoot+POI+JXL实现excel导出并添加水印功能

    SpringBoot+POI+JXL实现excel导出并添加水印功能 1.Pom引入 实现过程,部分代码如下 1.Pom引入 <dependency><groupId>org. ...

  4. 若依系统导入Excel时优化字典字段的校验

    若依系统导入Excel时如果有字典字段,最好加校验判断该字典字段的值是否能够匹配到,如果匹配失败证明该值填错呢,要么生成错误报告提示要么直接提示导入失败不让导入. 如果当有很多列都是字典字段时,而且E ...

  5. PHPExcel导入Excel时长数字变成科学计数法调整

    PHPExcel导入Excel时长数字变成科学计数法调整 1.使用PHPExcel导入Excel表格时,长数字会变成科学计数法,表格中的数值类型为数字类型 比如450107630382345 导入打印 ...

  6. 数据库导入Excel时出现下标越界的解决办法

    数据库导入Excel时出现下标越界的解决办法 数据库导入Excel时出现下标越界的终极办法 原因 在使用的Excel不是本机制作的情况下,"下标越界"时有发生. 解决办法 1.将新 ...

  7. C#爬网页时“远程服务器返回错误: (403) 已禁止”解决方法

    C#爬网页时"远程服务器返回错误: (403) 已禁止"解决方法 参考文章: (1)C#爬网页时"远程服务器返回错误: (403) 已禁止"解决方法 (2)ht ...

  8. POI异步导入Excel兼容xsl和xlsx

    项目架构:spring+struts2+hibernate4+oracle 需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件 思路分析: 1.提供一个下载 ...

  9. 关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。

    本文目录 前言 转化的思路和对Excel中的错误的处理 最终代码 急需代码可以直接跳到最终代码~ 前言 近期实现了一个前端导入Excel的需求,然后问题就来了,Excel传来的日期是一串数字(非时间戳 ...

最新文章

  1. python生成订单号或生成任意序列
  2. win10使用WSL安装CentOS7
  3. JMeter 压力測试使用函数和 CSV 文件參数化 json 数据
  4. python程序改错题字符统计_Python练习题 012:字符统计
  5. 1026:空格分隔输出
  6. docker之docker-machine用法
  7. Angular之组件的创建
  8. mysql master host_mysql异步备份的有关问题,MASTER_HOST可否指定多个
  9. 金钱能让人更快乐吗?手把手教你用机器学习找到答案
  10. 原始的DSH深度哈希代码
  11. php操作mysql数据库的扩展有哪些_PHP mysql 扩展库 操作mysql数据库步骤
  12. c语言那些细节之little-endian和big-endian
  13. 股票历史数据下载工具_免费在线批量下载股票历史数据工具
  14. Web漏洞扫描工具AppScan v10.0.0的下载安装与使用
  15. 一分钟轻松掌握 !Java 高级数据结构 -- 原生 BitSet 源码刨析
  16. JavaScript获取标签的属性和DOM操作属性
  17. 将路由器作为AP来使用
  18. 被巨头“封杀”后,中国移动互联网企业如何加速出海
  19. 栀子花怎么养 栀子花的养殖方法和注意事项
  20. Unity5混音器DSP插件编写教程【一】

热门文章

  1. linux内核态real cred,Linux内核实验报告——实验5.doc
  2. ffmpeg实现摄像头拉流_[FFmpeg] 如何通过实时摄像头帧图片生成 rtmp 直播流?
  3. Spring-Aop-注解实现
  4. Linux下安装RabbitMQ
  5. java二叉堆_为什么二叉堆利用数组存储?
  6. java反编译工具_Android APP 取证之逆向工具篇
  7. php 解析配置文件,php 解析ini配置文件
  8. mybatisgenerator使用_如何优雅地使用MyBatisplus
  9. php获取页面a标签内容_AKCMS常用标签代码整理
  10. sql 截取_如何用 SQL 找一个女朋友?