【Excel单元格类型的解析校验】Java使用POI解析excel数据
一、使用的maven依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version>
</dependency>
二、对上传的文件类型,文件大小进行校验控制
//TODO==上传校验文件名后缀、大小限制
if (org.springframework.util.StringUtils.isEmpty(file)) {return new ResultVO("请上传文件!");
}if (file.getSize() > 20971520 || file.getSize() == 0) //大于20MB
{return new ResultVO("文件大小大于0MB,小于20MB");
}
System.out.println(file.getContentType());
System.out.println(file.getOriginalFilename());List<String> typeList = Arrays.asList(".xls", ".XLS", ".xlsx", ".XLSX", ".doc", ".DOC", ".docx", ".DOCX", ".pdf", ".PDF", ".jpg", ".JPG", ".png", ".PNG", ".jepg", ".JPEG", ".bpm", ".BPM", ".zip", ".ZIP", ".rar", ".RAR");
String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
if (!typeList.contains(fileType)) {return new ResultVO("文件类型有误!");
}
//TODO==上传校验文件名后缀、大小限制
三、对是否使用模板进行Excel文件的上传进行校验 | 判断Excel固定单元格是否有值
public static String ExecelExport(MultipartFile file) {Sheet sheet;InputStream inputStream = null;try {//获取前端传递过来的文件对象,存储在“inputStream”中inputStream = file.getInputStream();//获取文件名String fileName = file.getOriginalFilename();//用于存储解析后的Excel文件Workbook workbook = null;//判断文件扩展名为“.xls还是xlsx的Excel文件”,因为不同扩展名的Excel所用到的解析方法不同String fileType = fileName.substring(fileName.lastIndexOf("."));if (".xls".equals(fileType)) {//HSSFWorkbook专门解析.xls文件workbook = new HSSFWorkbook(inputStream);} else if (".xlsx".equals(fileType)) {//XSSFWorkbook专门解析.xlsx文件workbook = new XSSFWorkbook(inputStream);} else {throw new BusinessException("导入文件类型非法");}//获取第一个sheet页Sheet sheet1 = workbook.getSheetAt(0);//获取固定行固定列,(获取想要进行校验的单元格的值)Cell cell = sheet1.getRow(0).getCell(11);String stringCellValue = cell.getStringCellValue();return stringCellValue;} catch (Exception e) {System.out.println(e.getMessage());e.printStackTrace();return null;} finally {try {inputStream.close();} catch (IOException e) {e.printStackTrace();return null;}}
}
四、Java解析Excel,获取单元格,并对单元格中的内容进行校验
//获得文本操作对象
XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());
// 得到第一个SHEET页面
XSSFSheet sheet = wb.getSheetAt(0);
// 开始进行SHEET页面解析
if(sheet != null){Set sfzhmSet = new HashSet();//校验,并将有问题的校验信息全部返回到前端String errResultMsg = "";for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {//排除表头,从第四行开始解析if (rowNum > 2) {//获取表格有数据的第一行XSSFRow hssfRow = sheet.getRow(rowNum);//获取第一行第一个单元格Cell cell = hssfRow.getCell(0);//判断单元格里内容是否为空if (hssfRow == null || cell == null || cell.getCellType() == CellType.BLANK) {continue;}//进行基本数据校验String errMsg = ValidateUtil.validatePersonnelInfo(hssfRow).toString();if (StringUtils.isNotBlank(errMsg)) {errResultMsg += errMsg;}}}//将全部校验结果返回至前端if(!"".equals(errResultMsg)){return new ResultVO(errResultMsg);}
}
五、获取单个Excel单元格的类型,进行相关的校验
CellType.NUMERIC:数字类型
CellType.STRING:字符串类型
CellType.FORMULA:公式类型
CellType.BLANK:空值类型
CellType.BOOLEAN:Boolean类型
CellType.ERROR:错误故障类型
//获取单个单元格的数据类型
public static String getCellValue(Cell cell) {String cellValue = "";if (cell == null) {return cellValue;}// 判断数据的类型switch (cell.getCellType()) {case NUMERIC:// 数字cellValue = String.valueOf(cell.getNumericCellValue());break;case STRING:// 字符串cellValue = String.valueOf(cell.getStringCellValue());break;case BOOLEAN:// BooleancellValue = String.valueOf(cell.getBooleanCellValue());break;case FORMULA:// 公式cellValue = String.valueOf(cell.getCellFormula());break;case BLANK:// 空值cellValue = "";break;case ERROR:// 故障cellValue = "非法字符";break;default:cellValue = "未知类型";break;}return cellValue;
}
1、若Excel中导入的字符串数字类型变成了NUMERIC数字类型:
解决方法: NumberToTextConverter.toText();
if(c.getCellType()==CellType.NUMERIC){returnStr = NumberToTextConverter.toText(c.getNumericCellValue());
}
参考链接:https://blog.csdn.net/FxxYSHOOO/article/details/126297887
2、excel中数据明明是yyyy/mm/dd ,java程序解析为dd-M月-yyyy | Excel中,单元格类型为NUMERIC的日期数据的处理:
处理方式:需要先将数据转化为天数,在转成日期格式的字符串。
//1、将数据转化为天数
double value = cell.getNumericCellValue();
//2、将天数转成日期格式的字符串
Calendar calendar = new GregorianCalendar(1900,0,-1);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date d = calendar.getTime();
Date dd = DateUtils.addDays(d,Integer.valueOf((int) value));
String format1 = formatter.format(dd);//将日期转化为字符串格式
参考链接:https://blog.csdn.net/qq_43354492/article/details/128124813
3、更全面的解析Excel单元格类型,并对数据进行处理的方法:
主要是对 数据类型 和 公式类型 两种有细分的区别处理;
public static final String REGEX = "\n";
//getCellValue出来的数据就是去格式化之后的正确数据
private String getCellValue(Cell cell) {Object cellValue;if (cell != null) {cellValue = cellValue(cell);} else {cellValue = "";}return String.valueOf(cellValue);}private Object cellValue(Cell cell) {//判断cell类型Object cellValue;switch (cell.getCellType()) {case NUMERIC: {cellValue = date(cell);break;}case FORMULA: {cellValue = formula(cell);break;}case STRING: {cellValue = cell.getRichStringCellValue().getString().replaceAll(REGEX, " ") ;break;}default:cellValue = cell.getStringCellValue();}return cellValue;}private Object formula(Cell cell) {//判断cell是否为日期格式Object cellValue = null;try {cellValue = date(cell);} catch (Exception e) {if (e.getMessage().contains(STRING)) {cellValue = cell.getRichStringCellValue().getString().replaceAll(REGEX, " ");}}return cellValue;}private Object date(Cell cell) {Object cellValue;if (DateUtil.isCellDateFormatted(cell)) {cellValue = cell.getDateCellValue();cellValue = cellDate(cellValue);} else {//数字cell.setCellType(CellType.STRING);cellValue = cell.getRichStringCellValue();}return String.valueOf(cellValue).replaceAll(REGEX, " ");}private Object cellDate(Object cellValue) {DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");cellValue = formater.format(cellValue);return cellValue;}
参考链接1:https://blog.csdn.net/icemeco/article/details/130872752
参考链接2:https://blog.csdn.net/FxxYSHOOO/article/details/126297887
相关文章:
【Excel单元格类型的解析校验】Java使用POI解析excel数据
一、使用的maven依赖: <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version> </dependency> <dependency><groupId>org.apache.poi</groupId&…...
【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建)
CI/CD是持续集成,持续部署,集成就是开发人员通过自动化编译,发布,测试的手段集成软件,在开发的测试环境上测试发现自己的错误;持续部署是自动化构建,部署,通常也是在测试环境上进行&…...
为什么要在电影院装监控?有什么作用?
近期小编在网上看到有很多人在讨论:电影院的摄像头有多高清?看电影时的小动作放映员都能看得一清二楚?答案是:是的。但大家也不必有心理负担,电影院的监控目的不是为了监控观众,更多的是为了保障观影者的权…...
攻防世界题目练习——Web引导模式(三)(持续更新)
题目目录 1. mfw2. Cat3.4.5. 1. mfw 进去看到网页和页面内容如下: 看到url的参数 ?pageabout ,我以为是文件包含什么的,反复试了几次,想用 …/…/…/…/etc/passwd ,但是发现.似乎被过滤了,实在不知道怎…...
Python制作PDF转Word工具(Tkinter+pdf2docx)
一、效果样式 二、核心点 1. 使用pdf2docx完成PDF转换Word 安装pdf2docx可能会报错,安装完成引入from pdf2docx import Converter运行也可能报错,可以根据报错提示看缺少那些库,先卸载pip uninstall xxx,使用pip install python-docx -i htt…...
有哪些手段可以优化 CSS, 提高性能
CSS优化是Web开发中提高性能和用户体验的关键部分。下面详细解释一些CSS优化的方法,以提高性能: 合并和压缩CSS文件: 合并文件:将多个CSS文件合并成一个,以减少HTTP请求次数。这可以通过构建工具(如Webpack)…...
ARM可用的可信固件项目简介
安全之安全(security)博客目录导读 目录 一、TrustedFirmware-A (TF-A) 二、MCUboot 三、TrustedFirmware-M (TF-M) 四、TF-RMM 五、OP-TEE 六、Mbed TLS 七、Hafnium 八、Trusted Services 九、Open CI 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现…...
信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)
信创办公–基于WPS的Word最佳实践系列 (图文环绕方式) 目录 应用背景操作步骤1、 打开布局选项中图文环绕方式的方法2、 图文环绕三大类型 应用背景 在Word中,对文字和图片进行排版时,采用各种不同的图片与文字组合效果能够使页面…...
Naive UI数据表格分页pageCount配置没效果
吐槽:因为naive-ui是基于vue3,所以目前的组件资料是少之又少啊,虽然好用,但感觉没有特别的普及。 背景:记得1年前我第一次碰到了这个问题,在列表里使用:pagination分页,怎么都不显示页码&#…...
Kibana Discover数据查询
步骤1:打开管理页面(Management) 步骤2: 因为前面的章节导入航班数据的时候,自动创建了一个名字叫kibana_sample_data_flights的航班数据索引,如果我们只想搜索kibana_sample_data_flights索引的数据,则不需要通配符&…...
笔记 | 编程经验谈:如何正确的使用内存
笔记 | 编程经验谈:如何正确的使用内存 首先我们要了解内存的分配方式。一般来说,内存的分配方式有三种: 1.从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 2.在栈上创建。在执行函数时,函数内…...
C语言入门-1.1 C语言概述
想要学好一门计算机编程语言,就和谈一个女朋友是一样的,需要对其深入了解。 1、计算机语言 (1)什么是计算机语言? 顾名思义,就是计算机之间交流的语言,就和人一样,咱们都是使用普通…...
周记之学习总结
你在人群中看到的每一个耀眼的女孩,都是踩着刀尖过来的。你如履平地般地舒适坦然,当然不配拥有任何光芒; 10.11-10.12 思来想去还是不舍得,搞了一下这个jwt,看了很多视频和博客,一直没看懂,两…...
程序设计:C++ 一个可以放入共享内存的string模板
共享内存由于是多进程共享的,里面的数据不适合包含指针,因为共享内存在不同进程里的地址并不相同。尽管可以在连接共享内存时指定连接地址,但是,这样做限制太多: 不同硬件、系统这个地址可能不一样,没有通…...
【EI会议征稿】第三届应用力学与先进材料国际学术会议(ICAMAM 2024)
第三届应用力学与先进材料国际学术会议(ICAMAM 2024) 2024 3rd International Conference on Applied Mechanics and Advanced Materials(ICAMAM 2024) 第三届应用力学与先进材料国际学术会议(ICAMAM 2024)…...
Python -- I/O编程
文章目录 一、文件读写1. 读文件2. 二进制文件3. 字符编码4. 写文件 二、StringIO和BytesIO三、操作文件和目录1. 操作系统命令2. 操作文件 四、序列化五、 JSON六、异步IO1. 协程2. asyncioasync/awaitaiohttp 一、文件读写 Python内置了读写文件的函数,用法和C是…...
langchain入门指南和实战
简单介绍 LangChain 是一个开源的语言模型集成框架,旨在简化使用大型语言模型(LLM)创建应用程序的过程。 利用它可以让开发者使用语言模型来实现各种复杂的任务,例如文本到图像的生成、文档问答、聊天机器人、 调用特定的SaaS服务…...
群晖synology DSM 7.2设置钉钉Webhooks通知
现在越来越多的小伙伴都有了自己的Nas系统,为了更加方便的接收Nas的消息,这篇文章带着大家一起配置一个钉钉(机器人)即时消息通知 首先登录钉钉的开放平台:开发者后台统一登录 - 钉钉统一身份认证 1.创建一个机器人&…...
STP生成树协议详解
一、STP作用 如果链路断开或节点故障,那么互联的设备就无法正常通信了,这类网络问题叫做单点故障。没有备份的链路或节点,出现故障会直接断网。如果要提供 724 小时不间断的服务,那就需要在网络中提前部署冗余。避免出现单点故障…...
CentOS 6/7/8 操作系统镜像下载
CentOS Mirrors List 编辑 DownloadAbout About CentOS Frequently Asked Questions (FAQs) Special Interest Groups (SIGs) CentOS Variants Governance Community Contribute Forums Mailing Lists IRC Calendar & IRC Meeting List Planet Submit a Bug Stories Doc…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...
