Apache POI XWPF 特定位置插入表格段落图片

Posted JackMa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache POI XWPF 特定位置插入表格段落图片相关的知识,希望对你有一定的参考价值。

转载地址: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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于Apache POI XWPF 特定位置插入表格段落图片的主要内容,如果未能解决你的问题,请参考以下文章

我想用POI在Word里插入一张图片,这是我的测试代码。执行之后word打不开!错误如图中的提示

POI相关使用以及复杂表格读取

java poi xwpf操作word生成一个表格怎么合并单元格,求大神指导!

java word转html 报错 org/apache/poi/xwpf/usermodel/IRunBody

在 Java 中使用 Apache POI XWPF 在 Word 文档中的横向/纵向之间切换

poi根据模版生成多页word,并压缩下载