處理思路:
- 將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格式。