最近项目上需要用到操作Word,于是又看了一下POI相关的API,网上关于POI的API虽然例子很多,大都是一些片段,最后发现ppjava中关于POI的相关表述比较系统,转过来标注一下,以备后用。
Apache POI
http://ppjava.com/?p=1946
Apache POI 是一套用于访问微软 Office 格式文档 (Word, Excel and PowerPoint) 的 Java API。其中用于操作 Excel 格式文件的 API 是 HSSF、XSSF,用于操作 Word 格式文件的 API 是 HWPF、XWPF,以及用于操作 PowerPoint 格式文件的 API 是 HSLF、XSLF。
当前最新的版本 3.9,下载引入 poi-version-yyyymmdd.jar、poi-scratchpad-version-yyyymmdd.jar、poi-ooxml-schemas-version-yyyymmdd.jar 和 poi-examples-version-yyyymmdd.jar即可使用POI,若需要操作 office 2007 文档还如加入 dom4j-version.jar 和 xmlbeans-version.jar。
POI 主要组成部分
- POIFS 是该项目的最古老、最稳定的一部分,它同时支持读写功能,是OLE 2 复合文档格式的纯 Java 实现,所有的组件最终都依赖于它的定义;
- HPSF 用来处理微软格式文档属性,微软的应用程序如word、excel 或 ppt 有标题、类别、作者和创建日期等文件的属性,这些文件的属性存储在所谓的属性集流(property set streams)中,HPSF是POI的纯Java实现读取和写入属性集;
- HSSF 是对 Excel 97 文件格式(.xml)文件操作的纯Java接口,是POI项目中比较成熟的部分,而XSSF 是则用于操作 Excel 2007 的文件格式(.xlsx);
- HSLF 是针对 Microsoft PowerPoint 97 文件格式(.ppt)的文档操作的纯 Java 接口,XSLF 是针对 2007 格式(.pptx)文档操作的接口;
- HWPF 是针对 Microsoft Word 97 文件格式(.doc)的文档操作的纯 Java 接口,XWPF 是针对 2007 格式(.docx)文档操作的接口;
- HDGF 提供了对微软 Visio 97 文件格式的文档操作的纯 Java 接口,它目前只支持简单的文本提取;
- HPBF 是POI项目的纯Java实现的操作Publisher格式文件的接口,目前仅有基本的文本提取的支持,还不支持写操作;
- HSMF 用于对Outlook MSG格式文件的低级别的读取,如发件人、主题、邮件正文。
下面我们简单的介绍一下项目中经常会使用到的对于word文件进行操作的接口:
Excel文件操作
目前 POI 比较成熟的部分是 HSSF 接口,处理 MS Excel(97-2003)对象。它不像我们仅仅使用 csv 生成的没有格式的可以由 Excel 转换的东西,而是真正的 Excel 对象,你可以控制一些属性如 cell,sheet 等等。对于统计页数 (sheet 个数 ) 来说,HSSF 接口可以很简单的完成这一功能。当然,HSSF 也有一些缺点,比如不能直接支持 Excel 图表,包与包之间依赖关系比较复杂等等。
HSSF 提供给我们使用的对象在 org.apache.poi.hssf.usermodel 包中,主要部分包括 Excel 97 对象、样式和格式,还有辅助操作。主要有以下几种对象:
- org.apache.poi.hssf.usermodel.HSSFWorkbook:对应于 Excel 的文档对象
- org.apache.poi.hssf.usermodel.HSSFSheet:对应于 Excel 的表单
- org.apache.poi.hssf.usermodel.HSSFRow:对应于 Excel 的行
- org.apache.poi.hssf.usermodel.HSSFCell:对应于 Excel 的单元格
- org.apache.poi.hssf.usermodel.HSSFFont:对应于 Excel 字体
- org.apache.poi.hssf.usermodel.HSSFName:对应于 Excel 名称
- org.apache.poi.hssf.usermodel.HSSFDataFormat:对应于日期格式
- org.apache.poi.hssf.usermodel.HSSFHeader:对应于 Sheet 头
- org.apache.poi.hssf.usermodel.HSSFFooter:对应于 Sheet 尾
- org.apache.poi.hssf.usermodel.HSSFCellStyle:对应于 Cell 样式
XSSF 用于操作 Excel 2007 版本,其相关对象在 org.apache.poi.xssf.usermodel 包中。
读取Excel表格:
public static void readExcel(String excelFilePath) { FileInputStream inputStream = null; try { Workbook excel = null; inputStream = new FileInputStream(excelFilePath); if (excelFilePath.toLowerCase().endsWith(".xls")) excel = new HSSFWorkbook(inputStream); // 读取 Excel 97 文档并获取excel else excel = new XSSFWorkbook(inputStream); // 读取 Excel 2007 文档并获取excel for (int i = 0; i < excel.getNumberOfSheets(); i++) { Sheet sheet = excel.getSheetAt(i); // 获取第i个sheet int rowNumber = sheet.getPhysicalNumberOfRows(); System.out.println("第 " + (i + 1) + " 个Sheet名称为 " + sheet.getSheetName() + " ,有 " + rowNumber + " 行"); for (int r = 0; r < rowNumber; r++) { Row row = sheet.getRow(r); // 获取第r行 if (row != null) { int cellNumber = row.getPhysicalNumberOfCells(); System.out.println("\t第 " + (r + 1) + " 行有 " + cellNumber + " 个单元格"); for (int c = 0; c < cellNumber; c++) { Cell cell = row.getCell(c); // 获取第c单元格 if (cell != null) { System.out.print("\t\t第 " + (c + 1) + " 个单元格类型为 "); switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: System.out.println("数字,值为 " + cell.getNumericCellValue()); break; case Cell.CELL_TYPE_STRING: System.out.println("文本,值为 " + cell.getStringCellValue()); break; case Cell.CELL_TYPE_BOOLEAN: System.out.println("布尔,值为 " + cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_FORMULA: System.out.println("公式,值为 " + cell.getCellFormula()); break; case Cell.CELL_TYPE_BLANK: System.out.println("空白"); break; case Cell.CELL_TYPE_ERROR: System.out.println("故障"); break; default: System.out.println("未知类型"); break; } } } } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { close(inputStream); } }
创建excel表格:
public static void createExcel(String excelFilePath) { FileOutputStream outputStream = null; try { outputStream = new FileOutputStream(excelFilePath); // Workbook excel = new HSSFWorkbook();// 创建一个 Excel 97 文档对象 Workbook excel = new XSSFWorkbook(); // 创建一个 Excel 2007 文档对象 CreationHelper helper = excel.getCreationHelper(); Sheet sheet = excel.createSheet(); excel.setSheetName(0, "poi生成Excel"); // 设置红色粗体字的单元格式样 CellStyle cellStyle1 = excel.createCellStyle(); Font font1 = excel.createFont(); font1.setFontHeightInPoints((short) 12); font1.setColor((short) 0xA); font1.setBoldweight(Font.BOLDWEIGHT_BOLD); cellStyle1.setFont(font1); // 设置红底粗体蓝字的单元格式样 CellStyle cellStyle2 = excel.createCellStyle(); cellStyle2.setBorderBottom(CellStyle.BORDER_THIN); cellStyle2.setFillPattern((short) 1); cellStyle2.setFillForegroundColor((short) 0xA); Font font2 = excel.createFont(); font2.setFontHeightInPoints((short) 10); font2.setColor((short) 0xf); font2.setBoldweight(Font.BOLDWEIGHT_BOLD); cellStyle2.setFont(font2); int rowIndex; for (rowIndex = 0; rowIndex < 6; rowIndex++) { Row row = sheet.createRow(rowIndex); if (rowIndex % 2 == 0) row.setHeight((short) 0x249); / /设置行高 for (int cellIndex = 0; cellIndex < 6; cellIndex += 2) { Cell cell = row.createCell(cellIndex); cell.setCellValue((rowIndex + 1) * 1000 + cellIndex + 1); if (rowIndex % 2 == 0) cell.setCellStyle(cellStyle1); cell = row.createCell(cellIndex + 1); cell.setCellValue(helper.createRichTextString("测试内容")); // 设置单元格宽度 sheet.setColumnWidth(cellIndex + 1, (int)(20 * 8 / 0.05)); if ((rowIndex % 2) == 0) cell.setCellStyle(cellStyle2); } } // 在底部划一根粗线 Row row = sheet.createRow(rowIndex); CellStyle cellStyle3 = excel.createCellStyle(); cellStyle3.setBorderBottom(CellStyle.BORDER_THICK); for (int cellIndex = 0; cellIndex < 6; cellIndex++) { Cell cell = row.createCell(cellIndex); cell.setCellStyle(cellStyle3); } // 合并单元格 sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 1)); // 删除一个sheet sheet = excel.createSheet(); excel.setSheetName(1, "DeletedSheet"); excel.removeSheetAt(1); excel.write(outputStream); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { close(outputStream); } }
生成的excel文档大概如下:
Word文件操作
HWPF 接口主要用来处理 MS Word(97-2003)对象,是 POI 中相对不太成熟的部分。但可以做一些基本的对于对 word 文档的读写操作。HWPF 提供给我们使用的对象在 org.apache.poi.hwpf.extractor 和 org.apache.poi.hwpf.usermodel 包中,主要部分包括 Word 对象,表格等。主要有以下几种对象:
- org.apache.poi.hwpf.extractor.WordExtractor:从 Word 文档中提取出文本的类。
- org.apache.poi.hwpf.usermodel.Paragraph:对应于 Word 的一个段落。
- org.apache.poi.hwpf.usermodel.Table:对应于 Word 的一个表格。
- org.apache.poi.hwpf.usermodel.TableCell:对应于 Word 的表格的一个单元格。
- org.apache.poi.hwpf.usermodel.Range:是 HWPF 对象模型的核心类,适用于在 Word 文档中的字符的范围的所有属性扩展这个类。它可以插入文字或者选定一定范围的属性。
而操作 Word 2007 文档则有 XWPF 接口,其相关对象在 org.apache.poi.xwpf.extractor 和 org.apache.poi.xwpf.usermodel 包中。
获取word中文本内容:
public static String readWordText(String wordFilePath) { FileInputStream inputStream = null; String wordText = null; try { // 读取 Word 97 文档 if (wordFilePath.toLowerCase().endsWith(".doc")) { inputStream = new FileInputStream(wordFilePath); WordExtractor wordExtractor = new WordExtractor(inputStream); // wordExtractor.getSummaryInformation().getPageCount();// 获取文档页数 wordText = wordExtractor.getText(); } else { // 读取 Word 2007 文档 OPCPackage oPCPackage = POIXMLDocument.openPackage(wordFilePath); XWPFDocument wordDocument = new XWPFDocument(oPCPackage); POIXMLTextExtractor textExtractor = new XWPFWordExtractor(wordDocument); wordText = textExtractor.getText(); } System.out.println(wordText); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { close(inputStream); } return wordText; }
【注】POI 在读取 word 文件的时候不会读取 word 文件中的图片信息,如果 是 2007 版的 word 文件中有表格,所有表格中的数据都会在读取出来的字符串的最后。对于 HWPF 组件。HWPF 中 WordExtractor 的 SummaryInformation 提供了一个 getPageCount 的方法来获取文档页数,经测试发现其无法正确地读取 word 文件页数,因为此方法获取的页数来自 word 文档的摘要部分,并不是实际的页数。
读取 Word 中的表格:
public static void readWordTable(String wordFilePath) { FileInputStream inputStream = null; try { if (wordFilePath.toLowerCase().endsWith(".doc")) { inputStream = new FileInputStream(wordFilePath); HWPFDocument wordDocument = new HWPFDocument( new POIFSFileSystem(inputStream)); Range range = wordDocument.getRange(); // 得到文档的读取范围 TableIterator iterator = new TableIterator(range); while (iterator.hasNext()) { Table table = iterator.next(); // 获取表格 for (int r = 0; r < table.numRows(); r++) { TableRow row = table.getRow(r); // 获取第r行 for (int c = 0; c < row.numCells(); c++) { TableCell cell = row.getCell(c); // 获取第c个单元格 for (int p = 0; p < cell.numParagraphs(); p++) { Paragraph para = cell.getParagraph(p); // 获取第p个段落 System.out.println(para.text()); } } } } } else { // 读取 Word 2007 文档 OPCPackage oPCPackage = POIXMLDocument .openPackage(wordFilePath); XWPFDocument wordDocument = new XWPFDocument(oPCPackage); List < XWPFTable > list = wordDocument.getTables(); for (XWPFTable table: list) for (XWPFTableRow row: table.getRows()) for (XWPFTableCell cell: row.getTableCells()) for (XWPFParagraph paragraph: cell.getParagraphs()) System.out.println(paragraph.getText()); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { close(inputStream); } }
相关推荐
本文将深入讲解如何使用Apache POI创建一个简单的Excel导出工具类。 1. **安装与引入Apache POI** 在开始之前,你需要在项目中添加Apache POI的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ...
在IT行业中,尤其是在文档处理和自动化生成领域,Apache POI是一个非常重要的库,它允许开发者使用Java来操作Microsoft Office格式的文件,如Word(.doc/.docx)、Excel(.xls/.xlsx)等。本教程将专注于如何使用...
8. **API文档**:apidocs 文件夹通常包含详细的Javadoc,它是了解POI库各个类和方法的官方参考,提供了完整的接口描述、参数说明和使用示例。 学习和实践这些API,结合提供的jar包,你将能够高效地实现Java与Excel...
Apache POI 是一个开源库,...综上所述,Apache POI 提供了全面的 API,使得在 Java 中处理 Excel 文件变得简单易行。通过熟练掌握这些使用方法,开发者可以方便地进行数据的导入导出、报告生成、数据分析等多种任务。
安装完成后,可以通过编写简单的Java代码来测试是否能够成功导入和使用Apache POI库。例如,创建一个Excel文件并写入数据: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf....
总之,Apache POI库为Java开发者提供了处理Excel加密的强大工具,使得在程序中读取、写入加密Excel文件变得简单易行。通过理解加密原理和使用Apache POI的相关API,我们可以确保数据的安全性,同时实现高效的数据...
Apache POI 是一个开源项目,由Apache软件基金会开发,它提供了Java API,使得开发者能够创建、修改和显示Microsoft Office格式的文件,如Word(.doc)、Excel(.xls)和PowerPoint(.ppt)。"poi3.11-jar包"指的是...
使用 POI 创建 Excel 文件非常简单,只需要创建一个 HSSFWorkbook 对象,然后使用 FileOutputStream 写入文件。 ```java import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi....
Apache POI 简单使用指南 Apache POI 是 Apache 软件基金会的开源项目,提供 API 给 Java 程序对 Microsoft Office 格式档案读和写的功能。.NET 的开发人员则可以利用 NPOI (POI for .NET) 来存取 Microsoft Office...
以下是一个简单的步骤概述,说明如何使用Apache POI生成Word文档: 1. 引入Apache POI依赖:首先,你需要在项目中添加Apache POI的依赖库。如果是Maven项目,可以在pom.xml中添加对应的依赖项;如果是其他构建工具...
`maven引入poi.txt`文件可能包含了上述Maven依赖的添加说明,确保开发者正确配置了项目以便使用Apache POI库。 总之,Apache POI提供了一套强大的API,使得在Java中处理Excel文件变得简单。通过学习和理解`...
Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel。在这个场景中,"POI到处excel文件"意味着我们使用Apache POI库来创建、读取和修改Excel文档。以下是对这个主题的详细说明: ...
一、文档总体说明 POI技术是Apache软件基金会下的一个开源项目,主要目的是提供一套API,使得Java开发者能够处理Microsoft Office格式的文件,包括Excel、Word、PowerPoint等。通过POI,我们可以读取、创建、修改...
一、问题描述及现象需求说明 在效果评估系统中,存在指标管理和模板管理两个模块。模板管理中有一个导出模板功能,可以将模板导出到Excel表格中。模板下可以嵌套的是指标或模板,但是模板的最底层必定是指标。然而...
以下是对Apache POI 3.10在Excel导入导出方面的一些关键知识点的详细说明: 1. **工作簿(Workbook)**:这是Apache POI中表示Excel文件的核心对象。对于.BIFF8格式,使用HSSFWorkbook,而对于.OOXML格式,使用...
POI 3.5 API文档是该库的一个版本,提供了开发者在Java环境中读取、写入和操作这些文件的接口和类的详细说明。这个API文档包含了对类、方法、接口和异常的描述,帮助开发者理解如何有效地使用Apache POI。 在POI ...
下面是一个使用POI创建简单Excel文件的例子: ```java import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.*; public class ExcelCreationExample { public ...
在这个场景中,提到的“java docx 转 html XHTMLOptions等方法jar包”很可能是指使用Apache POI库中的XHTMLConverter,配合XHTMLOptions和FileImageExtractor类来完成转换。下面将详细讲解这些关键知识点。 首先,...
以下是对POI-3.0版本中主要功能和API的详细说明: 1. **HSSF和XSSF**: POI提供了两个主要的接口来处理Excel文件,HSSF用于处理旧版的BIFF格式(Excel 97-2007),而XSSF则是用于处理较新的OOXML格式(Excel 2007及...
标题"ExcelPOI.zip"暗示了这个压缩包中包含的是一个使用Apache POI库处理Excel文件的示例项目。Apache POI提供了API,使得Java开发者能够高效地读取、写入Excel文件,这在处理大量数据时尤其有用。"支持2007版本....