在Java中解析Excel是很多管理类系统的重要功能, 目前主要有阿里的easyExcel和HSSF两种开源工具,如何使用网上有大量的例子,不再赘述,我们这里看三个我亲身经历的问题:

  1. 自动跳过空字段

  2. 中文内容自动给加了拼音

  3. 时间处理错误。

本文首先分析故障现象或者原因,之后给出解决方案。

1.自动跳过空字段

有些场景下上传的excle文件里有些选项是可选的,用户自然可以不填,但是在使用时会遇到问题。

例如如下的文件:

用户是否签到和是否允许使用pad都是可选的,用户可以根据实际需要填或者不填。但是我们在java 中使用XLSX提供的方法自动读取Excel,如下:

 String fileName = "/Users/liuqingchao/Downloads/five_2.xlsx";List<List<String>> lists = ExcelUtils.getXLSXDataOfFirstSheet(new FileInputStream(fileName));

结果会出现这样子:

可以看到,debug中很多行是空的,其中序号2、3、4对应的行元素都少了,其中序号2对应的是将文件中的空位置直接跳过了,这是无法接受的,因为后续对应关系都无法确定了。

测试发现,使用XSSF和早期版本的easyExcel都存在该问题。其底层都是基于迭代器方式读的,直接修改其源码不现实,但是可以自己来解析文件,详细实现见asyn-task的getExcelFileFixedZh()方法。

但是使用该方法会导致解析时间时出错。详见下一小节。

2.时间解析错误

我们知道正常的时间格式是”2022-10-31 16:09:13“,但是如果将其放在一个Excel格子里,用户在操作的时候,可能会将其写错,最明显的就是日期和时间之间的空格,如果是中文的空格,用户无法发现的,但是后续处理就会有问题,所以最好将其分开,日期和时间分别用一个格子,例如篇头给出的样子。

但是解析的时候仍然出问题,我们使用如下的代码来解析:

String fileName = "/Users/liuqingchao/Downloads/five_2.xlsx";
List<List<String>> lists= ExcelUtilsFixedZh.getExcelDataRowsInFirstSheet(new FileInputStream(fileName));System.out.println(lists);

可以看到日期解析没有问题,但是时间格子对应的全错了:

查阅之后发现,如果格子里存的是时间,Excel会自动进行类型转换, 没有日期就从1900年1月1日开始算,此时会出现两种情况,一种是直接将时间转换成”1900.1.1 19:00:00“,另一种是将时间倒退一天给变成”1899.1.1 19:00:00“,而后者转成时间戳就是我们看到的-2209035600000。前者在阿里easy Excel中出现过。

很明显,这都不是我们想要的。

而且,即使此时将List定义为List<List<String>>也无法阻止Excel自动转换时间。

3.中文信息后面带了拼音

该问题是于波发现的,偶尔出现,本人没能复现出来,现象就是中文信息后面自动给加了拼音, 例如本来存的是”否“,但是实际读到的是”否fou“。

4.解决方法

针对上述几个问题,目前发现比较好的方式是:使用easyExcel版本3。并定义一个与一行记录相对应的类。读取的时候,将类对象设置进去,这样可以解决上面提到的三个问题。

具体操作方法见:truman-lecture里AbstractExcelUploadExecutor下的

 List<BatchAddEpisodesExcelVO> records;try {records = AsynTaskFileUtils.getEasyExcelFileRecord(this.httpClient, innerHost, getParams().getResourceId(), BatchAddEpisodesExcelVO.class);}

这里的BatchAddEpisodesExcelVO就是与Excel文件完全对应的类对象。获得记录的核心为:

    public static <T> List<T> getEasyExcelFileRecord(HttpClient httpClient, String host, String resourceId, Class clazz) {.....EasyExcel.read(connection.getInputStream(), clazz, new PageReadListener<T>(dataList -> {for (T demoData : dataList) {list.add(demoData);}})).sheet().doReadSync();//同步方式return list;
.....}

此时虽然用了回调,但是将其设置为同步模式就可以保证获得全部记录之后才返回。

注意事项

另外注意一点,我们定义BatchAddEpisodesExcelVO这种与excle对应的对象的时候,最好将所有的属性,特别是日期相关务必用String类型,这样可以避免Excel给我们做数据转换。否则使用easyExcle解析时间会出现如下情况:

  1. 如果日期是Date类型,则直接抛异常。

  2. 如果时间是Date类型,则时间仍然是错的。

例如,我们还是使用上的文件,定义一个简单类:

@Getter
@Setter
@EqualsAndHashCode
public class DemoData {private String lectureId;private Date beginDate;private String beginTime;private String yunXu;private String locale;
}

然后执行,此时直接抛异常:

com.alibaba.excel.exception.ExcelDataConvertException: Convert data com.alibaba.excel.metadata.data.ReadCellData@4f7479f3 to class java.util.Date error

如果我们将上面的beginTime的类型改成Date,则时间错误:

结论:不要让excle给我们做转换,都先用String类型拿到所有数据,我们自己转换。

Java使用Excel的问题:自动跳过空字段、中文加拼音和时间处理错误的解决方法相关推荐

  1. 有道翻译 excel webservice 失效_VBA实践+excel英文逐句自动有道翻译为中文

    VBA实践+excel英文逐句自动有道翻译为中文 有一个需求是这样的,如下图所示,在一个excel工作表中,B列是英文,每一个单元格一句英文,在C列要填英文对应的有道机译结果.为保证准确度,要求必须一 ...

  2. java实现Excel文件解析---apache POI以及把汉字转化为拼音

    java实现Excel文件解析----apache  POI以及把汉字转化为拼音 1.POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供给Java程序对Microso ...

  3. “ Error:(1, 1) java: 非法字符: ‘\ufeff‘ ”错误的解决方法

    前言:今天为了做作业,在 github 上面下载了个项目,然后在运行项目时发现报错,在此记录一下 " Error:(1, 1) java: 非法字符: '\ufeff' "错误的解 ...

  4. Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法

    Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法 下载网络上的Adobe flash cs5 精简版(绿色版),Java运行时环境初始化时出现错误,你可能需要重装Flash ...

  5. 导出Excel出现“异常来自 HRESULT:0x800A03EC”错误的解决方法(已验证)

    导出Excel出现"异常来自 HRESULT:0x800A03EC"错误的解决方法(已验证) 参考文章: (1)导出Excel出现"异常来自 HRESULT:0x800A ...

  6. 我的世java途径错误_我的世界JAVA路径错误的解决方法分享

    我的世界JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?第一手游网必须 ...

  7. 我的世界手机版java安装失败_我的世界中国版JAVA路径错误的解决方法分享

    我的世界中国版JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?九游必须 ...

  8. 出现java exception has occured错误的解决方法

    出现java exception has occured错误的解决方法 解决方案1 鼠标右键点击java文件->properties->Run/Debugsetting->检查是否有 ...

  9. Excel合并数据查找函数VLOOKUP()一直显示最后一行数据或者一直报错的解决方法

    Excel合并数据查找函数VLOOKUP()一直显示最后一行数据或者一直报错的解决方法 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地 ...

  10. Excel导入数据库出现“外部表不是预期的格式”错误的解决方法

    Excel导入数据库出现"外部表不是预期的格式"错误的解决方法 参考文章: (1)Excel导入数据库出现"外部表不是预期的格式"错误的解决方法 (2)http ...

最新文章

  1. Linux redis安装教程,Linux 下redis5.0.0安装教程详解
  2. golang中的strings.Split
  3. 精简自己20%的代码
  4. 【C#语言规范】从FxCop归纳出来的一些规范建议
  5. 编译原理—词法分析器(Java)
  6. 类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针
  7. 个人计算机有控制器和运算器吗,cpu是由控制器和运算器组成的对还是错
  8. json.hpp参数错误
  9. 惠普用的是微软服务器吗,惠普抛弃MediaSmart服务器 微软表示淡定
  10. mysql抓取csv_如何将.csv数据上传、提取、存储到服务器并传输到mysql
  11. boost::asio向socket中异步读写数据
  12. v割与邮票孔_pcb板V割和邮票孔的区别
  13. nginx 错误Failed to start The nginx HTTP and reverse proxy server.
  14. 区块链开发教程系列【加精】
  15. OpenCasCade——给定B样条曲线上的一点,求出过该点的切向量或法向量
  16. 2020最新Ubutu18.04安装NVIDIA出现如下报错解决方法[亲测可用]
  17. Thales Speakers Bureau:专家云集,将探讨量子技术、5G、数字身份、网络安全和人工智能
  18. mysql存储图片node_Node.js教程 阿里云mysql如何支持存储emoji表情
  19. 计算机鼠标的发展历史,键盘和鼠标的发展史是什么?
  20. 怎么判断数字n是否为2的x次方,即2的幂次呢,比如2,4,8,16,32

热门文章

  1. 微信小程序大赛介绍文档
  2. QTcpSocket的读写操作
  3. Xsens MVN Analyze高精度惯性动作捕捉系统Link版
  4. 惊帆健康监测模块,心率检测模块
  5. 微信小程序样式padding理解
  6. Python GUI | 利用Tkinter制作签名设计软件!
  7. validate 属性
  8. C语言数据结构理解语句L = (LNode * )malloc(sizeof(LNode));
  9. minimax算法_使用Minimax算法玩策略游戏
  10. Laravel5.6 模块化公众号与小程序系统项目实战