`
wenhai_zhang
  • 浏览: 185865 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[转]Apache POI简单说明

    博客分类:
  • java
 
阅读更多

最近项目上需要用到操作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文档大概如下:

生成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工具类的实现,超简单实用

    本文将深入讲解如何使用Apache POI创建一个简单的Excel导出工具类。 1. **安装与引入Apache POI** 在开始之前,你需要在项目中添加Apache POI的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ...

    poi 动态修改docx窗体域内容,并存为doc格式,节点操作

    在IT行业中,尤其是在文档处理和自动化生成领域,Apache POI是一个非常重要的库,它允许开发者使用Java来操作Microsoft Office格式的文件,如Word(.doc/.docx)、Excel(.xls/.xlsx)等。本教程将专注于如何使用...

    POI 官方API大全及基本操作实例(含jar包)

    8. **API文档**:apidocs 文件夹通常包含详细的Javadoc,它是了解POI库各个类和方法的官方参考,提供了完整的接口描述、参数说明和使用示例。 学习和实践这些API,结合提供的jar包,你将能够高效地实现Java与Excel...

    poi 使 用 方 法

    Apache POI 是一个开源库,...综上所述,Apache POI 提供了全面的 API,使得在 Java 中处理 Excel 文件变得简单易行。通过熟练掌握这些使用方法,开发者可以方便地进行数据的导入导出、报告生成、数据分析等多种任务。

    POI安装指导

    安装完成后,可以通过编写简单的Java代码来测试是否能够成功导入和使用Apache POI库。例如,创建一个Excel文件并写入数据: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf....

    poi excel加密

    总之,Apache POI库为Java开发者提供了处理Excel加密的强大工具,使得在程序中读取、写入加密Excel文件变得简单易行。通过理解加密原理和使用Apache POI的相关API,我们可以确保数据的安全性,同时实现高效的数据...

    poi3.11-jar包

    Apache POI 是一个开源项目,由Apache软件基金会开发,它提供了Java API,使得开发者能够创建、修改和显示Microsoft Office格式的文件,如Word(.doc)、Excel(.xls)和PowerPoint(.ppt)。"poi3.11-jar包"指的是...

    java POI 详解

    使用 POI 创建 Excel 文件非常简单,只需要创建一个 HSSFWorkbook 对象,然后使用 FileOutputStream 写入文件。 ```java import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi....

    POI简单使用

    Apache POI 简单使用指南 Apache POI 是 Apache 软件基金会的开源项目,提供 API 给 Java 程序对 Microsoft Office 格式档案读和写的功能。.NET 的开发人员则可以利用 NPOI (POI for .NET) 来存取 Microsoft Office...

    java利用poi生成word

    以下是一个简单的步骤概述,说明如何使用Apache POI生成Word文档: 1. 引入Apache POI依赖:首先,你需要在项目中添加Apache POI的依赖库。如果是Maven项目,可以在pom.xml中添加对应的依赖项;如果是其他构建工具...

    POI读取excel的内容.zip

    `maven引入poi.txt`文件可能包含了上述Maven依赖的添加说明,确保开发者正确配置了项目以便使用Apache POI库。 总之,Apache POI提供了一套强大的API,使得在Java中处理Excel文件变得简单。通过学习和理解`...

    POI到处excel文件

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel。在这个场景中,"POI到处excel文件"意味着我们使用Apache POI库来创建、读取和修改Excel文档。以下是对这个主题的详细说明: ...

    POI技术使用说明

    一、文档总体说明 POI技术是Apache软件基金会下的一个开源项目,主要目的是提供一套API,使得Java开发者能够处理Microsoft Office格式的文件,包括Excel、Word、PowerPoint等。通过POI,我们可以读取、创建、修改...

    POI导出Tree结构数据(连接线).doc

    一、问题描述及现象需求说明 在效果评估系统中,存在指标管理和模板管理两个模块。模板管理中有一个导出模板功能,可以将模板导出到Excel表格中。模板下可以嵌套的是指标或模板,但是模板的最底层必定是指标。然而...

    poi 3.10 Excel导入导出工具包含文档

    以下是对Apache POI 3.10在Excel导入导出方面的一些关键知识点的详细说明: 1. **工作簿(Workbook)**:这是Apache POI中表示Excel文件的核心对象。对于.BIFF8格式,使用HSSFWorkbook,而对于.OOXML格式,使用...

    poi3.5API文档

    POI 3.5 API文档是该库的一个版本,提供了开发者在Java环境中读取、写入和操作这些文件的接口和类的详细说明。这个API文档包含了对类、方法、接口和异常的描述,帮助开发者理解如何有效地使用Apache POI。 在POI ...

    POI 中文学习文档(.doc)

    下面是一个使用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包

    在这个场景中,提到的“java docx 转 html XHTMLOptions等方法jar包”很可能是指使用Apache POI库中的XHTMLConverter,配合XHTMLOptions和FileImageExtractor类来完成转换。下面将详细讲解这些关键知识点。 首先,...

    poi-3.0 jar包和简单实例

    以下是对POI-3.0版本中主要功能和API的详细说明: 1. **HSSF和XSSF**: POI提供了两个主要的接口来处理Excel文件,HSSF用于处理旧版的BIFF格式(Excel 97-2007),而XSSF则是用于处理较新的OOXML格式(Excel 2007及...

    ExcelPOI.zip

    标题"ExcelPOI.zip"暗示了这个压缩包中包含的是一个使用Apache POI库处理Excel文件的示例项目。Apache POI提供了API,使得Java开发者能够高效地读取、写入Excel文件,这在处理大量数据时尤其有用。"支持2007版本....

Global site tag (gtag.js) - Google Analytics