2022年POI读取EXCEL教程 .pdf
《2022年POI读取EXCEL教程 .pdf》由会员分享,可在线阅读,更多相关《2022年POI读取EXCEL教程 .pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、POI 读取 EXCEL教程一、Excel 基础二、HSSF 概况三、通过 usermodel 读取文件四、通过 usermodel 写入文件五、通过 eventusermodel 读取文件六、HSSF 电子表格结构七、通过 HPSF 读取文档属性八、文档摘要信息九、附录 正文:在上一篇文章中,我们介绍了 POI项目的基本概念,了解了如何用 POI来读写 OLE 2 复合文档结构,并给出了两个简单的例子:用POI来读写 Excel 文件的Workbook流。本文继续前文的话题,阐述如何用POI来读取/写入完整的 Excel文件。约定:POI项目 2.0 版现在已经接近正式发行阶段,开发进度迅速
2、,不断有新的功能集成到原有的系统,同时也有对原有系统的修改。为了保证本文的及时性,本文将按照最近的 1.9 开发版说明。虽然编译最近的发行版源代码也能正常运行,但现在的代码和2.0 的发行版会有一些出入。一、Excel 基础Microsoft Excel 97 文件格式也被称为BIFF8,最近版本的 Excel 只对该格式作了少量的改动。增加对新格式的支持除了增加项目的复杂性之外,唯一的效果也许只是不得不使每个用户升级代码,没有什么实际的好处。因此,在下文说明中,凡是提到 Excel 97 格式的地方其实都是指Excel 从 97 到 XP的格式。二、HSSF 概况名师资料总结-精品资料欢迎下
3、载-名师精心整理-第 1 页,共 15 页 -POI项目实现的 Excel 97 文件格式称为 HSSF 也许你已经猜到,HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”(微软使某些原本简单的事情过分复杂,同时又过分简单地处理了某些原本需要灵活性的事情,让人不胜佩服!)也许HSSF 的名字有点滑稽,就本质而言它是一个非常严肃、正规的 API。通过 HSSF,你可以用纯 Java 代码来读取、写入、修改 Excel文件。前面一篇文章提到了POIFS,那么 HSSF 和 POIFS又有什么关系呢?就象其他 POI的 API 一样,HSSF 建立在
4、 POIFS的基础上,因此在 HSSF 内的有些代码和前文的某些代码很相似。不过,当我们编写基于HSSF API的代码时,一般不需要了解 POIFS API 的细节。HSSF 为读取操作提供了两类API:usermodel 和 eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。usermodel 主要有 org.apache.poi.hssf.usermodel和org.apache.poi.hssf.eventusermodel包实现(在 HSSF 的早期版本中,org.apache.poi.hssf.eventusermode
5、l属于 eventmodel 包)。usermodel 包把 Excel 文件映射成我们熟悉的结构,诸如 Workbook、Sheet、Row、Cell 等,它把整个结构以一组对象的形式保存在内存之中。eventusermodel要求用户熟悉文件格式的底层结构,它的操作风格类似于XML的 SAX API 和 AWT的事件模型(这就是eventusermodel 名称的起源),要掌握窍门才能用好。另外,eventusermodel 的 API 只提供读取文件的功能,也就是说不能用这个API来修改文件。三、通过 usermodel 读取文件用 HSSF 的 usermodel 读取文件很简单。首先
6、创建一个InputStream,然后创建一个 HSSFWorkbook:InputStream myxls=new FileInputStream(workbook.xls);HSSFWorkbook wb =new HSSFWorkbook(myxls);有了 HSSFWorkbook 实例,接下来就可以提取工作表、工作表的行和列,例如:HSSFSheet sheet=wb.getSheetAt(0);/第一个工作表HSSFRow row =sheet.getRow(2);/第三行HSSFCell cell =row.getCell(short)3);/第四个单元格名师资料总结-精品资料欢迎
7、下载-名师精心整理-第 2 页,共 15 页 -上面这段代码提取出第一个工作表第三行第四单元格。利用单元格对象可以获得它的值,提取单元格的值时请注意它的类型:if(cell.getCellType()=HSSFCell.CELL_TYPE_STRING)(单元格是字符串,值是:+cell.getStringCellValue();else if(cell.getCellType()=HSSFCell.CELL_TYPE_NUMERIC)(单元格是数字,值是:+cell.getCellValue();else()(单元格的值不是字符串或数值。);如果搞错了数据类型,程序将遇到异常。特别地,用HS
8、SF 处理日期数据要小心。Excel 内部以数值的形式保存日期数据,区别日期数据的唯一办法是通过单元格的格式(如果你曾经在Excel 中设置过日期格式,应该明白这是什么意思)。因此,对于包含日期数据的单元格,cell.getCellType()将返回HSSFCell.CELL_TYPE_NUMERIC,不过利用工具函数HSSFDateUtil.isCellDateFormatted(cell)可以判断出单元格的值是否为日期。isCellDateFormatted函数通过比较单元格的日期和Excel 的内置日期格式得出结论可以想象,按照这种判断方法,很多时候 isCellDateFormatte
9、d函数会返回否定的结论,存在一定的误判可能。本文附录包含了一个在Servlet环境中利用 HSSF 创建和返回 Excel 工作簿的实例。四、通过 usermodel 写入文件写入 XLS文件比读取 XLS文件还要简单。创建一个HSSFWorkbook 实例,然后在适当的时候创建一个把文件写入磁盘的OutputStream,但延迟到处理结束时创建 OutputStream 也可以:HSSFWorkbook wb=new HSSFWorkbook();FileOutputStream fileOut =new FileOutputStream(workbook.xls);wb.write(fil
10、eOut);fileOut.close();创建工作表及其内容必须从相应的父对象出发,例如:名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 15 页 -HSSFSheet sheet=wb.createSheet();HSSFRow row =sheet.createRow(short)0);HSSFCell cell =row.createCell(short)0);cell.setCellValue(1);row.createCell(short)1).setCellValue(1.2);row.createCell(short)2).setCellValue(一个字符串);
11、row.createCell(short)3).setCellValue(true);如果要设置单元格的样式,首先要创建一个样式对象,然后把它指定给一个单元格或者把它指定给多个具有相同样式的单元格,例如,如果 Excel 表格中有一个摘要行,摘要行的数据必须是粗体、斜体,你可以创建一个summaryRowStyle样式对象,然后把这个样式指定给所有摘要行上的单元格。注意,CellFormat 和 CellStyle对象是工作簿对象的成员,单元格对象只是引用它们。.HSSFCellStyle style=workbook.createCellStyle();style.setDataFormat
12、(HSSFDataFormat.getBuiltinFormat($#,#0_);Red($#,#0);style.setFillBackgroundColor(HSSFColor.AQUA.index);style.setFillPattern(HSSFCellStyle.BIG_SPOTS);.someCell.setCellStyle(style);someOtherCell.setCellStyle(style);版本较新的 HSSF 允许使用数量有限的Excel 公式。这一功能目前还是“Beta级质量”,正式使用之前务必仔细测试。指定公式的方式类如:someCell.setCellF
13、ormula(SUM(A1:A2:);。当前,公式中已经可以调用所有内建的函数或操作符,但逻辑操作符和函数(例如 IF 函数)除外,这部分功能目前还在开发之中。五、通过 eventusermodel 读取文件通过 eventusermodel 读取文件要比使用usermodel 复杂得多,但效率也要高不少,因为它要求应用程序一边读取数据,一边处理数据。eventusermodel实际上模拟了 DOM 环境下 SAX处理 XML文档的办法,应用程序首先要注册期望处理的数据,eventusermodel 将在遇到匹配的数据结构时回调应用程序注册的方名师资料总结-精品资料欢迎下载-名师精心整理-第
14、4 页,共 15 页 -法。使用 eventusermodel 最大的困难在于你必须熟悉Excel 工作簿的内部结构。在 HSSF 中,低层次的二进制结构称为记录(Record)。记录有不同的类型,每一种类型由 org.apache.poi.hssf.record包中的一个 Java 类描述。例如,BOFRecord记录表示 Workbook或 Sheet 区域的开始,RowRecord表示有一个行存在并保存其样式信息。所有具有CellValueRecordInterface接口的记录表示Excel 的单元格,包括 NumericRecord、LabelSSTRecord和 FormulaRe
15、cord(还有其他一些,其中部分已被弃置不用,部分用于优化处理,但一般而言,HSSF可以转换它们)。下面是一个注册事件处理句柄的例子:private EventRecordFactory factory=new EventRecordFactory();factory.registerListener(new ERFListener()public boolean processRecord(Record rec)(got BOF Record);return true;,new short BOFRecord.sid);factory.processRecords(someInputStre
16、am);六、HSSF 电子表格结构如前所述,HSSF 建立在 POIFS的基础上。具体地说,Excel 97+文件是 OLE 2复合文档(OLE 2 Compound Document),底层的 OLE 2复合文档保存了一个总是命名为 Workbook(Excel 95 除外,HSSF 不支持 Excel 95)的流。然而,宏和图片并不保存在 Workbook流,它们有自己独立的流,有时甚至会放到OLE 2 CDF文件之内的另一个目录。理想情况下,宏也应该被保留,不过目前 POI项目中还没有合适的 API 来处理宏。每一个流之内是一组记录,一个记录其实就是一个字节数组,可分为记录头、记录体两部
17、分。记录头指明了记录的类型(也即ID)以及后继数据的长度,记录体被分割成多个字段(Field),字段包含数值数据(包括对其他记录的引用)、字符数据或标记。下图概要说明了 Excel 工作簿的顶级结构:Bla.xls OLE2CDF headers Workbook stream Workbook Static String Table Record.名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 15 页 -Sheet names,and pointers Sheet ROW ROW,NUMBER RECORD(cell)LABELSST Record(cell),Sheet ,
18、images,macros,etc.Document Summary Summary 七、通过 HPSF 读取文档属性在 Microsoft Word、Excel、PowerPoint 等软件中,用户可以通过“文件”“属性”菜单给文档添加附加信息,包括文档的标题、主题、摘要、类别、关键词等,同时应用软件本身还会加入最后访问的用户、最后访问和修改/打印的日期时间等信息。文档的属性和正文是分开保存的。如前所述,OLE 2 CDF 文件内部就象是一个容器,里面包含许多类似目录和文件的结构,而 POIFS就是用来访问其中的文件的工具。这些文件也称为流,文档的属性就保存在POIFS文件系统中专用的流里面
19、。以一个 Word文档为例:虽然在资源管理器中你只看到一个叫做MyFile.doc的文档,其实在这个文档的内部,又包含了一个WordDocument、一个SummaryInformation 和一个 DocumentSummaryInformation 文档;通常还会有其他的文档,这里暂且不管。你能够猜出这些文档(流)分别包含什么内容吗?不错,WordDocument 包含了你在 Word里面编辑的文本,文档的属性保存在SummaryInformation 和DocumentSummaryInformation 流里面。也许将所有属性保存在单个文档里面看起来太简单了,所以 Microsoft决
20、心要使用两个流,为了使事情更复杂一点,这两个流的名字前面还加上了八进制的005 字符这是一个不可打印的字符,因此前面就把它省略了。Microsoft定义的标准属性有一个好处,它们并不在乎主文档到底是什么类型不管是 Word文档、Excel 工作簿还是 PowerPoint 幻灯。只要你知道如何读取 Excel 文档的属性,就知道了如何读取其他文档的属性。名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 15 页 -读取文档属性其实并不复杂,因为Java 程序可以利用 POI项目的 HPSF 包。HPSF 是 Horrible Property Set Format 的缩写,译成中文
21、就是“讨厌的属性集格式”。HPSF 包是 POI项目实现的读取属性工具,目前还不支持属性写入。对于读取 Microsoft定义的标准属性,通过HPSF 提供的 API 可以很方便地办到;但如果要读取任意属性集就要用到更一般化的API,可以想象它要比读取标准属性的 API 复杂不少。本文只介绍读取标准属性的简单API,因为对大多数应用程序来说这已经完全足够了。下面就是一个读取OLE 2 CDF文档的标题(title)属性的 Java 程序:import java.io.*;import org.apache.poi.hpsf.*;import org.apache.poi.poifs.event
22、filesystem.*;/*读取 OLE 2文档标题的示例程序,*在命令行参数中指定文档的文件名字。*/public class ReadTitle public static void main(String args)throws IOException final String filename=args0;POIFSReader r =new POIFSReader();r.registerListener(new MyPOIFSReaderListener(),005SummaryInformation);r.read(new FileInputStream(filename);s
23、tatic class MyPOIFSReaderListener implements POIFSReaderListener public void processPOIFSReaderEvent(POIFSReaderEvent event)SummaryInformation si=null;try si=(SummaryInformation)PropertySetFactory.create(event.getStream();catch(Exception ex)名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 15 页 -throw new RuntimeExcep
24、tion (属性集流 +event.getPath()+event.getName()+:+ex);final String title=si.getTitle();if(title!=null)System.out.println(标题:+title+);else System.out.println(该文档没有标题.);main()方法利用 POIFS的事件系统从命令行指定的OLE 2文档读取名为005SummaryInformation的流,当 POIFSReader 遇到这个流时,它把控制传递给 MyPOIFSReaderListener 的 processPOIFSReaderEve
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年POI读取EXCEL教程 2022 POI 读取 EXCEL 教程
限制150内