Wps二次开发(POI)
一、POI的介绍
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对办公Office格式档案读和写的功能。以下是POI的几个重要组成部分,以及各组件的功能概述。
HSSF:WPS表格和Excel 97-2003(.xls),基于BIFF8格式的JAVA接口。
XSSF:WPS表格和Excel 2007+(.xlsx),基于OOXML格式的JAVA接口。
HWPF:WPS文字和Word 97-2003(.doc),基于BIFF8格式的JAVA接口。
XWPF:WPS文字和Word 2007+(.docx),基于OOXML格式的JAVA接口。
HSLF:提供读写Microsoft PowerPoint格式档案的功能。
HDGF:提供读Microsoft Visio格式档案的功能。
HPBF:提供读Microsoft Publisher格式档案的功能。
HSMF:提供读Microsoft Outlook格式档案的功能。
下面我们对最常用的HSSF和HWPF进行入门基础的介绍讲解。
二、环境搭建设置
1)需要的环境搭建
需要用到的工具有Eclipse3.7和JDK1.6
2)需要的类库导入
打开Eclipse
依次点击File->New->Java Project
输入项目名称,本例中设置为POIExample
单击完成
在项目上点击右键->New->Folder
输入文件夹名称MyPoi
我们现在需要添加Poi-3.7包
在项目上点击右键->Porpertiex
在弹出框左边选择中->Java Build Path,右边页面选中Libraries,点开选择增加包的路径文件Add External JARs...
将下载的POI-3.7包加载上去
POI对文档的创建、写入、读取
1)创建WPS表格、文字 (样例:CreateETandWPS.java)
首先创建名为POIExample的项目,从中在F盘根目录下创建名为ETExample的WPS表格文件和名为WPSExample的WPS文字文件。
代码如下:
1. FileOutputStream ETfile;
2. FileOutputStream WPSfile;
3. ETfile = new FileOutputStream("F:/ETExample.et");
4. WPSfile= new FileOutputStream("F:/WPSExample.doc");
5. ETfile.close();
6. WPSfile.close();
2)在创建的文档中写入内容(样例:WriteETandWPS.java)
在生成的文件中插入文字内容,在ETExample表格第一个表中B2单元格中插入“我是表格内容”的文字。在WPSExample文档文件中插入“我是文字内容”的文字。最后保存退出。
代码如下:
1. WPS表格写入///
2. HSSFWorkbook wb = new HSSFWorkbook(); //创建一个空白的工作簿对象
3. HSSFSheet st = wb.createSheet("表格工作表第1页"); //基于上面的工作簿创建属于此工作簿的工作表名为"表格工作表第1页"
4. HSSFRow row = st.createRow(0); //创建属于上面工作表的第1行,参数从0开始可以是0~65535之间的任何一个
5. HSSFCell cell = row.createCell((short)1); //创建属于上面行的单元格,参数从0开始可以是0~255之间的任何一个,
6. cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置此单元格的格式为文本,此句可以省略,WPS表格会自动识别。
7. cell.setCellValue(new HSSFRichTextString("我是表格内容")); //直接在上面定义好的单元格输入内容("我是表格内容"),
8. FileOutputStream ETFile;
9. ETFile = new FileOutputStream("F:/ETExample.et"); //创建一个文件输出流,指定到F盘根目录下的ETExample.et空白的表格文件
10. wb.write(ETFile); //把工作表内容写到流里
11. ETFile.close(); //记得手动关闭流,POI不关闭用户打开的流。
12. WPS文字写入///
13. String str="我是文字内容"; //需要输入WPS文字里的内容
14. writeWPS("F:/WPSExample.doc",str); //调用写入的方法
15. /writeWPS方法//
16. byte b[] = string.getBytes("GBK"); //字符集的类型为"GBK"
17. ByteArrayInputStream bais = new ByteArrayInputStream(b); //创建一个字符数组输入对象
18. POIFSFileSystem fs = new POIFSFileSystem(); //创建POI文件集对象
19. DirectoryEntry directory = fs.getRoot(); //获取文件录入节点
20. DocumentEntry de = directory.createDocument("WordDocument", bais);
21. //创建文件对象
22. FileOutputStream ostream = new FileOutputStream(path);
23. //设置输出流对象,参数为地址
24. fs.writeFilesystem(ostream); //将文件内容写入流,参数为输出流
25. bais.close(); //关闭流对象
26. ostream.close();
3)读取出文档中的信息内容(样例:ReadETandWPS.java)
在Eclipse控制台中输出ETExample第一个表B2的内容以及WPSExample文档中的内容。
代码如下:
1. ///ET表格读取内容/
2. FileInputStream ETreadFile = new FileInputStream("F:/ETExample.et");
3. //指定要读取的文件,本例使用之前生成的ETExample.et
4. HSSFWorkbook wb = new HSSFWorkbook(ETreadFile);
5. //创建一个工作表对象,从指定的文件流中创建,即上面指定了的文件流
6. HSSFSheet st = wb.getSheet("表格工作表第1页");
7. //获取名称为"表格工作表第1页"的工作表,可以用getSheetAt(int)方法取得Sheet
8. HSSFRow row = st.getRow(0);
9. //获得第一行,同上,如果此行没有被创建过则抛出异常
10. HSSFCell cell = row.getCell((short) 1);
11. //获取第一个单元格,如果没有被创建过则抛出异常
12. System.out.println(cell.getRichStringCellValue());
13. //把cell中的内容按字符串方式读取出来,并显示在控制台上
14. ETreadFile.close(); //记得关闭流
15. //WPS文字读取内容
16. FileInputStream WPSreadFile=newFileInputStream("F:/WPSExample.doc");
17. //指定要读取的文件,本例使用之前生成的WPSExample.wps
18. HWPFDocument hDocument= new HWPFDocument(WPSreadFile); //创建文档对象
19. Range rang= hDocument.getRange(); //定义文档Range,获得区域String string=rang.text(); //获得文档内容
20. System.out.println(string); //把文档中的内容读取出来,并显示在控制台上
21. WPSreadFile.close(); //记得关闭流
POI对文档的格式、方法
1)对文档中的格式编辑(样例:SpecialPOIExample.java)
对ETExample表格文件第一个表B2单元格的边框、字体及颜色进行设置。
B2单元格效果为:纵向显示文字、背景颜色为红色、字体颜色为黄色。
对SpecialPOIExample.wps文档文件里的文字内容修改成自己想要的内容。
把文档里的文字内容“我是文字内容”改成“这是文字信息”。
代码如下:
1. WPS表格格式设置/
2. FileInputStream ETreadFile = new FileInputStream("F:/ETExample.et");
3. //指定要读取的文件,本例使用之前生成的ETExample.et
4. HSSFWorkbook wb = new HSSFWorkbook(ETreadFile);
5. //创建一个工作表对象,从指定的文件流中创建,即上面指定了的文件流
6. HSSFSheet st = wb.getSheet("表格工作表第1页");
7. //获取名称为"表格工作表第1页"的工作表,可以用getSheetAt(int)方法取得Sheet
8. HSSFRow row = st.getRow(0);
9. //获得第一行,同上,如果此行没有被创建过则抛出异常
10. HSSFCell cell = row.getCell((short) 1);
11. //获取第一个单元格,如果没有被创建过则抛出异常
12. System.out.println(cell.getRichStringCellValue());
13. //把cell中的内容按字符串方式读取出来,并显示在控制台上
14. ETreadFile.close(); //记得关闭流
15. //设置字体
16. HSSFFont font=wb.createFont(); //定义字体格式对象
17. font.setFontName("宋体"); //字体为宋体
18. font.setColor(HSSFColor.YELLOW.index); //字体颜色为黄色
19. //设置单元格
20. HSSFCellStyle cellStyle=wb.createCellStyle(); //设置单元格样式对象
21. cellStyle.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE); //设置单元格低边框样式
22. cellStyle.setBorderLeft((short)1); //设置单元格左边框
23. cellStyle.setBorderRight((short)1); //设置单元格右边框
24. cellStyle.setBorderTop(HSSFCellStyle.BORDER_DOUBLE); //设置单元格上边框
25. cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //设置单元格填充方式
26. cellStyle.setFillForegroundColor(HSSFColor.RED.index); //设置单元格背景颜色
27. cellStyle.setRotation((short)90); //设置内容旋转90度,达到竖排显示效果
28. cellStyle.setFont(font); //将字体对象定义到单元格样式中
29. cell.setCellStyle(cellStyle); //设置定义的单元格格式赋予cell单元格对象
30. FileOutputStream fos=new FileOutputStream("F:/ETExample.et"); //输出流对象到指定文档
31. wb.write(fos); //定义的写入文档
32. fos.flush(); //完成输出流
33. fos.close(); //关闭流
34. WPS文字格式设置/
35. HWPFDocument hDocument=new HWPFDocument(new FileInputStream("F:/WPSExample.doc"));
36. //定义输入流自定文件
37. Range range= hDocument.getRange(); //获取Range对象
38. range.replaceText("我是文字内容","这是文字信息"); //设置更改内容
39. String str=range.text(); //定义内容为字符串类型
40. writeWPS("F:/WPSExample.doc",str); //调用写入方法将指定内容写入到指定文档中
2)个别特殊例子(样例:PictureOut.java)
在F盘根目录下SpecialPOIExample.wps包含图片的WPS文字文档,从这个文档中把图片提取出来另存成img.jpg图片文件在F盘根目录下。
代码如下:
1.
2. String savePath= "F:\\"; //定义路径对象
3. String docFile= savePath+ "SpecialPOIExample.wps"; //定义文件名+路径对象
4. String imgFile= savePath+ "img.jpg"; //定义图片名+路径对象
5. FileInputStream file=new FileInputStream(docFile); //定义输入流对象
6. HWPFDocument poiDoc = new HWPFDocument(file); //定义文档对象
7. List picList = poiDoc.getPicturesTable().getAllPictures(); //定义获取文档图片对象集
8. Picture picture = (Picture) picList.get(0); //定义图片对象为图片集的第一个图片 picture.writeImageContent(new FileOutputStream(imgFile));
9. //将图片对象输出到指定图片名+路径
10.
11.