【POI word】使用POI实现对Word的读取以及生成

项目结构如下:

第一部分:先是读取Word文档

  1 package com.it.WordTest;
  2 
  3 import java.io.FileInputStream;
  4 import java.io.FileNotFoundException;
  5 import java.io.FileOutputStream;
  6 import java.io.FileWriter;
  7 import java.io.IOException;
  8 import java.io.Writer;
  9 import java.util.Date;
 10 import java.util.List;
 11 
 12 import org.apache.poi.POIXMLProperties.CoreProperties;
 13 import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
 14 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 15 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 16 import org.apache.poi.xwpf.usermodel.XWPFTable;
 17 import org.apache.poi.xwpf.usermodel.XWPFTableCell;
 18 import org.apache.poi.xwpf.usermodel.XWPFTableRow;
 19 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
 20 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
 21 
 22 /**
 23  * 读取docx文件
 24  * @author Administrator
 25  *POI在读写word docx文件时是通过xwpf模块来进行的,其核心是XWPFDocument。一个XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档。
 26  *XWPFDocument中主要包含下面这几种对象:
 27  *XWPFParagraph:代表一个段落。
 28  *XWPFRun:代表具有相同属性的一段文本。
 29  *XWPFTable:代表一个表格。
 30  *XWPFTableRow:表格的一行。
 31  *XWPFTableCell:表格对应的一个单元格。
 32  */
 33 public class ReadWord {
 34     
 35     /**
 36      * 通过XWPFWordExtractor读取word文档
 37      * 只能获取到文本,不能获取到文本对应的属性值
 38      */
 39     public static void readByXWPFWordExtractor(){
 40         try {
 41             FileInputStream input = new FileInputStream("f:/test/肥胖早知道模板.docx");
 42             XWPFDocument doc = new XWPFDocument(input);
 43             XWPFWordExtractor docE = new XWPFWordExtractor(doc);
 44             String  text = docE.getText();
 45             //将读取到文档中的文本信息,存放在一个txt文件中
 46             FileWriter write = new FileWriter("f:/test/肥胖早知道的文本信息.txt");
 47             write.write(text);
 48             write.close();
 49             
 50             //获取文档的附属信息
 51             CoreProperties coreP = docE.getCoreProperties();
 52             //打印文档的分类信息
 53             System.out.println(coreP.getCategory());
 54             //打印创建者信息
 55             System.out.println(coreP.getCreator());
 56             //打印创建时间
 57             System.out.println(coreP.getCreated());
 58             //打印标题
 59             System.out.println(coreP.getTitle());
 60             
 61             input.close();
 62         } catch (FileNotFoundException e) {
 63             e.printStackTrace();
 64         } catch (IOException e) {
 65             e.printStackTrace();
 66         }
 67     }
 68     
 69     /**
 70      * 通过XWPFDocument读取word文档
 71      * 通过XWPFDocument读取docx文档时,我们就可以获取到文本比较精确的属性信息了。比如我们可以获取到某一个XWPFParagraph、XWPFRun或者是某一个XWPFTable,包括它们对应的属性信息
 72      */
 73     public static void readByXWPFDocument(){
 74         Date data = new Date();
 75         try {
 76             FileInputStream inputStream = new FileInputStream("f:/test/肥胖早知道模板.docx");
 77             XWPFDocument doc =new XWPFDocument(inputStream);
 78             //获取所有段落
 79             List<XWPFParagraph> list = doc.getParagraphs();
 80             FileWriter writer = new FileWriter("f:/test/肥胖早知道 带属性.txt");
 81             StringBuffer str = new StringBuffer();
 82             for (XWPFParagraph xwpfParagraph : list) {
 83                 //获取当前段落的属性
 84                 CTPPr CPPR = xwpfParagraph.getCTP().getPPr();
 85                 str.append(xwpfParagraph.getText());
 86             }
 87             writer.write(str.toString());
 88             
 89             //获取多有table
 90             List<XWPFTable> tableList = doc.getTables();
 91             List<XWPFTableRow> rowList;
 92             List<XWPFTableCell> cellList;
 93             StringBuilder build = new StringBuilder();
 94             for (XWPFTable xwpfTable : tableList) {
 95                 //获取表格信息
 96                 CTTblPr  tablePer = xwpfTable.getCTTbl().getTblPr();
 97                 //获取表格相对应的行
 98                 rowList =xwpfTable.getRows();
 99                 for (XWPFTableRow xwpfTableRow : rowList) {
100                     cellList = xwpfTableRow.getTableCells();
101                     for (XWPFTableCell xwpfTableCell : cellList) {
102                         build.append("【单元格信息】:"+xwpfTableCell.getText()+"
");
103                     }
104                 }
105             }
106             writer.append(build);
107             writer.close();
108             
109             
110             inputStream.close();
111             
112             Date date2 = new Date();
113             System.out.println("消耗时间:"+(date2.getTime()-data.getTime())+"ms");
114         } catch (FileNotFoundException e) {
115             e.printStackTrace();
116         } catch (IOException e) {
117             e.printStackTrace();
118         }
119     }
120     
121     public static void main(String[] args) {
122         //readByXWPFWordExtractor();
123         readByXWPFDocument();
124     }
125 }
View Code

在读取到word的附属信息,会在控制台打印如下:

第二部分:生成Word

  1 package com.it.WordTest;
  2 
  3 import java.io.FileNotFoundException;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.math.BigInteger;
  7 import java.util.List;
  8 
  9 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 10 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 11 import org.apache.poi.xwpf.usermodel.XWPFRun;
 12 import org.apache.poi.xwpf.usermodel.XWPFTable;
 13 import org.apache.poi.xwpf.usermodel.XWPFTableCell;
 14 import org.apache.poi.xwpf.usermodel.XWPFTableRow;
 15 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
 16 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
 17 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
 18 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
 19 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTrPr;
 20 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
 21 
 22 public class WriteWord {
 23     
 24     public static void writeXWPFDocument(){
 25         
 26         try {
 27             //创建一个word文档
 28             XWPFDocument xwpfDocument = new XWPFDocument();
 29             FileOutputStream outputStream  = new FileOutputStream("F:/test/word1.docx");
 30             /**
 31              * 创建一个段落
 32              */
 33             XWPFParagraph paragraph = xwpfDocument.createParagraph();
 34             XWPFRun run = paragraph.createRun();
 35             run.setText("德玛西亚!!");
 36             //加粗
 37             run.setBold(true);
 38             
 39             run = paragraph.createRun();
 40             run.setText("艾欧尼亚");
 41             run.setColor("fff000");
 42             
 43             
 44             /**
 45              * 创建一个table
 46              */
 47             //创建一个10行10列的表格
 48             XWPFTable table =xwpfDocument.createTable(10, 10);
 49             //添加新的一列
 50             table.addNewCol();
 51             //添加新的一行
 52             table.createRow();
 53             //获取表格属性
 54             CTTblPr tablePr = table.getCTTbl().addNewTblPr();
 55             //获取表格宽度
 56             CTTblWidth tableWidth = tablePr.addNewTblW();
 57             //设置表格的宽度大小
 58             tableWidth.setW(BigInteger.valueOf(8000));
 59             
 60             /**
 61              * 获取表格中的行  以及设计行样式
 62              */
 63             //获取表格中的所有行
 64             List<XWPFTableRow> rowList = table.getRows();
 65             XWPFTableRow row;
 66             row = rowList.get(0);
 67             row.setHeight(2000);
 68             //为这一行增加一列
 69             row.addNewTableCell();
 70             //获取行属性
 71             CTTrPr rowPr = row.getCtRow().addNewTrPr();
 72             row.getCtRow();
 73             
 74             /**
 75              * 获取表格中的列  以及设计列样式
 76              */
 77             //获取某个单元格
 78             XWPFTableCell cell ;
 79             cell = row.getCell(0);
 80             cell.setText("第一行
第一列");
 81             //单元格背景颜色
 82             cell.setColor("676767");
 83             //获取单元格样式
 84             CTTcPr cellPr = cell.getCTTc().addNewTcPr();
 85             //表格内容垂直居中
 86             cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
 87             //设置单元格的宽度
 88             cellPr.addNewTcW().setW(BigInteger.valueOf(5000));
 89             
 90             
 91             xwpfDocument.write(outputStream);
 92             outputStream.close();
 93             
 94         } catch (FileNotFoundException e) {
 95             e.printStackTrace();
 96         } catch (IOException e) {
 97             e.printStackTrace();
 98         }
 99     }
100     public static void main(String[] args) {
101         writeXWPFDocument();
102     }
103 }
View Code

生成word如下:

唯一的感觉就是 功能实现的太简单,没有涉及到核心的部分,感觉 不美丽!!!

原文地址:https://www.cnblogs.com/sxdcgaq8080/p/5673124.html