专业的编程技术博客社区

网站首页 > 博客文章 正文

使用POI读写Excel文件(poi读取excel的方式)

baijin 2024-10-11 10:41:30 博客文章 11 ℃ 0 评论

Excel文件的读写操作在实际开发中是比较常见的需求。Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能,我们经常用它来读写EXCEL文件,除此之外,还有JXL,不过就易用性和更新维护角度看,POI更好一些,今天我们就来讲解如何使用POI来操作EXCEL文件。


截至目前,POI的最新版本已经到了3.15,本篇案例是基于3.9(实际应该称之为3.09)的基础上开发的,我大题看了两个版本的区别,就EXCEL操作方面差异不大,只不过在3.9里几个还能使用的方法在3.15里已经过时了,另外取消了几个常用的类,例如:WorkbookFactory这个类,我觉得非常好用,使用它创建excel实例不需要考虑excel是哪个版本的问题,它是通用的,既可以适用于excel2003,也能适用于2007及以上。所以

讲解之前,我们需要思考一些基本问题,在实际开发中,我们经常用excel存储数据库中的数据,我们都知道数据库的字段是有数据类型的,在excel中也同样存在,例如下图:

如果我们对excel中的单元格不做操作,默认的数据格式是常规,也就是我们经常说的字符串,如果我们设置该字段为会计专用或者其他类型,会影响到数据的展示方式,也会影响到poi读取单元格的读取方式,通常而已,我们习惯性的使用常规格式,这样读取的方式比较统一,即使用getStringCellValue即可,但有些公司可能就在细节上比较在意,例如百分比的展示方式,百分之18,我们可以使用0.18代替,但有些公司希望展示为“18%”这种的格式,此时我们就不得不去面对如何设置以及读取此类单元格的问题了。

针对这种问题,我们需要有一个标准即我们不可能完成支持所有格式,我们只能支持某一些,或者常见的数据格式例如:日期,数值,百分之,常规等。其他的格式系统是不认识的也是不支持的。因为这种单元格格式特别多,想针对每一种情况都动态的选择读取方式比较难以维护。例如在案例中,我们仅仅支持以下格式,用枚举定义:

系统中仅对这5种数据类型,其他的不支持。另外系统在写入excel中数据的同时,客户端需要通过其他方式告诉系统每一个数据的格式,否则都按照常规格式写入。下面我们来学一下在POI中关于excel的一些基础知识。

在POI的定义里,它将excel文件定义为一个workbook对象,通过这个对象我们可以获取excel的相关信息:

我们得到workbook,下一步一般都是操作sheet对象,我们可以通过api获取我们的目标sheet,得到sheet后,我们即开始读取或设置每一行每一列的数据了,所以在poi中还有Row和Cell的概念,row即代表行,cell即列,每一行每一列的交集就是这个单元格了。单元格有类型与样式两个常见的概念,类型是指当前单元格的数据类型,而样式是指当前单元格的展示形式,两者不要混淆。我们分别可以通过cell.getCellType方法与cell.getCellStyle方法获取类型与样式的相关信息。

1、读取EXCEL文件内容

了解了这些基础知识后,我们开始看案例,如何读取和写入excel,下面我们要完成以下功能,读取excel中内容:

(1)创建工程,引入相关jar包

(2)得到EXCEL实例,即workbook对象

代码中我们直接使用WorkbookFactory.create(fis)获得了excel的实例,好处就是我们不需要考虑当前excel的版本。

(3)根据索引获取第一个我们要操作Sheet对象

(4)获取该Sheet一共有多少行,遍历每一个行

(5)如果这一行不为空,则获取这一行所有的列,遍历每一列

其中,我们根据单元格的cellType调用的getCellValue这个方法,内容如下:

执行代码,观察输出:



2、写入EXCEL文件内容

这样,我们就完成了内容的读取,下面我们再看来下如何写入内容,首先我们需要构造这一行数据,为了让代码简单些,我们只写入一行代码且放置在list<Map>中,其中list的对象代表这一行,而map的每一个key代表每一列,并且指定了该字段的类型。

和读取差不多,我们依然要依次获取workbook,sheet,row和cell,区别在于我们由读变为写,所以我们要执行不同的操作

(1)获取Row和Cell,如果不存在要创建

(2)执行setCellValue方法,根据格式设置数据和样式

这里要注意每一种数据格式的写入的格式不同,另外我们最后要设置这个单元格的样式style如下图:

这样反复循环遍历每一行就可以获取所有的数据了,最后我们将该excel文件保存到指定目录,不要忘记关闭流:

最后我们看下效果图:

小结:本篇我们讲解了如何使用POI这个技术完成excel文件的读取和写入,如果不考虑复杂的数据类型等问题时,其他我们要操作的api是非常少的,当遇到需要处理多种数据格式的时候要针对不同的单元格式设置不同的样式。POI也有一些问题,例如在读取excel的时候会占用大量的内存,如果服务器内存不足会出现堆内存溢出等问题需要注意。目前POI为了解决该问题,开发了占用内存少可以读取大数据量的SXSSFWorkbook,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。有感兴趣的朋友可以再多百度下。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表