Docx4J操作word文档

Docx4j操作Word

首先准备好事先的word模版,便于java结合Docx4j操作word中的内容,针对修改word中表格的内容,步骤如下:

1、首先加载word文件

wordMLPackage =WordprocessingMLPackage.load(new File(path));

2、获取word中所有的表格

@List<Tbl> tableList    =getAllTbl(wordMLPackage);@
           @ 
           /**
             * @Description:得到所有表格
           */
      public List<Tbl> getAllTbl(WordprocessingMLPackage wordMLPackage) {
         MainDocumentPart mainDocPart = wordMLPackage.getMainDocumentPart();
         List<Object> objList = getAllElementFromObject(mainDocPart, Tbl.class);
         if (objList == null) {
            return null;
         }
         List<Tbl> tblList = new ArrayList<Tbl>();
         for (Object obj : objList) {
            if (obj instanceof Tbl) {
                Tbl tbl = (Tbl) obj;
                tblList.add(tbl);
            }
        }
        return tblList;
    }@

     @
       /**
     * 得到指定类型的元素
     * @param obj
     * @param toSearch
     * @return
     */
    public static List<Object> getAllElementFromObject(Object obj,
            Class<?> toSearch) {
        List<Object> result = new ArrayList<Object>();
        if (obj instanceof JAXBElement)
            obj = ((JAXBElement<?>) obj).getValue();
        if (obj.getClass().equals(toSearch))
            result.add(obj);
        else if (obj instanceof ContentAccessor) {
            List<?> children = ((ContentAccessor) obj).getContent();
            for (Object child : children) {
                result.addAll(getAllElementFromObject(child, toSearch));
            }
        }
        return result;
     }@

3、获取单个表格所有的行

       @List<Tr> trList = getTblAllTr(tableList.get(0));(如果是多个表格,操作其所有的行,则使用循环逐个取出多个表格)@
       @     /**
         * @Description: 得到表格所有的行
         */
        public List<Tr> getTblAllTr(Tbl tbl) {
            List<Object> objList = getAllElementFromObject(tbl, Tr.class);
            List<Tr> trList = new ArrayList<Tr>();
            if (objList == null) {
                return trList;
            }
            for (Object obj : objList) {
                if (obj instanceof Tr) {
                    Tr tr = (Tr) obj;
                    trList.add(tr);
                }
            }
            return trList;

        }@
          
Edit

4、对表格中的单元格内容进行处理

       @
                for (Tr tr : trList) 
                {
            //获取所有的单元格
                List<Tc> tcList = getTrAllCell(tr);
                for(Tc tc:tcList)
                {
                    setTcContent(tc,rpr,content);
                }
            }@

       @
        /**
         * Description: 获取所有的单元格
        */
        public List<Tc> getTrAllCell(Tr tr) {
        List<Object> objList = getAllElementFromObject(tr, Tc.class);
        List<Tc> tcList = new ArrayList<Tc>();
        if (objList == null) {
            return tcList;
        }
        for (Object tcObj : objList) {
            if (tcObj instanceof Tc) {
                Tc objTc = (Tc) tcObj;
                tcList.add(objTc);
            }
        }
        return tcList;
      }@

      @  
         /**
          * Description:设置单元格内容
          */
         public void setTcContent(Tc tc, RPr rpr, String content) {
         List<Object> pList = tc.getContent();
         P p = null;
         if (pList != null && pList.size() > 0) {
            if (pList.get(0) instanceof P) {
                p = (P) pList.get(0);
            }
        } else {
            p = new P();
            tc.getContent().add(p);
        } 
        //获取段落的内容
        String tContent=this.getElementContent(p);
        R run = new R();
        p.getContent().add(run);
        if (content != null) {
            String[] contentArr = content.split("\n");
            Text text = new Text();

            //清除获取单元格的内容
            p.getContent().clear();
            p.getContent().add(run);
            text.setSpace("preserve");
            //设置单元格中的值
            text.setValue(contentArr[0]);
            run.getContent().add(text);    
            }

        }
    }@
    
Edit

5、在段落中插入图片

       @ P pWithImage= addInlineImageToParagraph(createInlineImage(imagePath));@
      @
       private static P addInlineImageToParagraph(Inline inline) {  
        ObjectFactory factory = new ObjectFactory();  
        P paragraph = factory.createP();  
        R run = factory.createR();  
        paragraph.getContent().add(run);  
        Drawing drawing = factory.createDrawing();  
        run.getContent().add(drawing);  
        drawing.getAnchorOrInline().add(inline);  
        return paragraph;  
    }  

    /** 
     * 使用给定的文件创建一个内联图片. 
     * 我们将文件转换成字节数组, 并用它创建一个内联图片. 
     * 
     * @param file 
     * @return 
     * @throws Exception 
     */  
    private static Inline createInlineImage(File file) throws Exception {  
        byte[] bytes = convertImageToByteArray(file);  

        BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);  

        int docPrId = 1;  
        int cNvPrId = 2;  

        return imagePart.createImageInline("Filename hint", "Alternative text", docPrId, cNvPrId, false);  
    }  

    /** 
     * 将图片从文件转换成字节数组. 
     * 
     * @param file 
     * @return 
     * @throws FileNotFoundException 
     * @throws IOException 
     */  
    private static byte[] convertImageToByteArray(File file) throws FileNotFoundException, IOException {  
        InputStream is = new FileInputStream(file );  
        long length = file.length();  
        if (length > Integer.MAX_VALUE) {  
            System.out.println("File too large!!");  
        }  
        byte[] bytes = new byte[(int)length];  
        int offset = 0;  
        int numRead = 0;  
        while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {  
            offset += numRead;  
        }  
        if (offset < bytes.length) {  
            System.out.println("Could not completely read file "+file.getName());  
        }  
        is.close();  
        return bytes;  
     }  
     @
   
Edit

6、另存为新的docx文件

    @ this.saveWordPackage(wordMLPackage, new File(路径名));@

        @ /**
          * 保存docx为新模版
          */
      public void saveWordPackage(WordprocessingMLPackage wordPackage, File file)
            throws Exception {
        wordPackage.save(file);
      }
    @
   
(摘自http://www.cnblogs.com/cuizhf/p/5837363.html,感谢博主提供,依赖的jar包地址:https://pan.baidu.com/s/1i4KAR2H)
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值