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; }@
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); } } }@
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; } @
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)