处理思路:
- 将word模板以xml格式另存一份,得到xml格式模板
- 在xml 文件中,使用freemark标签,替换一些自定义值
- 使用freemark 解析xml ,输出到.doc 文件
- 在处理的时候要把文件后缀改成.ftl格式
- 获得自定义内容的word文件
案列资源:
https://download.csdn.net/download/csdn_heliu/10881778
实际操作:
word模板:
另存为xml文件,修改后缀名为.ftl格式(ftl文件是使用freemark标签处理过的,已经替换自定义内容,用idea或者eclipse处理太卡了,在外面用编辑器处理的)
实际代码实现:
public static void main(String[] args) { //定义一个集合存放的是学生信息 List<Student> studentList = new ArrayList<>(); //学生A Student a = new Student(); a.setName("学生A"); a.setSex("男"); a.setAge(18); a.setPhone("18856652121"); a.setAddress("安徽省合肥市"); studentList.add(a); //学生B Student b = new Student(); b.setName("学生B"); b.setSex("女"); b.setAge(80); b.setPhone("18856654444"); b.setAddress("美国加州"); studentList.add(b); //学生C Student c = new Student(); c.setName("学生C"); c.setSex("女"); c.setAge(19); c.setPhone("18856652121"); c.setAddress("江苏浙江"); studentList.add(c); //把学生信息放到map里 Map<String, Object> params = new HashMap<>(); params.put("studentList", studentList); //标题 params.put("title", "高三(3)班"); logger.info("params:{}", params); //生成自定义内容word String resultFilePath = String.format("D:/edu/test_%s.doc", "高三(3)班"); FreeMakerParser.process("templates/test.ftl", resultFilePath, params); }
解析xml输出到.doc文件中—生成word文档时使用的方法:
/** * @Description 解析xml输出到.doc文件中—生成word文档时使用 * @author HeLiu * @date 2018/12/27 17:07 */ public static String process(String templateFilePath, String resultFilePath, Map param) { CONFIGURER.setDefaultEncoding("UTF-8");// 设置默认编码方式 try { InputStream is = FreeMakerParser.class.getClassLoader().getResourceAsStream(templateFilePath); if (null == is) { logger.info(".............InputStream is null.........."); } File targetFile = FileToolUtil.createNewFile(resultFilePath); Writer resultFileWriter = new OutputStreamWriter(new FileOutputStream(targetFile), "utf-8"); Reader templateFileReader = new InputStreamReader(is, "utf-8"); Template template = createTemplate(DEFAULT_TEMPLATE_EXPRESSION, templateFileReader); template.process(param, resultFileWriter); logger.info(".............freemark文件解析完成,生成word成功,文件路径:" + targetFile + "!.........."); return resultFilePath; } catch (Exception e) { logger.error("freemark解析异常", e); return null; } }
创建文件方法:
/** * @Description 创建新文件,有目录则先生成目录 * @author HeLiu * @date 2018/12/27 17:17 */ public static File createNewFile(String pathFileName) throws IOException { File outFile = new File(pathFileName); File parentFile = outFile.getParentFile(); if (parentFile != null && !parentFile.exists()) { boolean ret = parentFile.mkdirs();//不存在则创建父目录 logger.info("......创建 {},目录结果:{}", parentFile.getAbsolutePath(), ret); } if (!outFile.exists()) { outFile.createNewFile(); } return outFile; }
xml文件修改思路:
这里用到了freemarker插值的方法—${title},
freemarker循环list使用方法—<#list studentList as bean>
${bean.object}
</#list>
具体freemarker标签使用方法可以自己详细查询一下
重复的版块可以用循环生成,在处理的时候要把多余的标签内容删除掉
下面是修改的地方部分代码:
//修改标题 <w:t>${title}</w:t> //修改表格生成内容 <#list studentList as bean> <w:tr w:rsidR="00E5798D" w:rsidTr="00E5798D"> <w:trPr> <w:trHeight w:val="652"/> </w:trPr> <w:tc> <w:tcPr> <w:tcW w:w="1746" w:type="dxa"/> <w:vAlign w:val="center"/> </w:tcPr> <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D" w:rsidP="00E5798D"> <w:pPr> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia"/> <w:sz w:val="24"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/> <w:sz w:val="24"/> </w:rPr> <w:t>${bean.name}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1746" w:type="dxa"/> <w:vAlign w:val="center"/> </w:tcPr> <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D" w:rsidP="00E5798D"> <w:pPr> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia"/> <w:sz w:val="24"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/> <w:sz w:val="24"/> </w:rPr> <w:t>${bean.sex}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1746" w:type="dxa"/> <w:vAlign w:val="center"/> </w:tcPr> <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D" w:rsidP="00E5798D"> <w:pPr> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia"/> <w:sz w:val="24"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/> <w:sz w:val="24"/> </w:rPr> <w:t>${bean.age}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1747" w:type="dxa"/> <w:vAlign w:val="center"/> </w:tcPr> <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D" w:rsidP="00E5798D"> <w:pPr> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia"/> <w:sz w:val="24"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/> <w:sz w:val="24"/> </w:rPr> <w:t>${bean.phone}</w:t> </w:r> </w:p> </w:tc> <w:tc> <w:tcPr> <w:tcW w:w="1747" w:type="dxa"/> <w:vAlign w:val="center"/> </w:tcPr> <w:p w:rsidR="00E5798D" w:rsidRPr="00E5798D" w:rsidRDefault="0045179D" w:rsidP="00E5798D"> <w:pPr> <w:jc w:val="center"/> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia"/> <w:sz w:val="24"/> </w:rPr> </w:pPr> <w:r> <w:rPr> <w:rFonts w:asciiTheme="minorEastAsia" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorEastAsia" w:hint="eastAsia"/> <w:sz w:val="24"/> </w:rPr> <w:t>${bean.address}</w:t> </w:r> </w:p> </w:tc> </w:tr> </#list>
pom依赖:
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency>
运行结果:在定义的路径下有个新生成的word文件
总结:利用freemarker标签修改xml文件的时候要细心,不能写错,不能删错标签,不然都会导致word文件生成失败。文件一定要修改为ftl格式。