项目结构如下:
那第一部分:先是读取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()+"\r\n"); 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 }
在读取到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("第一行\r\n第一列"); 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 }
生成word如下:
唯一的感觉就是 功能实现的太简单,没有涉及到核心的部分,感觉 不美丽!!!