最近做了一个导入excel的相关需求,不难。但是测试过程中,发现导入文件格式的不确定性,需要校验过滤。

*即使提供了导入模板的下载,但是你不能确保用户在导入的时候,不会对模板本身做修改。

我个人觉得这种校验实属没必要,因为在提供的模板中,应该限制哪些地方可以编辑,哪些不可以,而不是在后台代码中做这种验证。不过从代码逻辑的角度来讲,也不妨来看看,这种校验该如何处理。

/*** 检验导入Excel的格式* @param excel* @return* @throws Exception*/
public String checkExcelPattern(MultipartFile excel) throws IOException{if(excel == null || excel.isEmpty()){throw new BusinessException("导入文件不能为空!");}//用于拼接校验结果StringBuilder builder = new StringBuilder();if((excel.getSize()/1048576)>2){builder.append("上传文件仅支持2M以内的Excel文件;");}//校验文件格式,必须为excel文件String fileName = excel.getOriginalFilename();String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);if (!"xlsx".equals(suffix)) {builder.append("导入文件只支持xlsx类型后缀;");}//校验文件表头InputStream fin = excel.getInputStream();XSSFWorkbook wb = new XSSFWorkbook(fin);String[] columnName = {"学号*", "姓名*", "性别*", "年龄"};Sheet sheet = wb.getSheetAt(0);Row row = sheet.getRow(0);if (row != null && row.getLastCellNum() >= columnName.length) {int lastCellNum = row.getLastCellNum();for (int idx = 0; idx < lastCellNum; idx++) {String value = getCellValue(row.getCell(idx)).trim();if (idx < 4) {if (StringUtils.isBlank(value) || !columnName[idx].equals(value)) {builder.append("第" + (idx + 1) + "列表头应为" + columnName[idx] + ";");}} else {if (idx == 4) {builder.append("导入文件只应该有4列;");}}}} else {builder.append("上传文件首行不能为空,且应与模板文件表头保持一致;");}if(builder.length()>0){builder.setCharAt(builder.length()-1, '!');}return builder.toString();
}/*** 获取cell值* @param cell* @return*/
private String getCellValue(Cell cell) {String cellValue = "";// 以下是判断数据的类型switch (cell.getCellType()) {case Cell.CELL_TYPE_NUMERIC: // 数字if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");cellValue = sdf.format(org.apache.poi.ss.usermodel.DateUtil.getJavaDate(cell.getNumericCellValue())).toString();} else {DataFormatter dataFormatter = new DataFormatter();cellValue = dataFormatter.formatCellValue(cell);}break;case Cell.CELL_TYPE_STRING: // 字符串cellValue = cell.getStringCellValue();break;case Cell.CELL_TYPE_BOOLEAN: // BooleancellValue = cell.getBooleanCellValue() + "";break;case Cell.CELL_TYPE_FORMULA: // 公式cellValue = cell.getCellFormula() + "";break;case Cell.CELL_TYPE_BLANK: // 空值cellValue = "";break;case Cell.CELL_TYPE_ERROR: // 故障cellValue = "非法字符";break;default:cellValue = "未知类型";break;}return cellValue;
}

上述代码校验了文件类型、大小和第一列表头。

Java验证导入excel格式相关推荐

  1. JAVA通过导入一定格式的excel对数据库数据进行模糊筛选

    JAVA通过导入一定格式的excel对数据库数据进行模糊筛选 在工作中遇到一个需求是通过导入固定格式的excel来和数据库数据进行模糊匹配,符合条件的可以通过,不符合条件的就不通过,解决代码: 首先要 ...

  2. 关于使用Java后台导入excel文件,读取数据后,更新数据库,并返回数据给到前端的相关问题总结

    在之前的项目中,使用到了Java后台读取excel文件数据的功能点,本想着该功能点已经做过了,这一类的应该都大差不离,不过在刚结束的一个项目中,现实给我深深的上了一课,特此编写此片博客,以作记录,并给 ...

  3. Java中导入Excel文件

    public List<GbHoInfo> loadScoreInfo(String xlsPath) throws IOException{List<GbHoInfo> te ...

  4. Java EasyExcel导入日期格式的数据变成数字 (excel解决方案)

    当前excel的单元体是日期的样子如下: 看着还算正常,但是更换成文本格式之后就变成了数字: 这就是EasyExcel导入的时候为什么老是检测出来是数字的原因. 在不修改代码的情况下,有一个很简单的方 ...

  5. java easyreport 导入excel、 txt 数据数据格式校验(六)

    在大部分情况下我们需要对导入数据的内容.格式进行合法性验证,验证不通过需要我们提示错误信息. 导入xls数据内容 姓名 年龄 科目 分数 王老五 12 语文 80 柯景腾 13 语文 78 沈佳宜 1 ...

  6. java easyreport 导入excel、 txt 数据复合属性(二)

    在导入报表的时候,经常会遇到对象属性是集合或数组形似的,如学生会有多个老师,那么这种属性是集合或数组形式的报表如何设置,以及导入呢. Teacher类 package model; public cl ...

  7. java解析导入excel表格转为实体类javabean

    最近公司需求解析excel,一开始使用poi做的挺好的,后来直接上了几十万条数据的excel文件,内存直接溢出了,网上查到apache poi还提供了专门处理海量数据的方法,使用sax解析,果然用了内 ...

  8. java下载文件excel格式错乱,excel获取文件表格数据格式化-excel表格里的文件突然格式全部乱了,怎么恢复?...

    JAVA实现EXCEL表格文件(.xls格式)的读取.修改.... 在excel中,找打开按钮,选择文件格式为 .csv的,然后选择你要导入的CSV文件,会自动弹出文本导入向导,选择数据的分隔符,可以 ...

  9. java问卷导入excel,将Excel数据直接上传到问卷星

    一.什么样的数据可以上传 1.如果您已经有了一批报名者的数据,需要使用到问卷星的签到功能.可以将整理好的报名者数据,上传到系统中. 2.如果您有一批数据需要针对个人公开,可以先将数据上传到问卷星,再设 ...

  10. Java实现复杂excel格式导出

    根据公司业务需求,导出复杂格式的Excel表格,主要是单元格的合并. 效果图如下: 标题.表头.内容样式 具体根据各自业务需求对参数进行调整 /*** 创建标题样式** @param wb* @ret ...

最新文章

  1. java h5获取ip,websocket中获取客户端通信的真实IP
  2. 把十进制转化为二进制的一种方法
  3. 《Java8实战》笔记(01):为什么要关心Java8
  4. 一元享移动怎么样_中国移动放大招!月租9元享200GB流量,网友:这套路谁敢用?...
  5. 最强开源OCR!印刷体古籍文字识别超越著名商业软件ABBYY
  6. 中国输卵管癌治疗行业市场供需与战略研究报告
  7. 软件测试算是后端吗,软件测试--前后端数据交互
  8. 【C语言】15-预处理指令1-宏定义
  9. 使用Pandas对销售数据进行分析
  10. 论文阅读-Detecting and Recovering Sequential DeepFake Manipulation(SeqFakeFormer)
  11. 一款基于安卓的观看漫画的app,有漫画排行榜、漫画目录、收藏夹、历史记录、漫画搜索、更新推送服务等
  12. linux基础(五)----linux命令系统学习----系统管理命令
  13. 惠普1005w打印机使用说明书_【惠普NS1005w 一体机功能展示】卡槽|色带|APP|按钮|收纳_摘要频道_什么值得买...
  14. 【小白练习】一元二次方程计算器
  15. 红米k40关闭广告方法分享(图文)
  16. halide 入门实战(1)
  17. CentOS下安裝Nvidia docker 2.0:[Errno 256] No more mirrors to try錯誤及解決方式
  18. ArcGIS中根据DEM提取等高线和高程点(附练习数据)
  19. es中document的主键id及局部更新
  20. 2022暑期实践(Django教程学习记录)(第三周1)P44靓号管理-分页组件封装

热门文章

  1. 转换到coff期间_fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 | Lellansin's 冰森...
  2. python中tab键表示为_python中的tab键表示什么意思
  3. S_ALR_87011963 No data selected
  4. CWaitCursor 光标设置为沙漏形状
  5. LaTeX引用参考文献——BibTex参考文献格式大全
  6. Java编写的“滑稽”表情屏保程序
  7. 阿里巴巴高级技术专家:如何成为优秀的技术主管(上篇)
  8. 简单理解有监督学习、无监督学习、强化学习
  9. iTunes出现“iTunes不能读取iPhone的内容,请前往iPhone偏好设置的摘要选项卡,然后点击“恢复””的解决办法
  10. iphone链接电脑无法在我的计算机显示,iphone连接电脑不显示信任怎么回事