zoukankan      html  css  js  c++  java
  • 【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如下:

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

  • 相关阅读:
    [课程设计]Scrum 1.6 多鱼点餐系统开发进度
    [课程设计]Scrum 1.7 多鱼点餐系统开发进度
    [课程设计]Scrum 1.5 多鱼点餐系统开发进度
    [课程设计]Scrum 1.4 多鱼点餐系统开发进度
    [课程设计]Scrum 1.3 多鱼点餐系统开发进度
    [课程设计]Scrum 1.2 Spring 计划&系统流程&DayOne燃尽图
    [课程设计]Scrum 1.1 NABCD模型&产品Backlog
    [课程设计]Scrum团队分工及明确任务1.0 ----多鱼点餐
    学习进度条
    [课程设计]多鱼点餐系统个人总结
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/5673124.html
Copyright © 2011-2022 走看看