@SuppressWarnings("serial") public static void main(String[] args) throws Exception { // 模板文件路径 String templatePath = "/Users/lijun/Downloads/work/房产评估/outFile.doc"; // 生成的文件路径 String targetPath = "/Users/lijun/Downloads/work/房产评估/target.docx"; // 书签名 String bmImage = "place_image"; String bmTable = "table_test"; // 图片路径 String imagePath = "/Users/lijun/Documents/workspace1/portal_assess/src/main/webapp/static/images/2.jpg"; // 载入模板文件 WordprocessingMLPackage template = getTemplate(templatePath); // WordprocessingMLPackage.load(new FileInputStream(templatePath)); // 提取正文 MainDocumentPart mainDocumentPart = template.getMainDocumentPart(); Document wmlDoc = (Document) mainDocumentPart.getJaxbElement(); Body body = wmlDoc.getBody(); List<Object> texts = getAllElementFromObject(template.getMainDocumentPart(), Text.class); //Map<String,String> map = new HashMap<String,String>(); searchAndReplace(texts, new HashMap<String, String>(){ { this.put("${project.user}", "李俊"); this.put("${project.name}", "蜀山新村2幢202"); this.put("${project.no}", "房子No201703780011"); // this.put("${one_here_and}", "Firstname"); // this.put("${one}", "ChildA"); // this.put("${two}", "ChildB"); // this.put("${three}", "ChildC"); } @Override public String get(Object key) { return super.get(key); } }); List<String[]> tbl = new ArrayList<String[]>(); tbl.add(new String[]{"估价对象及可比实例修正项目","估价对象","可比实例A","可比实例B","可比实例c"}); tbl.add(new String[]{"建筑面积","95","120","86","96"}); tbl.add(new String[]{"楼层","2","1","4","3"}); replaceTable(template,"${table}",tbl); // 提取正文中所有段落 List<Object> paragraphs = body.getContent(); // 提取书签并创建书签的游标 RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange"); new TraversalUtil(paragraphs, rt); for (CTBookmark bm:rt.getStarts()) { //这儿可以对单个书签进行操作,也可以用一个map对所有的书签进行处理 if (bm.getName().equals(bmImage)){ insertImageAtBookmark(template,imagePath,bm); }else if (bm.getName().equals(bmTable)){ // insertTableAtBookmark(template,tbl,bm); } } template.save(new FileOutputStream(targetPath)); }