POI.docx
《POI.docx》由会员分享,可在线阅读,更多相关《POI.docx(20页珍藏版)》请在冰豆网上搜索。
![POI.docx](https://file1.bdocx.com/fileroot1/2022-10/29/22d8a248-e7be-4b59-9de4-263a1a8c7096/22d8a248-e7be-4b59-9de4-263a1a8c70961.gif)
POI
7.3 使用POI来处理Excel和Word文件格式
Microsoft的Office系列产品拥有大量的用户,Word、Excel也成为办公文件的首选。
在Java中,已经有很多对于Word、Excel的开源的解决方案,其中比较出色的是Apache的Jakata项目的POI子项目。
该项目的官方网站是http:
//jakarta.apache.org/poi/。
POI包括一系列的API,它们可以操作基于MicroSoftOLE2CompoundDocumentFormat的各种格式文件,可以通过这些API在Java中读写Excel、Word等文件。
POI是完全的JavaExcel和JavaWord解决方案。
POI子项目包括:
POIFS、HSSF、HDF、HPSF。
表7-2对它们进行了简要介绍。
表7-2 POI子项目介绍
子项目名
说明
POIFS(POIFileSystem)
POIFS是POI项目中最早的最基础的一个模块,是Java到OLE2CompoundDocumentFormat的接口,支持读写功能,所有的其他项目都依赖与该项目。
HSSF(HorribleSpreadsheetFormat)
HSSF是Java到MicrosoftExcel97(-2002)文件的接口,支持读写功能
HWPF(HorribleWordProcessingFormat)
HWPF是Java到MicrosoftWord97文件的接口,支持读写功能,但目前该模块还处于刚开始开发阶段,只能实现一些简单文件的操作,在后续版本中,会提供更强大的支持
HPSF(HorriblePropertySetFormat)
HPSF是Java到OLE2CompoundDocumentFormat文件的属性设置的接口,属性设置通常用来设置文档的属性(标题,作者,最后修改日期等),还可以设置用户定义的属性。
HPSF支持读写功能,当前发布版本中直支持读功能。
7.3.1 对Excel的处理类
下面通过HSSF提供的接口对Excel文件经行处理。
首先需要下载POI的包,可以到apache的官方网站下载,地址为:
http:
//apache.justdn.org/jakarta/poi/,本书采用的是poi-2.5.1-final-20040804.jar,读者可以下载当前的稳定版本。
把下载的包按照前面介绍的方式加入BuildPath,然后新建一个ch7.poi包,并创建一个ExcelReader类。
ExcelReader类可以读取一个XLS文件,然后将其内容逐行提取出来,写入文本文件。
其代码如下。
代码7.6
publicclassExcelReader{
//创建文件输入流
privateBufferedReaderreader=null;
//文件类型
privateStringfiletype;
//文件二进制输入流
privateInputStreamis=null;
//当前的Sheet
privateintcurrSheet;
//当前位置
privateintcurrPosition;
//Sheet数量
privateintnumOfSheets;
//HSSFWorkbook
HSSFWorkbookworkbook=null;
//设置Cell之间以空格分割
privatestaticStringEXCEL_LINE_DELIMITER="";
//设置最大列数
privatestaticintMAX_EXCEL_COLUMNS=64;
//构造函数创建一个ExcelReader
publicExcelReader(Stringinputfile)throwsIOException,Exception{
//判断参数是否为空或没有意义
if(inputfile==null||inputfile.trim().equals("")){
thrownewIOException("noinputfilespecified");
}
//取得文件名的后缀名赋值给filetype
this.filetype=inputfile.substring(inputfile.lastIndexOf(".")+1);
//设置开始行为0
currPosition=0;
//设置当前位置为0
currSheet=0;
//创建文件输入流
is=newFileInputStream(inputfile);
//判断文件格式
if(filetype.equalsIgnoreCase("txt")){
//如果是txt则直接创建BufferedReader读取
reader=newBufferedReader(newInputStreamReader(is));
}
elseif(filetype.equalsIgnoreCase("xls")){
//如果是Excel文件则创建HSSFWorkbook读取
workbook=newHSSFWorkbook(is);
//设置Sheet数
numOfSheets=workbook.getNumberOfSheets();
}
else{
thrownewException("FileTypeNotSupported");
}
}
//函数readLine读取文件的一行
publicStringreadLine()throwsIOException{
//如果是txt文件则通过reader读取
if(filetype.equalsIgnoreCase("txt")){
Stringstr=reader.readLine();
//空行则略去,直接读取下一行
while(str.trim().equals("")){
str=reader.readLine();
}
returnstr;
}
//如果是XLS文件则通过POI提供的API读取文件
elseif(filetype.equalsIgnoreCase("xls")){
//根据currSheet值获得当前的sheet
HSSFSheetsheet=workbook.getSheetAt(currSheet);
//判断当前行是否到但前Sheet的结尾
if(currPosition>sheet.getLastRowNum()){
//当前行位置清零
currPosition=0;
//判断是否还有Sheet
while(currSheet!
=numOfSheets-1){
//得到下一张Sheet
sheet=workbook.getSheetAt(currSheet+1);
//当前行数是否已经到达文件末尾
if(currPosition==sheet.getLastRowNum()){
//当前Sheet指向下一张Sheet
currSheet++;
continue;
}else{
//获取当前行数
introw=currPosition;
currPosition++;
//读取当前行数据
returngetLine(sheet,row);
}
}
returnnull;
}
//获取当前行数
introw=currPosition;
currPosition++;
//读取当前行数据
returngetLine(sheet,row);
}
returnnull;
}
//函数getLine返回Sheet的一行数据
privateStringgetLine(HSSFSheetsheet,introw){
//根据行数取得Sheet的一行
HSSFRowrowline=sheet.getRow(row);
//创建字符创缓冲区
StringBufferbuffer=newStringBuffer();
//获取当前行的列数
intfilledColumns=rowline.getLastCellNum();
HSSFCellcell=null;
//循环遍历所有列
for(inti=0;i //取得当前Cell
cell=rowline.getCell((short)i);
Stringcellvalue=null;
if(cell!
=null){
//判断当前Cell的Type
switch(cell.getCellType()){
//如果当前Cell的Type为NUMERIC
caseHSSFCell.CELL_TYPE_NUMERIC:
{
//判断当前的cell是否为Date
if(HSSFDateUtil.isCellDateFormatted(cell)){
//如果是Date类型则,取得该Cell的Date值
Datedate=cell.getD