POI2与POI3差异及解决excel2003和excel2007兼容性研究报告_V1.1资料
- 格式:doc
- 大小:112.00 KB
- 文档页数:9
java poi excel 读写2007摘要:1.Java POI 简介2.Java POI Excel 2007 读写库3.使用Java POI 读取Excel 文件4.使用Java POI 写入Excel 文件5.总结正文:Java POI 是一个用于操作Microsoft Office 文档的Java 库,它支持读取和写入Excel、Word 和PowerPoint 等文件格式。
其中,Java POI Excel 2007 读写库是针对Excel 2007 文件格式的处理工具。
本文将详细介绍如何使用Java POI 读取和写入Excel 2007 文件。
1.Java POI 简介Java POI 是一个开源的Java 库,它允许Java 程序员操作Microsoft Office 文档,如Excel、Word 和PowerPoint 等。
Java POI 通过提供API 接口,让Java 程序员能够像操作本地文件一样,方便地读取和写入Office 文档。
Java POI 支持多种Office 版本,包括Excel 2007。
2.Java POI Excel 2007 读写库要使用Java POI 读取和写入Excel 2007 文件,首先需要导入相关的库。
对于Maven 项目,可以在pom.xml 文件中添加以下依赖:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.0.0</version></dependency>```3.使用Java POI 读取Excel 文件使用Java POI 读取Excel 文件主要涉及到以下几个步骤:(1) 创建一个XSSFWorkbook 对象,用于存储Excel 文件的数据。
Excel2007工作簿与早期版本的兼容性
1.在Excel 2007 中,工作表大小为16,384 列、1,048,576 行,但是早期版本Excel 的工作表大小只有256 列、65,536 行。
在早期版本Excel 中,超出此列和行限制的单元格中的数据将会丢失。
2. 在Excel 2007 中,可以创建自定义国际日历格式(例如希伯来农历、日本农历、中国农历、萨卡、中国天干地支、朝鲜天干地支、六曜阴历和朝鲜农历)。
但是,这些日历格式在早期版本的Excel 中不受支持。
3. 在Excel 2007 中,可以应用非西方日历类型,例如泰国佛历或阿拉伯回历。
在早期版本的Excel 中,只能使用公历编辑这些日历类型。
4. 在Excel 2007 中,可用单元格块(CLB) 的总数受可用内存的限制。
但是,在早期版本的Excel 中,一个Excel 实例中的可用CLB 总数限制为64,000 个CLB。
一个CLB 包含16 个工作表行。
如果工作表中的所有行都包含数据,在该工作表中则有4096 个CLB,在一个Excel 实例中只能有16 个这样的工作表(无论在Excel 中打开了多少工作簿)。
若要确保工作簿不超过64,000 个CLB 的限制并可以在早期版本的Excel 中打开,则应当在将工作簿保存为Excel 97-2003 文件格式后在Excel 2007 中的兼容性模式下工作。
在兼容性模式下,Excel 会跟踪活动工作簿中的CLB 数。
office2003-2007
Office 2003和2007都是微软公司推出的办公软件系列,具有以下几个特点:
1. Office 2003:于2003年发布,包括Word、Excel、PowerPoint、Access、Outlook等应用程序。
它的界面采用经典菜单和工具栏设计,不同模块之间切换比较麻烦,但操作相对简洁明了。
此外,Office 2003文件格式为.doc、.xls、.ppt等传统格式。
2. Office 2007:于2007年发布,同样包括Word、Excel、PowerPoint、Access、Outlook等应用程序。
它的界面设计采用了“功能区”(Ribbon)设计,便于用户快速找到所需选项,整体风格更加现代化。
此外,Office 2007文件格式为.docx、.xlsx、.pptx等新式格式,相比之前的版本文件大小更小、易于管理、兼容性更好。
Office 2003和2007都是优秀的办公软件,前者适合习惯传统操作方式和文件格式的用户,后者则更适合追求高效率的用户。
无论哪个版本,都可以满足各种文档处理、表格计算、演示制作等办公需求,并提供了丰富的功能和工具帮助用户完成任务。
office2003和office2007之间的区别office2003和office2007之间的区别文章作者:佚名文章来源:本站整理发布时间:2012-09-30 11:32:272007是全新的界面,而且更加人性化,使用起来也更加地顺手。
下面就是从网上提制粘贴的东西了:新增功能:1.WordMicrosoft Office Word 2007 提供完整的一套工具,供您在新的界面中创建文档并设置格式,从而帮助您制作具有专业水准的文档。
丰富的审阅、批注和比较功能有助于快速收集和管理来自同事的反馈信息。
高级的数据集成可确保文档与重要的业务信息源时刻相连。
中文版还新增了博客文档和毛笔字帖。
2.Excel在新的面向结果的用户界面中, Excel 2007 提供了强大的工具和功能,用户可以使用这些工具和功能轻松地分析、共享和管理数据。
Excel 2007的新增功能主要有:面向结果的用户界面、更多行和列以及其他新限制、Office 主题和 Excel 样式、丰富的条件格式、轻松编写公式、新的 OLAP 公式和多维数据集函数、Excel 表格的增强功能、共享的图表、易于使用的数据透视表、快速连接到外部数据、新的文件格式、更佳的打印体验、共享工作的新方法、快速访问更多模板。
3.PowerPoint为了帮您制作具有专业外观的演示文稿, PowerPoint 2007 提供一组综合功能,用户可以使用它们创建信息并为其设置格式。
PowerPoint 2007主要新增了创建并播放动态演示文稿、有效地共享信息、保护并管理信息等功能。
4.OutlookOutlook 2007 提供全面的时间和信息管理功能。
利用“即时搜索”和“待办事项栏”等新功能,可组织和随时查找所需信息。
通过新增的日历共享功能、Microsoft Exchange 2007 技术以及经过改进的Microsoft Windows SharePoint Services 3.0 信息访问功能,用户能够与同事、朋友和家人安全地共享存储在Outlook 2007 中的数据。
POI导出Excel的三种workbook的区别
三种workbook分别是HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook
第⼀种:HSSFWorkbook
针对EXCEL 2003版本,扩展名为.xls,此种的局限就是导出的⾏数最多为65535⾏。
因为导出⾏数受限,不⾜7万⾏,所以⼀般不会发送内存溢出(OOM)的情况
第⼆种:XSSFWorkbook
这种形式的出现是由于第⼀种HSSF的局限性产⽣的,因为其导出⾏数较少,XSSFWorkbook应运⽽⽣,其对应的是EXCEL2007+ ,扩展名为.xlsx ,最多可以导出104万⾏,不过这样就伴随着⼀个问题–OOM内存溢出。
因为使⽤XSSFWorkbook创建的book sheet row cell 等是存在内存中的,并没有持久化到磁盘上,那么随着数据量的增⼤,内存的需求量也就增⼤。
那么很有可能出现 OOM了,那么怎么解决呢?
第三种:SXSSFWorkbook poi.jar 3.8+
SXSSFWorkbook可以根据⾏数将内存中的数据持久化写到⽂件中。
此种的情况就是设置最⼤内存条数,⽐如设置最⼤内存量为5000⾏, new SXSSFWookbook(5000),当⾏数达到 5000 时,把内存持久化写到⽂件中,以此逐步写⼊,避免OOM。
这样就完美解决了⼤数据下导出的问题。
POI和EasyExcel的使⽤1.POI使⽤1.1 什么是POIPOI简介(Apache POI),Apache POI是Apache软件基⾦会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
HSSF -提供读写Microsoft Excel格式档案的功能。
(.xls)XSSF -提供读写Microsoft Excel OOXML格式档案的功能。
(.xlsx)HWPF -提供读写Microsoft Word格式档案的功能。
HSLF -提供读写Microsoft PowerPoint格式档案的功能。
HDGF -提供读写Microsoft Visio格式档案的功能。
1.2 官⽹官⽹可以找到⽂档和每个版本的下载地址2.xls写-03和072.1、创建项⽬1、创建⼀个普通的maven项⽬项⽬名:excel_poi2、pom中引⼊xml相关依赖<dependencies><!--xls(03)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><!--xlsx(07)--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><!--⽇期格式化⼯具--><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.1</version></dependency><!--test--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>2.2、xls写-03和07的区别区别1.格式不⼀样,03是xls,07是xlsx。
实用!Office2007与2003互换体验-电脑资料钱老说,在围城里的人想出来,在围城外的人想进去,这句话用来形容OFFICE 2007却是恰好不过,。
这一全新发布的版本,改变了从OFFICE 97到2000到XP到2003一贯来的经典界面,在给人带来超炫体验的同时,却也让许多“老鸟”反而“找不到北”。
于是许多用着OFFICE 2007的用户,希望能改回2003的经典界面;而许多跑不动2007的用户,却希望能在自己的老版本上体验一把新版OFFICE的绚丽。
有什么办法呢?1.回归经典,OFFICE 2007找回经典菜单“OFFICE 2007漂亮是漂亮,但是也太难用了,连找个另存为功能都折腾了半天。
”小杨不住地抱怨。
其实并不是OFFICE 2007难用,相反新版做了许多人性化的改变,更适合上手,但是颠覆传统的操作却让“老鸟”们一时难以适应。
不过不要紧,微软之后出了一个套装,可以帮我们找回转移或者隐藏的功能,回归经典界面。
目前包括了Word/Excel/PowerPoint 2007的经典菜单和工具栏。
软件的使用很简单,安装后,只要正常打开OFFICE2007,它就会以插件的形式自动加载,而你就会发现,熟悉的菜单和工具栏已经出现在了面前。
(图1)图1TIPS:美中不足的是,这款插件并非免费。
2.披上2007的新装OFFICE2007的华丽,让我们羡慕,但是它的资源占用却让依然用老机子的用户望而却步。
虽然微软提供了插件,可以给OFFICE2007找回经典菜单和工具栏,但是却似乎不可能为老版本添加OFFICE2007的华丽外衣。
那么我们自己来吧。
首先提取资源。
我们以WORD2007为例说明,其他Excel、PowerPoint等操作类似。
用资源修改软件,比如Restorator2007打开OFFICE2007安装目录下的WINWORD.EXE文件。
找到图标项,这里包括了多组图标,我们只需提取1为WINWORD.ICO,保存在OFFICE 2003的安装目录下。
使⽤POI解析ExcelExcel作为⼀种常⽤的数据存储格式,在很多项⽬中都会有相应的导⼊导出的功能。
这篇⽂章会介绍如何使⽤Java操作Excel,以及如何解决⼤⽂件读写时内存溢出的问题。
1、OpenXML标准Word、Excel、PPT是Office办公套件中最常⽤的三个组件。
早期的Office套件使⽤⼆进制格式,这⾥⾯包括以.doc、.xls、.ppt为后缀的⽂件;直到07这个划时代的版本将基于XML的压缩格式作为默认⽂件格式,也就是相应以.docx、.xlsx、.pptx为后缀的⽂件。
这个结合了XML与Zip压缩技术的新⽂件格式使⽤的是OpenXML标准。
微软从2000年开始酝酿这项技术标准,到2006年申请成为ECMA-376,然后在Office2007中⽤作默认的⽂件格式,再到08年成为了ISO / IEC 29500国际标准,后续每两三年就会发布⼀个新版本。
Office的⼀路凯歌⽆不彰显微软雄厚的实⼒。
所以说三流公司做产品,⼆流公司做平台,⼀流公司定标准。
微软的官⽅⽂档中详细介绍了WordprocessingML(Word)、SpreadsheetML(Excel)、PresentationML(PPT)三个标准,这⾥主要介绍Excel的部分内容。
⾸先Excel⼏个最基础的概念:⼀个Excel就是⼀个⼯作簿(Workbook)⼀个Sheet就是⼀张表格⼀个Workbook可以包含多个Sheet每⼀⾏Row的每⼀列就是⼀个单元格(Cell)因为07版后的.xlsx本质上就是⼀个压缩包,我们完全可以⽤解压⼯具打开它。
⼀个基础的Excel解压之后更典型的Excel还包括:数字、⽂本、公式、图表(Chart)、普通列表(Table)、数据透视表(Pivot Table)等内容。
Excel远⽐我们想象的复杂2、使⽤POI操作ExcelJava领域最常见的两个操作Excel的⼯具库分别是和Apache的。
Apache POI组件操作Excel,制作报表〔一〕Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和PowerPoint用程序动态操作的应用较少.那么本文就结合POI来介绍一下操作Excel的方法.Office 2007的文件结构完全不同于2003,所以对于两个版本的Office组件,POI有不同的处理API,分开使用即可.首先来说几个Excel的基本概念.对于一个Excel文件,这称为一个工作簿〔Workbook〕,打开Excel之后,在下方会有sheet1/2/3这样的选项卡,点击可以切换到不同的sheet中,这个sheet称作工作表.每个工作表就是我们编辑的区域,这是一张二维表,阿拉伯数字控制行数,从1开始,而程序中还是0,类似数组和集合.字母控制列数,从A开始,Z以后是两个字母控制.对于每一行,我们称为Row,列就是Column,行列可以确定唯一的一个元素,那么就是单元格,称为Cell.POI组件可以方便的操纵这些元素,但初次接触POI可能会有畏惧心理,因为要对每个单元格进行设置,那么不管是用数组还是集合,从工作簿,工作表,行下来的代码量都不会小,这是不能避免的,但是按照这个处理顺序走,就一定可以得到结果.有了这些基础的概念之后,我们就可以操作Excel了.先来看一下所需的依赖,因为涉与到2007,就要额外加一些依赖.下面从读取Excel开始,首先建立一个Excel 2003以下版本的xls文件.设定几列来看.来存储学生信息的Excel表如下:这里的##,性别和班级是文本值,而年龄和成绩是数字值,这在设计对象和处理时要注意区分.那么可以如下设计这个对象:Java代码1.package org.ourpioneer.excel.bean;2./**3. * 学生信息4. *5. * author Nanlei6. *7. */8.publicclass Student {9.private String name;10.private String gender;11.privateint age;12.private String sclass;13.privateint score;14.public Student<> {15.super<>;16. }17.public Student<String name, String gender, int age, String sclass, int score> {18.super<>; = name;20.this.gender = gender;21.this.age = age;22.this.sclass = sclass;23.this.score = score;24. }25.//省略了getter和setter方法26.Override27.public String toString<> {28.return"Student [age=" + age + ", gender=" + gender + ", name=" + name29. + ", sclass=" + sclass + ", score=" + score + "]";30. }31.}提供一个有参数的构造方法,用于生成对象写入Excel文档.这个对象就能刻画Excel文件中的数据了,下面就是写程序将Excel文件加载并处理,然后将内容读出,读取顺序是工作簿->工作表->行->单元格.这样一分析就很简单了.我们定义两个Excel文件,内容相同,只是版本不同,分2003和2007来处理.创建工作簿时可以接收一个输入流对象,那么输入流对象可以从文件对象来生成,这样就可以继续进行了.取出工作表,取出行,遍历单元格,数据就拿到了.代码如下:Java代码1.package org.ourpioneer.excel;2.import java.io.File;3.import java.io.FileInputStream;4.import java.io.IOException;5.import java.io.InputStream;6.import java.util.ArrayList;7.import java.util.List;8.import ermodel.HSSFCell;9.import ermodel.HSSFRow;10.import ermodel.HSSFSheet;11.import ermodel.HSSFWorkbook;12.import org.ourpioneer.excel.bean.Student;13./**14. * POI读取Excel示例,分2003和200715. *16. * author Nanlei17. *18. */19.publicclass ReadExcel {20.privatestatic String xls2003 = "C:\\student.xls";21.privatestatic String xlsx2007 = "C:\\student.xlsx";22./**23. * 读取Excel2003的示例方法24. *93. List<Student> list = readFromXLS2003<xls2003>;94.for <Student student : list> {95. System.out.println<student>;96. }97.long end = System.currentTimeMillis<>;98. System.out.println<<end - start> + " ms done!">;99. }100.}做几点说明,如果不处理表头,那么就从准备处理的行开始,而整个sheet对行的索引是从0开始的,而Excel中是1,这点和数组/集合类似.对于单元格中的数字,默认按double类型处理,所以只能字符串转double,再取出int值.最后执行主函数,得到如下内容:这样就拿到对象的List了,之后要持久到数据库或者直接做业务逻辑就随心所欲了.下面来看2007的处理,处理流程和2003是类似的,区别就是使用的对象,2003中对象是HSSF*格式的,而2007是XSSF*格式的.方法如下:Java代码1.publicstatic List<Student> readFromXLSX2007<String filePath> {2. File excelFile = null;// Excel文件对象3. InputStream is = null;// 输入流对象4. String cellStr = null;// 单元格,最终按字符串处理5. List<Student> studentList = new ArrayList<Student><>;// 返回封装数据的List6. Student student = null;// 每一个学生信息对象7.try {8. excelFile = new File<filePath>;9. is = new FileInputStream<excelFile>;// 获取文件输入流10. XSSFWorkbook workbook2007 = new XSSFWorkbook<is>;// 创建Excel2003文件对象11. XSSFSheet sheet = workbook2007.getSheetAt<0>;// 取出第一个工作表,索引是045. }46. } catch <IOException e> {47. e.printStackTrace<>;48. } finally {// 关闭文件流49.if <is != null> {50.try {51. is.close<>;52. } catch <IOException e> {53. e.printStackTrace<>;54. }55. }56. }57.return studentList;58. }再次运行主函数,我们得到如下输出:可以看出,对2007的处理时间明显增长,还是2003版本效率更好,不过在使用Office组件时2007更便捷,而处理2003的程序效率更好.如何使用二者?根据程序业务来综合决定,看看牺牲掉哪部分.下面来做简单的文件写入,也就是准备输入写入Excel文件,为了演示,直接创建对象,而实际应用中数据可以是来自数据库的.写入文件就是文件解析的逆过程.但POI的组件不是从单元格开始创建文件的,还是从工作簿开始创建,进而创建工作表,行和单元格,最终将整个工作簿写入文件,完成操作.我们来看具体写法.Java代码1.package org.ourpioneer.excel;2.import java.io.File;3.import java.io.FileOutputStream;4.import java.util.ArrayList;5.import java.util.Arrays;6.import java.util.List;这样就生成了2003版Excel文件,只是最简单的操作,并没有涉与到单元格格式等操作,而2007的方法就是改改对象的名称,很简单,这里不再贴出了..。
POI2与POI3差异及解决excel2003和excel2007兼容性研究报告1 现有问题:近期发现报表系统(使用EXCEL作报表),在不知情的用户使用了EXCEL2007版本之后,出现了一系列兼容性问题:1、用POI2.x操作EXCEL2007文件,会导致后台错误。
org.apache.poi7.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)2、涉及EXCEL导出的部分,若文件内容是EXCEL2007,却使用.XLS,为后缀名的文件。
那么使用EXCEL2003打开会导致乱码现象。
3、目前新建报表模版,无论客户端安装的是什么版本的OFFICE,后台都是用EXCEL2003(POI2)文件格式创建的。
4、目前兼容性问题影响范围包含但不限于:模板制作、报表导出、模板版本化、批量折合等所有用到EXCEL后台操作的功能。
2 问题原因:报表平台现有系统在后台处理Excel都是使用apache的POI2.x进行解析处理,但是poi2.x是和jdk1.4兼容的,且poi2.x只能处理excel2003及以前的老版本excel文件,客户机器上安装的往往是较新版的office2007,要处理excel2007就必须使用poi3.5以上的版本,poi3.5及以上的版本适用jdk1.5版及以上,并支持excel2007的处理。
3 POI2.x与POI3.x的区别:3.1什么是POIApache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能。
现在较新较稳定的POI版本是3.7,即常说的POI7,最新的POI3.8已经出了beta2版本,支持EXCEL2010的操作。
3.2如何使用POI完整的POI3.8 beta2包含如下类库:poi-3.8-beta2-20110408.jarpoi-examples-3.8-beta2-20110408.jarpoi-excelant-3.8-beta2-20110408.jarpoi-ooxml-3.8-beta2-20110408.jar (Office Open XML)poi-ooxml-schemas-3.8-beta2-20110408.jarpoi-scratchpad-3.8-beta2-20110408.jar另需要一些配套包的支持dom4j-1.6.1.jarstax-api-1.0.1.jarxmlbeans-2.3.0.jar (必须使用2.3或以上的版本)commons-logging-1.1.jarjunit-3.8.1.jarlog4j-1.2.13.jarPOI3.8的具体API及实现方法不在本文详述。
3.3POI结构及版本区别:1、首先,相对于POI2.X及以下版本,POI3.X支持较高版本的Office操作,在本文中关注的是能够对EXCEL2007进行操作,并可兼容操作EXCEL2003。
部分类图如下:(图1)如上图,POI2.x的结构只有类图中左半部分,POI3.x新增了以XSSF前缀的EXCEL 文件操作对象,用于对OOM格式的EXCEL操作。
POI3完整具体结构和作用如下:结构:HSSF -提供读写Microsoft Excel格式档案的功能。
XSSF -提供读写Microsoft Excel OOXML格式档案的功能。
HWPF -提供读写Microsoft Word格式档案的功能。
HSLF -提供读写Microsoft PowerPoint格式档案的功能。
HDGF -提供读写Microsoft Visio格式档案的功能。
2、其次,另一个重要区别就是,excel2007文件格式与之前版本不同,之前版本采用的是微软自己的存储格式。
07版内容的存储采用XML格式(OOM)。
4 现有问题解决方案:4.1解决方案要求:1、解决目前EXCEL2003和EXCEL2007兼容性问题。
2、提供后续EXCEL版本,如EXCEL2010的可扩展性。
4.2算法(实现逻辑)1、兼容性:如(图1)所示,我们可以看到,操作EXCEL2003的对象(HSSF为前缀)与操作EXCEL2007的对象(XSSF为前缀)共用一套接口,在遇到未知版本的EXCEL文件时,可以通过POI提供的方法判断文件头来获取版本信息,构造具体版本的Workbook实例。
再返回统一的接口达到兼容性要求。
创建兼容性Workbook的工厂方法代码如下:public static Workbook createCommonWorkbook(InputStream inp)throws IOException, InvalidFormatException {// 首先判断流是否支持mark和reset方法,最后两个if分支中的方法才能支持if (!inp.markSupported()) {// 还原流信息inp = new PushbackInputStream(inp, 8);}// EXCEL2003使用的是微软的文件系统if (POIFSFileSystem.hasPOIFSHeader(inp)) {return new HSSFWorkbook(inp);}// EXCEL2007使用的是OOM文件格式if (POIXMLDocument.hasOOXMLHeader(inp)) {// 可以直接传流参数,但是推荐使用OPCPackage容器打开return new XSSFWorkbook(OPCPackage.open(inp));}throw new IOException("不能解析的excel版本");}通过传入的文件流,获取到通用的Workbook接口,就可以进行一系列不同的业务操作了,实际上到这一步EXCEL2003与EXCEL2007的兼容性问题已经基本解决了,简单吧?具体实例请阅读本文最后的DEMO,此处不详述。
当然,HSSFWorkbook(EXCEL2003)会与XSSFWorkbook(EXCEL2007)有很多差异,通用接口只能满足这两者的交集部分。
如下图:(图2)若接口不能完全满足要求,可以通过判断Workbook类型,强制转换成其对应版本的对象,分别作两套或多套方法来处理。
这是为满足兼容性值得牺牲,也是必须牺牲的部分。
根据实际操作经验,接口能满足绝大部分EXCEL的基本操作,不能满足需要的情况非常少见。
具体功能差异未作深究,感兴趣的读者可自行对比API。
伪码如下:Workbook wb = createCommonWorkbook(不确定的版本的EXCEL文件流);if (wb instanceof HSSFWorkbook) {HSSFWorkbook hwb = (HSSFWorkbook)wb;EXCEL2003的处理部分} else if (wb instanceof XSSFWorkbook) {XSSFWorkbook xwb = (XSSFWorkbook)wb;EXCEL2007的处理部分} else {throw new IOException("不能解析的excel版本");}2、扩展性:我们在兼容性部分已经创建了获取兼容Workbook的工厂方法,若遇到其它版本,如EXCEL2010的需求,在工厂方法里添加一个创建EXCEL2010的Workbook条件就行了。
修改createCommonWorkbook方法,伪码如下:public static Workbook createCommonWorkbook(InputStream inp)throws IOException, InvalidFormatException {...if (输入文件的文件头为EXCEL2010格式) {return new EXCEL2010Workbook(inp);}...}throw new IOException("不能解析的excel版本");}既然版本都是固定的,那么再提供一个版本枚举类,不就可以更方便管理不同的EXCEL 版本了吗,如果将枚举的VALUE值定义为文件后缀名,也一并解决了不同版本的EXCEL文件后缀名不同的恼人问题,真是一举多得呢。
后续即使有更高的Office版本,如EXCEL2010,也只需要添加一个工厂条件,再添加一个枚举项即可实现无缝升级了。
枚举类属性如下:// KEY:版本号// VALUE:文件后缀名/**EXCEL2003版本*/EXCEL_2003(2003, ".xls"),/**EXCEL2007版本*/EXCEL_2007(2007, ".xlsx");/**后续添加扩展添加的EXCEL2010版本*/EXCEL_2010(2010, ".xlsx");再创建一个根据Workbook取得版本信息的工具方法,如下:public static ExcelVersionTypeEnum checkExcelVersion(Workbook wb) throws IOException {if (wb instanceof HSSFWorkbook) {return ExcelVersionTypeEnum.EXCEL_2003;} else if (wb instanceof XSSFWorkbook) {return ExcelVersionTypeEnum.EXCEL_2007;} else {throw new IOException("不能解析的excel版本");}}以后获取版本信息或后缀名就方便了:ExcelVersionTypeEnum ev =CompatibleExcelUtil.checkExcelVersion(wb);String suffix = ev.getValue();3、DEMO:源码如下:public class Test {public static void main(String[] args) {String path2007 = "d:\\2007.xlsx";String path2003 = "d:\\2003.xls";Test.Demo(path2003);}public static void Demo(String filePath){InputStream is = null;try {is = new BufferedInputStream(new FileInputStream((newFile(filePath))));//调用工具类,获取兼容的Workbook接口(兼容性)Workbook wb = CompatibleExcelUtil.createCommonWorkbook(is);//获取首个单元格值(具体业务处理)Sheet sheet = wb.getSheetAt(0);sheet.getRow(0);Row row = sheet.getRow(0);Cell cell = row.getCell(0);//调用工具类,返回版本枚举ExcelVersionTypeEnum ev =CompatibleExcelUtil.checkExcelVersion(wb);//控制台打印信息System.out.println("EXCEL版本号:" + ev);System.out.println("文件后缀名:" + ev.getValue() + "(即使此DEMO中文件后缀名不规范,此处也能正确识别)");System.out.println("首个单元格值:" + cell.getNumericCellValue());} catch (Exception e) {e.printStackTrace();}finally{try {is.close();} catch (IOException e) {e.printStackTrace();}}}}运行结果:在D盘创建EXCEL2003格式文件《2003.xls》首个单元格值为2003。