Java POI操作Excel(Event User Model)

该文章为本系列的第三篇
第一篇为 : Java POI操作Excel(User Model)
第二篇为 : Java POI操作Excel(Event Model)
第四篇为 : 使用POI封装一个轻量级Excel解析框架

前言

原计划是写完User Model和Event Model写封装一个通用的Excel解析框架.但是这周在浏览官网查资料的时候,在FAQ里看到了Xlsx To CSV的代码.发现POI竟然还有一种解析方式叫User Event Model.

User Model & Event Model

在前面的两篇文章中,我们介绍了上述的两种解析方式.在抽象层级上面,User Model的抽象层级更好,提供了更多的API,我们不仅可以获取Cell的值,还能获取格式,获取格式化后的Cell的值.

这里需要说明一下,我们从Cell里取的值,并不一定就是我们在Excel中写入的值.如果你细心看过前面的文章你就会发现,单元格里写的19.从Cell里get出来可能是19.0。这是因为在Excel的存储中,数据和格式是分开存储的.如果你不使用这个单元格中使用的格式(DataFormatter)来解析单元格里的值,就会出现这种问题.

在User Model中由于抽象层级高,我们可以很轻易的把Cell里的值格式化成我们录入单元格的值.但是在Event Model中,就会遇到很多困难.

首先我们需要去学习Excel存储数据的各个Xml中每个标签,标签中的属性的含义,然后对解析代码进行设计,解析.有很大的学习成本.但是Event Model确实在节约内存,解析效率方面要优于User Model。

Event User Model

Event User Model = User Model + Event Model

Event User Model 解决了上述中User Model吃内存,效率相对低,而Event Model抽象程度低的问题.从整体上来看,User Event Model是采用流式解析,但是不同于Event Model,POI基于Event Model为我们封装了一层.我们不再面对Element的事件编程,而是面向StartRow,EndRow,Cell等事件编程.而提供的数据,也不再像之前是原始数据,而是全部格式化好,方便开发者开箱即用.大大简化了我们的开发效率.

xls解析

先看一个xls的Excel文件

xls.png

关于Excel的设计有几个点

  1. 基本涵盖了业务场景下的数据类型,整数,字符串,小数,日期.
  2. 观察解析代码是否会解析出空格子
  3. 列数不等长,观察解析是否会把不够长的列,拉到和最长列一样长.

解析代码

关于代码,我们直接使用POI官网svn上的demo,对文件路径做少量修改即可.

XLS2CSVmra.java

解析结果

工作表1 [1]:
"姓名","性别","年龄","出生日期",,"防守打法"
"小明","男",19,3/12/94,,20.2,"fadsfa"

结果分析

  1. 所有的数据解析正常,唯一的问题就是日期的格式可能不符合我们具体的业务场景,需要后续修改
  2. 在行数据没有结束之前的空格子会被解析
  3. 每一行只会解析到最后一个有数据的单元格.在业务场景中,我们可以在解析的时候将Excel列总数传入,对行数据的尾部进行空串的补全.或者在解析成对象的代码中进行补偿.

xlsx解析

我们使用和上述的Excel相同的数据,对于解析数据的观察点也和xls的相同

解析代码

依旧使用官网提供的demo

XLSX2CSV.java

解析结果

工作表1 [index=0]:
"姓名 xing'ming","性别 xing'bie","年龄 nian'ling","出生日期 chu'sheng ri'qi",,"防守打法 f's'd'f"
"小明 xiao'ming","男 nan",19,"3/12/94",,20.2,"fadsfa"

看到结果的你一定是懵逼的,这解析出来怎么还有拼音,甚至读不懂的字母在里面.这是Excel在存的数据中,就已经存下了这些数据(可以将xlsx的Excel压缩,在压缩包里会看到Excel存储数据的全貌),所以POI将这些数据都展示了出来.

这些数据我们仔细观察就会发现全都来自Excel的SSTable.如果你不了解什么是SSTable可以翻看前面的文章或者google.但是我们在使用User Model的时候明明不会有这些拼音数据,所以我们分析出,这部分内容应该是可选的.于是去上面的代码中找关于SSTable的代码.找到了这一行

我们点进去,发现构造函数里有第二个参数是includePhoneticRuns.在Excel真是的存储节点中,这部分拼音数据,就是在<iPh>节点下.所以我们推断把这个字段的值设置为false.即可忽略这部分的值.于是,我们修改代码,重新运行.

运行结果

工作表1 [index=0]:
"姓名","性别","年龄","出生日期",,"防守打法"
"小明","男",19,"3/12/94",,20.2,"fadsfa"

这下,我们不想要的数据已经都消失了.

这套代码的解析结果和上面的xls的解析结果是一模一样的.所以就不再次分析了.

总结

可以说发现Event User Model是一次意外,因为在网上搜索poi process excel,找到的基本都是User Model的方式,如果你搜索big Excel process.就会搜索到Event Model.更蛋疼的是,在官网的解析比较图中,也没有介绍有这种方式.

不过最终结果是好的.我们在解析Excel的路上终于有了一把更趁手的武器.节约内存,效率相对高,API对开发者友好.接下来,我们就可以基于User Model和Event User Model来实现一个通用的Excel解析框架了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容