让poi架起java与office之间的桥梁,让POI架起Java与Office之间的桥梁(三)

a4c26d1e5885305701be709a3d33442f.png

让POI架起Java与Office之间的桥梁(三)

(2006-10-26 02:08:56)

main()方法利用POIFS的事件系统从命令行指定的OLE

2文档读取名为\005SummaryInformation的流,当POIFSReader

遇到这个流时,它把控制传递给MyPOIFSReaderListener的processPOIFSReaderEvent()方法。

processPOIFSReaderEvent()到底有什么用呢?它通过参数获得一个输入流,该输入流包含了文档标题等属性。为了访问文档的属性,我们从输入流创建一个PropertySet实例,如下所示:

si = (SummaryInformation)

PropertySetFactory.create(event.getStream());

这个语句其实包含三个步骤的操作:

event.getStream()从POIFSReader传入的POIFSReaderEvent获得输入流。

以刚才获得的输入流为参数,调用PropertySetFactory的静态方法create()。正如其名字所暗示的,PropertySetFactory是一个工厂类,它有一台“机器”能够把一个输入流转换成一个PropertySet实例,这台机器就是create()方法。

把create()方法返回的PropertySet定型(cast)成为SummaryInformation。PropertySet提供了按照一般办法读取属性集的各种机制,SummaryInformation是PropertySet的子类,即SummaryInformation类在PropertySet类的基础上增加了操作Microsoft标准属性的便捷方法。

在这个处理过程中,可能引起错误的因素很多,因此我们把这部分内容放入了一个try块,不过这个示例程序只按照最简单的方式处理了异常,在实际应用中,最好能够对可能出现的不同异常类型分别处理。

除了一般的I/O异常之外,还有可能遇到HPSF特有的异常,例如,如果输入流不包含属性集或属性集非法,就会抛出NoPropertySetStreamException异常。

有一种错误不太常见,但也不是绝无可能\005SummaryInformation包含一个合法的属性集,但不是摘要信息属性集。如果出现这种情况,则定型成SummaryInformation操作会失败,引发ClassCastException异常。

获得SummaryInformation实例之后,剩下的事情就很简单了,只要调用getTitle()方法,然后输出结果。

除了getTitle()之外,SummaryInformation还包含其他一些便捷方法,例如getApplicationName()、getAuthor()、getCharCount()、和getCreateDateTime()等。HPSF的JavaDoc文档详细说明了所有这些方法。

八、文档摘要信息

遗憾的是,并非所有的属性都保存在摘要信息属性集之中。许多(但不是全部)OLE

2文件还有另一个属性集,称为“文档摘要信息”,对应的流是\005DocumentSummaryInformation。这个属性集保存的属性包括文档的类别、PowerPoint幻灯的多媒体剪辑数量,等等。

要访问文档摘要信息属性集,程序的处理过程也和上例相似,只是注册的目标应该改成\005DocumentSummaryInformation有时,你可能想要同时注册到摘要信息和文档摘要信息这两个流。其余的处理方式和前面的例子差不多,你应该把包含文档摘要信息的流传递给PropertySetFactory.create(),但这次工厂方法将返回一个DocumentSummaryInformation对象(而不是前面例子中的SummaryInformation对象)。

如果同时注册到了两个流,注意检查返回值的具体类型,或者使用Java的instanceof操作符,或者使用专用的isSummaryInformation()和isDocumentSummaryInformation()方法。记住,create()方法返回的总是一个PropertySet对象,因此你总是可以对create()返回对象调用isSummaryInformation()和isDocumentSummaryInformation()方法,PropertySet类之所以要提供这两个方法,是因为属性集可能是自定义的。

如果你想要处理自定义的属性集,或者要从标准的属性集读取用户定义的属性,必须使用一个更一般化的API,前面已经提到,这个API要复杂得多,本文不再讨论,请参见HPSF的HOW-TO文档和POI的文档。

结束语:本文探讨了HSSF的应用以及如何输出到Excel文件,另外还涉及了HPSF以及如何读取属性集文档摘要信息。POI是一个功能非常强大的项目,许多主题本文尚未涉及,例如如何用HSSF

Serializer将XML文档转换成Excel格式等,这一切仍有待您去研究了。

九、附录

实例:利用Servlet创建和返回一个工作簿。

package org.apache.poi.hssf.usermodel.examples;

import java.io.*;

import java.net.*;

import javax.servlet.*;

import javax.servlet.http.*;

import org.apache.poi.hssf.usermodel.*;

public class HSSFCreate extends HttpServlet {

public void init(ServletConfig config)

throws ServletException {

super.init(config);

}

public void destroy() {

}

/** 处理HTTP GET 和POST请求

* @param request:请求

* @param response:应答

*/

protected void processRequest(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("application/vnd.ms-excel");

HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet sheet = wb.createSheet("new sheet");

// 创建一个新的行,添加几个单元格。

// 行号从0开始计算

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("一个字符串值");

row.createCell((short)3).setCellValue(true);

// 写入输出结果

OutputStream out = response.getOutputStream();

wb.write(out);

out.close();

}

/** 处理HTTP GET请求

* @param request:请求

* @param response:应答

*/

protected void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

/** 处理HTTP POST请求

* @param request:请求

* @param response:应答

*/

protected void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

/** 返回关于Servlet的简单说明

*/

public String getServletInfo() {

return "示例:在Servlet中用HSSF创建Excel工作簿";

}

}

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值