POI解析Word中文API

https://yq135314.iteye.com/blog/1538182

POI操作word文档的两个主要模块就是HWPF和XWPF。
HWPF是操作Microsoft Word 97(-2007)文件的标准API入口。它还支持对旧版Word 6和Word 95文件对有限的只读功能。
XWPF是操作Microsoft Word 2007文件的标准API入口。

https://www.cnblogs.com/mh-study/p/9747945.html

https://blog.csdn.net/robinliu2010/article/details/7584173


Poi之Word文档结构介绍

1、poi之word文档结构介绍之正文段落

一个文档包含多个段落,一个段落包含多个Runs,一个Runs包含多个Run,Run是文档的最小单元

获取所有段落:List paragraphs = word.getParagraphs();

获取一个段落中的所有Runs:List xwpfRuns = xwpfParagraph.getRuns();

获取一个Runs中的一个Run:XWPFRun run = xwpfRuns.get(index);

2、poi之word文档结构介绍之正文表格

一个文档包含多个表格,一个表格包含多行,一行包含多列(格),每一格的内容相当于一个完整的文档

获取所有表格:List xwpfTables = doc.getTables();

获取一个表格中的所有行:List xwpfTableRows = xwpfTable.getRows();

获取一行中的所有列:List xwpfTableCells = xwpfTableRow.getTableCells();

获取一格里的内容:List paragraphs = xwpfTableCell.getParagraphs();

之后和正文段落一样

注:

  1. 表格的一格相当于一个完整的docx文档,只是没有页眉和页脚。里面可以有表格,使用xwpfTableCell.getTables()获取,and so on
  2. 在poi文档中段落和表格是完全分开的,如果在两个段落中有一个表格,在poi中是没办法确定表格在段落中间的。(当然除非你本来知道了,这句是废话)。只有文档的格式固定,才能正确的得到文档的结构

3、poi之word文档结构介绍之页眉:

一个文档可以有多个页眉(不知道怎么会有多个页眉。。。),页眉里面可以包含段落和表格

获取文档的页眉:List headerList = doc.getHeaderList();

获取页眉里的所有段落:List paras = header.getParagraphs();

获取页眉里的所有表格:List tables = header.getTables();

之后就一样了

4、poi之word文档结构介绍之页脚:

页脚和页眉基本类似,可以获取表示页数的角标

 
 


 
 

https://elim.iteye.com/blog/2049110

POI在读写word docx文件时是通过xwpf模块来进行的,其核心是XWPFDocument。一个XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档。XWPFDocument中主要包含下面这几种对象:

l XWPFParagraph:代表一个段落。

l XWPFRun:代表具有相同属性的一段文本。

l XWPFTable:代表一个表格。

l XWPFTableRow:表格的一行。

l XWPFTableCell:表格对应的一个单元格。

1 读docx文件
跟读doc文件一样,POI在读docx文件的时候也有两种方式,通过XWPFWordExtractor和通过XWPFDocument。在XWPFWordExtractor读取信息时其内部还是通过XWPFDocument来获取的。

1.1 通过XWPFWordExtractor读
在使用XWPFWordExtractor读取docx文档的内容时,我们只能获取到其文本,而不能获取到其文本对应的属性值。下面是一段使用XWPFWordExtractor来读取docx文档内容的示例代码:

public class XwpfTest {  
   
   /** 
    * 通过XWPFWordExtractor访问XWPFDocument的内容 
    * @throws Exception 
    */  
   @Test  
   public void testReadByExtractor() throws Exception {  
      InputStream is = new FileInputStream("D:\\test.docx");  
      XWPFDocument doc = new XWPFDocument(is);  
      XWPFWordExtractor extractor = new XWPFWordExtractor(doc);  
      String text = extractor.getText();  
      System.out.println(text);  
      CoreProperties coreProps = extractor.getCoreProperties();  
      this.printCoreProperties(coreProps);  
      this.close(is);  
   }  
    
   /** 
    * 输出CoreProperties信息 
    * @param coreProps 
    */  
   private void printCoreProperties(CoreProperties coreProps) {  
      System.out.println(coreProps.getCategory());   //分类  
      System.out.println(coreProps.getCreator()); //创建者  
      System.out.println(coreProps.getCreated()); //创建时间  
      System.out.println(coreProps.getTitle());   //标题  
   }  
    
   /** 
    * 关闭输入流 
    * @param is 
    */  
   private void close(InputStream is) {  
      if (is != null) {  
         try {  
            is.close();  
         } catch (IOException e) {  
            e.printStackTrace();  
         }  
      }  
   }  
    
}  

 
 

1.2 通过XWPFDocument读
在通过XWPFDocument读取docx文档时,我们就可以获取到文本比较精确的属性信息了。比如我们可以获取到某一个XWPFParagraph、XWPFRun或者是某一个XWPFTable,包括它们对应的属性信息。下面是一个使用XWPFDocument读取docx文档的示例:

public class XwpfTest {  
   
   /** 
    * 通过XWPFDocument对内容进行访问。对于XWPF文档而言,用这种方式进行读操作更佳。 
    * @throws Exception 
    */  
   @Test  
   public void testReadByDoc() throws Exception {  
      InputStream is = new FileInputStream("D:\\table.docx");  
      XWPFDocument doc = new XWPFDocument(is);  
      List paras = doc.getParagraphs();  
      for (XWPFParagraph para : paras) {  
         //当前段落的属性  
//       CTPPr pr = para.getCTP().getPPr();  
         System.out.println(para.getText());  
      }  
      //获取文档中所有的表格  
      List tables = doc.getTables();  
      List rows;  
      List cells;  
      for (XWPFTable table : tables) {  
         //表格属性  
//       CTTblPr pr = table.getCTTbl().getTblPr();  
         //获取表格对应的行  
         rows = table.getRows();  
         for (XWPFTableRow row : rows) {  
            //获取行对应的单元格  
            cells = row.getTableCells();  
            for (XWPFTableCell cell : cells) {  
                System.out.println(cell.getText());;  
            }  
         }  
      }  
      this.close(is);  
   }  
    
   /** 
    * 关闭输入流 
    * @param is 
    */  
   private void close(InputStream is) {  
      if (is != null) {  
         try {  
            is.close();  
         } catch (IOException e) {  
            e.printStackTrace();  
         }  
      }  
   }  
    
}  

 
 


写Word:
http://doc.okbase.net/oh_Maxy/archive/154764.html

你可能感兴趣的:(POI解析Word中文API)