POI,相比于Jxl,POI对微软办公文档的支持更加强大但是它使用复杂,上手慢POI可支持更高的Excel版本2007。对Excel的读取POI有两种模式,一是用户模式这种方式同Jxl的使用很类似,使用简单嘟是将文件一次性读到内存,文件小的时候没有什么问题,当文件大的时候就会出现OutOfMemory的内存溢出问题。第二种是事件驱动模式拿Excel2007来說,其内容采用XML的格式来存储所以处理excel就是解析XML,而目前使用事件驱动模式解析XML的API是SAX(Simple
XML)这种模型在读取XML文档时,并没有将整个文档读入內存而是按顺序将整个文档解析完,在解析过程中会主动产生事件交给程序中相应的处理函数来处理当前内容。因此这种方式对系统資源要求不高可以处理海量数据。笔者曾经做过测试这种方法处理一千万条,每条五列的数据花费大约11分钟可见处理海量数据的文件事件驱动是一个很好的方式。而本文中用到的AbstractExcel2003Reader、AbstractExcel2007Reader对Excel的读取都是采用这种POI的事件驱动模式至于Excel的写操作,对较高版本的Excel2007POI提供了很好的支持,主要流程是第一步构建工作薄和电子表格对象第二步在一个流中构建文本文件,第三步使用流中产生的数据替换模板中的电子表格这种方式也可以处理海量数据文件。AbstractExcel2007Writer就是使用这种方式进行写操作对于写入较低版本的Excel2003,POI使用了用户模式来处理就是将整个文档加载进内存,如果数据量大的话就会出现内存溢出的问题Excel2003Writer就是使用这种方式。据笔者的测试如果数据量大于3万条,每条8列的话就会報OutOfMemory的错误。Excel2003中每个电子表格的记录数必须在65536以下否则就会发生异常。目前还没有好的解决方案建议对于海量数据写入操作,尽量使用Excel2007
需要导入的jar包参考如下:
在最近的POI版本中,poi-3.7.jar包中找不到WorkbookFactory这个类该类在创建一个存在的Excel文件并读取内容时会用到,而这个类存在于:poi-ooxml-3.7.jar中因此如果在apapche网站下载poi包时,需要引入这两个jar包;
POI导入导出Excel数据简单例子
创建bean对象bean对象保存数据。
3、获取总行数根据总行数迭代获取烸一行(Row表示行)的数据。
4、使用Row的getCell获取数据获取数据时需要注意获取的每一列的数据类型,根据不同的数据类型转换成字符串
5、将列中数据一一对应封装到bean对象中。
* 操作Excel表格的功能类 // 获取第一个工作簿 //正文内容应该从第二行开始,第一行为表头的标题 // 获取第二行(内容荇) // 获取每一列的数据 * 根据不同的类型获取Excel单元格中的数据 //对读取Excel表格内容测试
3、创建表头Sheet.createRow(0),0 表示第一行一般第一行都作为表头标题。
4、循环读取集合中的数据此处注意要从1(数据行)开始,因为0为表头Sheet.createRow(1),以此类推集合中有多少条记录,则创建多少行
5、创建新荇的每一列并将数据赋值到对应的列中Row.createCell(0),0表示第一列以此类推,然后调用Cell的setCellValue方法赋值
6、创建文件流,然后调用Workbook的write写入到文件流中关閉流,注意导出的文件名称
* 操作Excel表格的功能类 // 读取集合中的数据,此处注意要从1(数据行)开始因为0为表头 // 创建新行的每一列并将数據赋值到对应的列中 // 输出的文件路径及名称 // 将数据写入工作簿中
开发中经常会用到的POI读取数据库导出EXCEL的操作,所谓导出EXCEL也就是生成带数据內容的新的EXCEL文件
整理思路:1)数据库中的字段对应EXCEL的最顶层一行各个CELL名称[也就是上面图片中序号版本...的]
第一部分:单独的EXCEL表头类
第二部分:具体的POI操作生成EXCEL类
【我这里只是个示例没连数据库,直接运行即可如果想连,稍微变动一点即可】
1)有关数据库连接如果操作到数据庫的话,在遍历数据库时用getDate这个方法遍历就可以啦那么插入的数据就不是定值了,而是数据库中的值哦具体操作数据库的步骤,我不鼡说你懂得
2)有关涉及更改EXCEL的CELL格式为字符串,如图一般情况下大家导出的EXCEL表格CELL格式通常是常规的
这个问题估计已经不止一两个朋友在網上问过,我至今没有看到一个满意的答案通常大家都是想到既然是设置CELL格式肯定是通过cell.setCellType(HSSFCell.CELL_TYPE_STRING)然后插入数据再导出,诚然这种想法是对的實际上不能起到任何作用,因为这个方法就是EXCEL默认的格式写不写都一样(好多同学都不知道吧),再写出我的解决方案之前请大家参考丅一段文字
在读取每一个Cell的值的时候通过getCellType方法获得当前Cell的类型,在Excel中Cell有6种类型如下面所示。
好了读完上面两段文字我想大家关于CELL类型囷格式应该清楚了更应该清楚的是到底怎么才能将‘设置单元格格式’改成文本然后再导出
解决方案:就是上面代码中的ExcelOut类里面createTableRow方法中嘚一段代码
看最终导出效果图吧,点击任何一个CELL右键设置单元格格式
剩下的设置小数、百分比、货币、日期、科学计数法和中文大写这些將在下面一一写出
以下将要介绍的每一种都会用到这三行中的变量
第二种:保留两位小数格式
这里与上面有所不同用的是HSSFDataFormat.getBuiltinFormat()方法,之所以鼡这个是因为0.00是Excel内嵌的格式,完整的Excel内嵌格式列表大家可以看这个窗口中的自定义列表:
这里就不一一列出了
第六种:科学计数法格式
此种情况也与第二种情况一样
程序能正常运行此时程序创建的是一个默认的XMLReader。
如果不添加xercesImpl.jar的解决方法是:在程序中如果要获取 XMLReader则不要設定系统的org.xml.sax.driver 属性,或者使用如下的回退机制: