当前位置: 首页 > news >正文

POI导入时相关的EXCEL校验

一、单元格值非空校验

    public static Boolean poiCellIsNull(Cell cell){if (Objects.isNull(cell)){return true;}else {if (cell.getCellType() == Cell.CELL_TYPE_BLANK){return true;}else if (cell.getCellType()==Cell.CELL_TYPE_STRING && cell.getStringCellValue().trim().isEmpty()){return true;}else {return false;}}}

二、获取EXCEL的 sheet && 单元格值类型是否合规校验

注-参数说明:

        第一个是mutiple获取的文件字节流,第二个参数是文件类型(xls、xlsx),

        第三个参数是 数据行数的开始索引,第四个参数是数据列数的开始索引,

        第五个参数是不为空的列数字符串,例如:"1,2,3"==》表示第1列、第二列、第三列所属单元格的值不能为空

        第六个参数是一个Map<Integer,Integer>类型,表示第几列单元格的值类型应该为xxx;枚举值是开始的前三行,分别是字符串类型(0),数字类型(1),日期类型(2)

        例如:map.put(1,EXCEL_STRING); ===》表示第一列所属单元格的值应该为字符类型。

    public static final Integer EXCEL_STRING = 0;public static final Integer EXCEL_NUMBER = 1;public static final Integer EXCEL_DATE = 2;public static Sheet getExcelDataSingleSheet(InputStream inputStream,String fileType,Integer rowStartIndex,Integer culStartIndex, String notNullStr,Map<Integer,Integer> classJudgeMap) throws IOException {Workbook workbook = null;if ("xls".equals(fileType)){workbook = new HSSFWorkbook(inputStream);}else if ("xlsx".equals(fileType)){workbook = new XSSFWorkbook(inputStream);}else {throw new IOException("文件类型不存在,请检查!");}//获取第一个sheet页Sheet sheet = workbook.getSheetAt(0);Row rowTitle = null;if (rowStartIndex==1){rowTitle = sheet.getRow(0);}int lastRowNum = sheet.getLastRowNum();for (int i = rowStartIndex; i <= lastRowNum; i++) {Row row = sheet.getRow(i);int lastCellNum = (int)row.getLastCellNum();for (int j = culStartIndex; j < lastCellNum; j++) {Cell cell = row.getCell(j);if (!notNullStr.isEmpty() && notNullStr.contains(String.valueOf(j)) && poiCellIsNull(cell)){StringBuffer stringBuffer = new StringBuffer();stringBuffer.append(String.format("第%d行,第%d列",i+1,j+1));if (rowStartIndex==1){String title = rowTitle.getCell(j).getStringCellValue();stringBuffer.append(String.format("【%s】",title));}stringBuffer.append("不准为空");throw new IOException(stringBuffer.toString());}StringBuffer errorMessage = new StringBuffer();try {if (classJudgeMap.containsKey(j)){switch (classJudgeMap.get(j)){case 0:errorMessage.append(String.format("第%d行,第%d列",i+1,j+1));errorMessage.append(String.format("【%s】",rowTitle.getCell(j).getStringCellValue()));errorMessage.append("应为字符类型");String stringCellValue = cell.getStringCellValue();break;case 1:errorMessage.append(String.format("第%d行,第%d列",i+1,j+1));errorMessage.append(String.format("【%s】",rowTitle.getCell(j).getStringCellValue()));errorMessage.append("应为数值类型");double numericCellValue = cell.getNumericCellValue();break;case 2:errorMessage.append(String.format("第%d行,第%d列",i+1,j+1));errorMessage.append(String.format("【%s】",rowTitle.getCell(j).getStringCellValue()));errorMessage.append("应为日期类型");Date dateCellValue = cell.getDateCellValue();break;default:break;}}}catch (IllegalStateException e){throw new IOException(errorMessage.toString());}catch (Exception e){e.printStackTrace();}}}return sheet;}

http://www.dtcms.com/a/325886.html

相关文章:

  • 使用行为树控制机器人(三) ——通用端口
  • Python面试题及详细答案150道(41-55) -- 面向对象编程篇
  • 《基于Redis实现高效消息队列的完整指南》
  • 在 RHEL9 上搭建企业级 Web 服务(Tomcat)
  • Java Selenium 自动打开浏览器保存截图
  • Spring Cloud系列—Gateway统一服务入口
  • 案例分析2:上层应用不稳定提示注册失败
  • Python(9)-- 异常模块与包
  • CLIP,BLIP,SigLIP技术详解【二】
  • Flink + Hologres构建实时数仓
  • 机器学习:基于OpenCV和Python的智能图像处理 实战
  • 【05】昊一源科技——昊一源科技 嵌入式笔试, 校招,题目记录及解析
  • 提示词注入攻防全解析——从攻击原理到防御浅谈
  • gophis钓鱼
  • 深入解析 resolv.conf 文件:DNS 配置的核心
  • 区间修改 - 差分
  • 在Linux中使用docker-compose快速搭建Prometheus监控系统
  • foreach 块并行加速
  • 澳洲增高营养品排行榜
  • 小波卷积YYDS!小波变换+CNN创新结合
  • 无人机航拍数据集|第11期 无人机人员行为目标检测YOLO数据集1868张yolov11/yolov8/yolov5可训练
  • 【bug】diff-gaussian-rasterization Windows下编译 bug 解决
  • STM32 HAL库驱动0.96寸OLED屏幕
  • 【学习】DCMM认证从“跟风“到“生存法则“的进化
  • EI检索-学术会议 | 人工智能、虚拟现实、可视化
  • react中父子数据流动和事件互相调用(和vue做比较)
  • 小杰python高级(three day)——matplotlib库
  • 关于微信小程序的笔记
  • 告别“焊武帝”时代!30-65W零外围A+C快充协议正式上线
  • Cherryusb UAC例程对接STM32内置ADC和PWM播放音乐和录音(下)=>UAC+STM32 ADC+PWM实现录音和播放