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的安装目录下。
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。