转载地址:https://www.jianshu.com/p/de58ab550157
特定位置插入表格、段落、图片
思路
在word中做个标记,通常这个标记独自占据一个段落,例如
具体方法是,获取这个段落,然后得到一个
newXMLCursor
,然后用这个游标插入表格、段落、图片。代码如下
- 插入段落
1 public static void main(String[] args) throws IOException, InvalidFormatException { 2 String filepath = "D:\\users\\IDEA\\POIUtils\\doc\\测试文档.docx"; 3 String destpath = "D:\\users\\IDEA\\POIUtils\\doc\\测试文档_result.docx"; 4 5 OPCPackage opcPackage = POIXMLDocument.openPackage(filepath); 6 XWPFDocument xwpfDocument = new XWPFDocument(opcPackage); 7 List<XWPFParagraph> xwpfParas = xwpfDocument.getParagraphs(); 8 int num=0; 9 for(int i=0;i<xwpfParas.size();i++){ 10 if(num==3) break; 11 XWPFParagraph xwpfParagraph = xwpfParas.get(i); 12 String text=xwpfParagraph.getText(); 13 14 //插入段落 15 if(text.equals("${mark_newParagraph}")){ 16 XmlCursor cursor = xwpfParagraph .getCTP().newCursor(); 17 XWPFParagraph newPara = xwpfDocument.insertNewParagraph(cursor); 18 newPara.setAlignment(ParagraphAlignment.BOTH);//两端对齐 19 newPara.setIndentationFirstLine(480);//首行缩进24磅 20 XWPFRun newParaRun = newPara.createRun(); 21 newParaRun.setText("这是新插入的段落!"); 22 newParaRun.setFontFamily("宋体"); 23 newParaRun.setFontSize(12); 24 newParaRun.setBold(false); 25 xwpfDocument.removeBodyElement(xwpfDocument.getPosOfParagraph(xwpfParagraph)); 26 } 27 28 //插入表格 29 if(text.equals("${mark_newTable}")){ 30 XmlCursor cursor= xwpfParagraph.getCTP().newCursor(); 31 XWPFTable table = xwpfDocument.insertNewTbl(cursor); 32 33 XWPFTableRow row_0 = table.getRow(0); 34 row_0.getCell(0).setText("姓名"); 35 row_0.addNewTableCell().setText("年龄"); 36 37 XWPFTableRow row_1 = table.createRow(); 38 row_1.getCell(0).setText("隔壁老王"); 39 row_1.getCell(1).setText("48"); 40 41 setTableLocation(table,"center"); 42 setCellLocation(table,"CENTER","center"); 43 xwpfDocument.removeBodyElement(xwpfDocument.getPosOfParagraph(xwpfParagraph)); 44 } 45 46 //插入图片 47 if(text.equals("${mark_newPicture}")){ 48 49 XmlCursor cursor = xwpfParagraph .getCTP().newCursor(); 50 XWPFParagraph newPara = xwpfDocument.insertNewParagraph(cursor); 51 newPara.setAlignment(ParagraphAlignment.CENTER);//居中 52 XWPFRun newParaRun = newPara.createRun(); 53 newParaRun.addPicture(new FileInputStream("./doc/bus.png"),XWPFDocument.PICTURE_TYPE_PNG,"bus.png,",Units.toEMU(200), Units.toEMU(200)); 54 xwpfDocument.removeBodyElement(xwpfDocument.getPosOfParagraph(xwpfParagraph)); 55 } 56 } 57 58 write(xwpfDocument,destpath); 59 } 60 61 62 /** 63 * 设置单元格水平位置和垂直位置 64 * 65 * @param xwpfTable 66 * @param verticalLoction 单元格中内容垂直上TOP,下BOTTOM,居中CENTER,BOTH两端对齐 67 * @param horizontalLocation 单元格中内容水平居中center,left居左,right居右,both两端对齐 68 */ 69 public static void setCellLocation(XWPFTable xwpfTable, String verticalLoction, String horizontalLocation) { 70 List<XWPFTableRow> rows = xwpfTable.getRows(); 71 for (XWPFTableRow row : rows) { 72 List<XWPFTableCell> cells = row.getTableCells(); 73 for (XWPFTableCell cell : cells) { 74 CTTc cttc = cell.getCTTc(); 75 CTP ctp = cttc.getPList().get(0); 76 CTPPr ctppr = ctp.getPPr(); 77 if (ctppr == null) { 78 ctppr = ctp.addNewPPr(); 79 } 80 CTJc ctjc = ctppr.getJc(); 81 if (ctjc == null) { 82 ctjc = ctppr.addNewJc(); 83 } 84 ctjc.setVal(STJc.Enum.forString(horizontalLocation)); //水平居中 85 cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.valueOf(verticalLoction));//垂直居中 86 } 87 } 88 } 89 90 /** 91 * 设置表格位置 92 * 93 * @param xwpfTable 94 * @param location 整个表格居中center,left居左,right居右,both两端对齐 95 */ 96 public static void setTableLocation(XWPFTable xwpfTable, String location) { 97 CTTbl cttbl = xwpfTable.getCTTbl(); 98 CTTblPr tblpr = cttbl.getTblPr() == null ? cttbl.addNewTblPr() : cttbl.getTblPr(); 99 CTJc cTJc = tblpr.addNewJc(); 100 cTJc.setVal(STJc.Enum.forString(location)); 101 }
实验结果
特定位置插入表格、段落、图片
- 思路
在word中做个标记,通常这个标记独自占据一个段落,例如
标记示例
我们想要在标记处插入一个表格,一个段落,一幅图片,其中插入段落可以使用上话提到的文本替换方式,也可以用今天提到的方法。
具体方法是,获取这个段落,然后得到一个newXMLCursor
,然后用这个游标插入表格、段落、图片。代码如下 - 插入段落
public static void main(S
作者:Pantheon
链接:https://www.jianshu.com/p/de58ab550157
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。