资源描述:
《用poihssf处理excel表格》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、用POIHSSF处理EXCEL表格POI的主页:http://jakarta.apache.org/poiPOIHSSF的QuickGuide,教初学者如何快速上手使用POIHSSF:http://jakarta.apache.org/poi/hssf/quick-guide.html笔者据使用经验以为:POIHSSF是当今市面上最强大的处理EXCEL表格的java工具,比韩国人写的那个JExcelApi或其它几种工具都要好。而且它是Apache的开源项目。当然POIHSSF也有缺点:不能直接支持EXCEL图表,API文档粗糙简略,有些类和方法需要引用Apache项目中的其它一
2、些包,包与包之间依赖关系比较复杂等等。本文内容不在于提供一个POIHSSF的完整使用指南(上面那个Apache主页上的QuickGuide已经非常详细),而是列出一些笔者在项目开发过程中找到的一些技巧、经验。下图是定义的模板PoiTest.xls:通过POI生成的最终结果:(单元格中的数据发生变化时,图表中的柱状、折线也会跟着变化)处理图表目前POI版本为2.5.1,org.apache.poi.hssf.usermodel包里有一个HSSFChart类,里面只有一个空方法createBarChart(),表明POI还不直接支持EXCEL图表。替代方法还是有的:因为EXCEL图
3、表的源数据引用自EXCEL单元格。我们可以先新建一个EXCEL工作薄,作为模板,在里面创建图表,指定它引用工作表中的一些特定单元格。然后我们用POI来读取这个工作薄,把数据写入到那些特定单元格。首先要在模板里创建可以动态引用单元格的“名称”,利用“名称”来创建图表中的“系列”。一、打开模板PoiTest.xls,点击[插入]>[名称]>[定义],创建四个“名称”sx,s1y,s2y,s3y:sx=OFFSET(Sheet1!$A$17,0,2,1,COUNTA(Sheet1!$17:$17)-4)s1y=OFFSET(Sheet1!$A$18,0,2,1,COUNTA(Shee
4、t1!$18:$18)-4)s2y=OFFSET(Sheet1!$A$19,0,2,1,COUNTA(Sheet1!$19:$19)-3)s3y=OFFSET(Sheet1!$A$20,0,2,1,COUNTA(Sheet1!$20:$20)-3)这里用到了两个EXCEL函数,OFFSET()和COUNTA()函数。其中COUNTA()可以返回一行或一列的单元格总数:比如COUNTA(Sheet1!$A:$A),计算工作表Sheet1的A列的单元格数目。又比如COUNTA(Sheet1!$17:$17),计算的是Sheet1的第17行的单元格数目。当我们没有在单元格里键入数据时
5、,该单元格是不会被COUNTA()计算的。OFFSET()函数用来引用一系列连续的单元格,它共有五个参数:参数一,作为位置参照的单元格。参数二,行的起始偏移量(以参数一为参照)。参数三,列的起始偏移量(以参数一为参照)。参数四,跨行数。参数五,跨列数。比如:OFFSET(Sheet1!$A:$1,1,2,3,4),表示引用范围为:C2:F4。二、在模板中创建图表,在图表上点右键,选择[源数据]>[系列],如图建立三个系列:点[添加]创建新的系列:[名称]表示系列名,可以直接输入字串,也可以引用EXCEL单元格。在[值]中输入我们在上一步中创建的“名称”,格式为:模板名.xls!
6、名称。在[分类(X)轴标志(T)]中输入我们在上一步中创建的“名称”sx,格式为:模板名.xls!名称。它表示图表区域的X轴将要显示的内容。三、用POI把数据写入到相应的单元格中,图表将会自动显示对应的信息。注意:上面这种方法适用数据集合行数固定而列数动态变化的情况。对于行数也动态变化的情况,只能先在模板里预设尽可能多的“名称”和“系列”。对于行数和列数都固定的情形,没必要这么复杂,只要在图表的[源数据]里设置[数据区域],使之引用EXCEL模板中的一定范围,如下图: 设置单元格样式 HSSFCellStyle类代表一种单元格样式。可以通过这个类来设置单元格的边框样式、背景颜色
7、、字体、水平和垂直对齐方式等等。HSSFCellStyletitleStyle=workbook.createCellStyle(); titleStyle.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE); titleStyle.setBorderLeft((short)1); titleStyle.setBorderRight((short)1); titleStyle.setBorderTop(HSSFCellStyle.BORDER_D