POI操作Excel.docx
- 文档编号:9435271
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:34
- 大小:31.15KB
POI操作Excel.docx
《POI操作Excel.docx》由会员分享,可在线阅读,更多相关《POI操作Excel.docx(34页珍藏版)》请在冰豆网上搜索。
POI操作Excel
POI操作Excel----------(转载)
java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境。
然而由于老外的英语只有26个字母,有些情况下,一些程序员用8位的byte处理,一不小心就去掉了CJK的高位。
或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼。
还好在POIHSSF中考虑到这个问题,可以设置encoding为双字节。
POI可以到www.apache.org下载到。
编译好的jar主要有这样4个:
poi包,poiBrowser包,poihdf包,poihssf例程包。
实际运行时,需要有poi包就可以了。
如果用Jakartaant编译和运行,下载apacheJakartaPOI的release中的src包,它里面已经为你生成好了build文件了。
只要运行ant就可以了(ant的安装和使用在此不说了)。
如果是用Jbuilder运行,请在新建的项目中加入poi包。
以Jbuilder6为例,选择Tools菜单项的configlibraries...选项,新建一个lib。
在弹出的菜单中选择poi包,如这个jakarta-poi-1.5.1-final-20020820.jar,把poi添加到jbuilder中。
然后,右键点击你的项目,在project的properties菜单中path的requiredLibraries中,点add,添加刚才加入到jbuilder中的poi到你现在的项目中。
如果你仅仅是为了熟悉POIhssf的使用,可以直接看POI的samples包中的源代码,并且运行它。
hssf的各种对象都有例程的介绍。
hssf提供的例程在org.apache.poi.hssf.usermodel.examples包中,共有14个,生成的目标xls都是workbook.xls。
如果你想看更多的例程,可以参考hssf的Junittestcases,在poi的包的源代码中有。
hssf都有测试代码。
这里只对部分例程的实现做介绍。
HSSF提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell对象,样式和格式,还有辅助操作。
有以下几种对象:
HSSFWorkbookexcell的文档对象
HSSFSheetexcell的表单
HSSFRowexcell的行
HSSFCellexcell的格子单元
HSSFFontexcell字体
HSSFName名称
HSSFDataFormat日期格式
在poi1.7中才有以下2项:
HSSFHeadersheet头
HSSFFootersheet尾
和这个样式
HSSFCellStylecell样式
辅助操作包括
HSSFDateUtil日期
HSSFPrintSetup打印
HSSFErrorConstants错误信息表
仔细看org.apache.poi.hssf包的结构,不难发现HSSF的内部实现遵循的是MVC模型。
这里我用Rose把org.apache.poi.hssf.usermodel包中的对象反向导入并根据相互关系作了整理,详见下面两图:
图1基本对象
从中不难可以发现每一个基本对象都关联了一个Record对象。
Record对象是一个参考Office格式的相关记录。
图2HSSFWorkbook
HSSFWorkbook即是一个Excell对象。
这幅类图体现的是HSSFWorkbook和基本对象的相互关系。
可见,许多对象中也建立了Workbook的引用。
还需要注意的是在HSSFWorkbook和HSSFSheet中建立了log机制POILogger,而且POILogger也是使用apacheLog4J实现的。
先看poi的examples包中提供的最简单的例子,建立一个空xls文件。
[java]viewplaincopyprint?
1. Microsoft YaHei;font-size: 12px;color: #333333;">Java代码 2.import org.apache.poi.hssf.usermodel.HSSFWorkbook; 3. 4.import java.io.FileOutputStream; 5. 6.import java.io.IOException; 7. 8.public class NewWorkbook 9. 10.{ 11. 12.public static void main(String[] args) 13. 14.throws IOException 15. 16.{ 17. 18.HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象 19. 20.FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 21. 22.wb.write(fileOut);//把Workbook对象输出到文件workbook.xls中 23. 24.fileOut.close(); 25. 26.} 27. 28.} 29. 30.通过这个例子,我们建立的是一个空白的xls文件(不是空文件)。 在此基础上,我们可以进一步看其它的例子。 31. 32.import org.apache.poi.hssf.usermodel.*; 33. 34.import java.io.FileOutputStream; 35. 36.import java.io.IOException; 37. 38.public class CreateCells 39. 40.{ 41. 42.public static void main(String[] args) 43. 44.throws IOException 45. 46.{ 47. 48.HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象 49. 50.HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet对象 51. 52.// Create a row and put some cells in it. Rows are 0 based. 53. 54.HSSFRow row = sheet.createRow((short)0);//建立新行 55. 56.// Create a cell and put a value in it. 57. 58.HSSFCell cell = row.createCell((short)0);//建立新cell 59. 60.cell.setCellValue (1);//设置cell的整数类型的值 61. 62.// Or do it on one line. 63. 64.row.createCell((short)1).setCellValue(1.2);//设置cell浮点类型的值 65. 66.row.createCell((short)2).setCellValue("test");//设置cell字符类型的值 67. 68.row.createCell((short)3).setCellValue(true);//设置cell布尔类型的值 69. 70.HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell样式 71. 72.cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h: mm"));//设置cell样式为定制的日期格式 73. 74.HSSFCell dCell =row.createCell((short)4); 75. 76.dCell.setCellValue(new Date());//设置cell为日期类型的值 77. 78.dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式 79. 80.HSSFCell csCell =row.createCell((short)5); 81. 82.csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//设置cell编码解决中文高位字节截断 83. 84.csCell.setCellValue("中文测试_Chinese Words Test");//设置中西文结合字符串 85. 86.row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立错误cell 87. 88.// Write the output to a file 89. 90.FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 91. 92.wb.write(fileOut); 93. 94.fileOut.close(); 95. 96.} 97. 98.} 99. 100.我稍微修改了原来的examples包中的CreateCells类写了上面的功能测试类。 通过这个例子,我们可以清楚的看到xls文件从大到小包 括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。 我们可以在cell中设置各种类型的值。 尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须 设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。 101. 102.其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。 需要注意的是POI是一 个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。 如HSSFSheet的getFooter() getHeader()和setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就没有。 运行测试熟悉代码或者使用它做项目时请注意POI的版本。 103. 104.另外需要注意的是HSSF也有它的对xls基于事件的解析。 可以参考例程中的EventExample.java。 它通过实现 HSSFListener完成从普通流认知Xls中包含的内容,在apache Cocoon中的org.apache.cocoon.serialization.HSSFSerializer中用到了这个解析。 因为Cocoon2 是基于事件的,所以POI为了提供快速的解析也提供了相应的事件。 当然我们自己也可以实现这个事件接口。 105. 106.因为POI还不是一个足够成熟的项目,所以有必要做进一步的开发和测试。 但是它已经为我们用纯java操作ole2对象提供了可能,而且克服了ole对象调用的缺陷,提供了服务器端的Excel解决方案。 107.====================================================== 108. 109.利用Java 创建和读取Excel文档 110. 111. 为了保证示例程序的运行,必须安装Java 2 sdk1.4.0 和Jakarta POI,Jakarta POI的Web站点是: http: //jakarta.apache.org/poi/ 112. 113. 114.示例1将演示如何利用Jakarta POI API 创建Excel 文档。 115. 116. 117.示例1程序如下: 118.import org.apache.poi.hssf.usermodel.HSSFWorkbook; 119.import org.apache.poi.hssf.usermodel.HSSFSheet; 120.import org.apache.poi.hssf.usermodel.HSSFRow; 121.import org.apache.poi.hssf.usermodel.HSSFCell; 122.import java.io.FileOutputStream; 123.public class CreateXL { 124./** Excel 文件要存放的位置,假定在D盘JTest目录下*/ 125.public static String outputFile="D: /JTest/ gongye.xls"; 126.public static void main(String argv[]) 127.{ 128.try 129.{ 130.// 创建新的Excel 工作簿 131.HSSFWorkbook workbook = new HSSFWorkbook(); 132.// 在Excel工作簿中建一工作表,其名为缺省值 133.// 如要新建一名为"效益指标"的工作表,其语句为: 134.// HSSFSheet sheet = workbook.createSheet("效益指标"); 135.HSSFSheet sheet = workbook.createSheet(); 136.// 在索引0的位置创建行(最顶端的行) 137.HSSFRow row = sheet.createRow((short)0); 138.//在索引0的位置创建单元格(左上端) 139.HSSFCell cell = row.createCell((short) 0); 140.// 定义单元格为字符串类型 141.cell.setCellType(HSSFCell.CELL_TYPE_STRING); 142.// 在单元格中输入一些内容 143.cell.setCellValue("增加值"); 144.// 新建一输出文件流 145.FileOutputStream fOut = new FileOutputStream(outputFile); 146.// 把相应的Excel 工作簿存盘 147.workbook.write(fOut); 148.fOut.flush(); 149.// 操作结束,关闭文件 150.fOut.close(); 151.System.out.println("文件生成..."); 152. 153. 154. }catch(Exception e) { 155.System.out.println("已运行 xlCreate() : " + e ); 156.} 157.} 158.} 159. 160. 161.读取Excel文档中的数据 162.示例2将演示如何读取Excel文档中的数据。 假定在D盘JTest目录下有一个文件名为gongye.xls的Excel文件。 163.示例2程序如下: 164.import org.apache.poi.hssf.usermodel.HSSFWorkbook; 165.import org.apache.poi.hssf.usermodel.HSSFSheet; 166.import org.apache.poi.hssf.usermodel.HSSFRow; 167.import org.apache.poi.hssf.usermodel.HSSFCell; 168.import java.io.FileInputStream; 169.public class ReadXL { 170./** Excel文件的存放位置。 注意是正斜线*/ 171.public static String fileToBeRead="D: /JTest/ gongye.xls"; 172.public static void main(String argv[]){ 173.try{ 174.// 创建对Excel工作簿文件的引用 175.HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead)); 176.// 创建对工作表的引用。 177.// 本例是按名引用(让我们假定那张表有着缺省名"Sheet1") 178.HSSFSheet sheet = workbook.getSheet("Sheet1"); 179.// 也可用getSheetAt(int index)按索引引用, 180.// 在Excel文档中,第一张工作表的缺省索引是0, 181.// 其语句为: HSSFSheet sheet = workbook.getSheetAt(0); 182.// 读取左上端单元 183.HSSFRow row = sheet.getRow(0); 184.HSSFCell cell = row.getCell((short)0); 185.// 输出单元内容,cell.getStringCellValue()就是取所在单元的值 186.System.out.println("左上端单元是: " + cell.getStringCellValue()); 187.}catch(Exception e) { 188.System.out.println("已运行xlRead() : " + e ); 189.} 190.} 191.} 192. 193. 194.设置单元格格式 195.在这里,我们将只介绍一些和格式设置有关的语句,我们假定workbook就是对一个工作簿的引用。 在Java 196. 197.中,第一步要做的就是创建和设置字体和单元格的格式,然后再应用这些格式: 198. 199. 1、创建字体,设置其为红色、粗体: 200.HSSFFont font = workbook.createFont(); 201.font.setColor(HSSFFont.COLOR_RED); 202.font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 203.2、创建格式 204.HSSFCellStyle cellStyle= workbook.createCellStyle(); 205.cellStyle.setFont(font); 206.3、应用格式 207.HSSFCell cell = row.createCell((short) 0); 208.cell.setCellStyle(cellStyle); 209.cell.setCellType(HSSFCell.CELL_TYPE_STRING); 210.cell.setCellValue("标题 "); 211. 212. 总之,如本篇文章所演示的一样,Java程序员不必担心Excel工作表中的数据了,利用Jakarta POI API, 213. 214.我们就可以轻易的在程序中存取Excel文档。 215. 216.============================================== 217. 218.首先说说现在我所知道的Java编辑Excel文件的两大开源工具: 219. 220.jakarta POI和JavaExcelAPI(简称JXL),这两套工具我都试用了一这段时间,感觉各有优劣吧。 POI在某些细节有些小Bug并且不支持写入图片,其他方面都挺不错的; 221. 222.JXL就惨了,除了支持写入图片外,我暂时看不到它比POI好的地方,我碰到的主要的问题就是对公式支持不是很好,很多带有公式的Excel文件用 JXL打开后,公式就丢失了(比如now(),today()),在网上看到其他大虾评论说JXL写入公式也有问题,另外,JXL操作Excel文件的效 率比POI低一点。 经过比较后,我选择了POI开发我的项目。 223. 224.现在我要做的东西基本完成啦,我把这段时间使用P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- POI 操作 Excel