解析Excel文件
面向财务类需求开发的软件,能够导入导出Excel文件是非常重要的功能。
业界有一个很有名的说法
最好的BI软件就是Excel
业务人员,尤其是财务人员,接触到的数据的主要形式就是Excel文件,他们擅长(也可能只擅长)用表格来处理问题。
像是金蝶,用友这些提供财务软件服务的乙方公司,基本都在使用Java,这个语言虽然在程序员界被认为是古老又笨重的语言, 但是从银行这类大客户的角度审视它,反而会被当成优势。
借助非常丰富的生态,Java处理doc
、xls
的这类办公用软件格式的文件是手到擒来,其中最流行的工具是Apache的POI,阿里的EasyExcel因为简单易用的API也非常受欢迎。
像是财务报表查询后导出,或者把当前查询的结果(往往是一个分页表格)导出,虽然确实可以引入第三方依赖实现这些需求, 但是由于这些需求确实很直接简单,开发者往往对这些功能掉以轻心, 错误的使用方式往往使得简单的导入导出功能引发了很多生产问题,尤其是内存溢出的问题最为严重。
一个简单的例子,小王的报销单报表有1000万行数据,由于慢SQL的原因,用户点击导出按钮后要等待大约3-5分钟才会有响应下载。 但是着急的用户不会等待这么久,他会刷新页面,再次点击这个按钮。 如果用户锲而不舍地进行这个操作,后台将会有很多线程在缓慢运行,同时这些线程持有的资源——像是内存,CPU的计算资源,还有数据库的连接, 都会在用户的一次次点击中耗尽。
或者是导入功能,在开发这个功能的时候,没什么经验的开发者一般会一次性的将所有的内容都写入内存,如果这个xls文件足够大, 那服务器的内存可能会成为瓶颈。
很多开发者会信奉这样一种观点, 性能问题应该是开发阶段最后才需要考虑的问题。 甚至有些极端的观点认为,在工程协作方面,这根本不是普通开发应该考虑的问题,这应该是技术经理的工作范围。
这点我也是认同的,但是一个功能会把整个进程搞挂掉,开发这个功能的开发者很难把锅甩掉。 一个认真负责的程序员是会对自己的代码负责的,即使是他在使用其他开发者的lib。
Excel使用的文件格式一般为xls和xlsx xls后缀的是2003版Excel使用的标准格式,可以参考
xlsx是微软在2007版推出的文件格式后缀,此类文件的标准协议可以参考
https://ecma-international.org/publications-and-standards/standards/ecma-376/