程序员的公众号:源1024,获取更多资料,无加密无套路!
最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等
获取方式: 关注公众号并回复 666 领取,更多内容持续奉上
以上图片来自AI:Gnomic-智能体平台
添加依赖
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.32</version></dependency>
word文件内容
另存为xml格式,然后修改后缀为ftl,关键模板内容如下:
<w:body><wx:sect><w:p><w:pPr><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="880" w:first-line-chars="200"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="default"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="44"/><w:sz-cs w:val="44"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>Freemarker 合并</w:t></w:r></w:p><w:p><w:pPr><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="480" w:first-line-chars="200"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/><w:lang w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/></w:rPr><w:t>一、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>描述</w:t></w:r></w:p><w:p><w:pPr><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="480" w:first-line-chars="200"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="default"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${desc}</w:t></w:r></w:p><w:p><w:pPr><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="480" w:first-line-chars="200"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:fareast="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/></w:rPr><w:t>二、</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>数据</w:t></w:r></w:p><w:p/><w:p><w:pPr><w:pStyle w:val="a2"/></w:pPr></w:p><w:p><w:pPr><w:spacing w:line="360" w:line-rule="auto"/><w:ind w:first-line="480" w:first-line-chars="200"/><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="default"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:h-ansi="宋体" w:cs="宋体" w:hint="fareast"/><w:sz w:val="24"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>${col?if_exists}</w:t></w:r></w:p><w:tbl><w:tblPr><w:tblW w:w="4955" w:type="dxa"/><w:jc w:val="center"/><w:tblInd w:w="0" w:type="dxa"/><w:tblBorders><w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:insideH w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:insideV w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/></w:tblBorders><w:tblLayout w:type="Fixed"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr><w:tblGrid><w:gridCol w:w="709"/><w:gridCol w:w="1276"/><w:gridCol w:w="1275"/><w:gridCol w:w="1695"/></w:tblGrid><w:tr><w:tblPrEx><w:tblBorders><w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:insideH w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:insideV w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPrEx><w:trPr><w:trHeight w:val="403" w:h-rule="atLeast"/><w:jc w:val="center"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="709" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:adjustRightInd w:val="off"/><w:snapToGrid w:val="off"/><w:spacing w:line="260" w:line-rule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"w:hint="fareast"/><w:b/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz w:val="24"/><w:sz-cs w:val="32"/><w:lang w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"w:hint="fareast"/><w:b/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz w:val="24"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>序号</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1276" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:adjustRightInd w:val="off"/><w:snapToGrid w:val="off"/><w:spacing w:line="260" w:line-rule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"w:hint="fareast"/><w:b/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz w:val="24"/><w:sz-cs w:val="32"/><w:lang w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"w:hint="fareast"/><w:b/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz w:val="24"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>姓名</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1275" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:adjustRightInd w:val="off"/><w:snapToGrid w:val="off"/><w:spacing w:line="260" w:line-rule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"w:hint="fareast"/><w:b/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz w:val="24"/><w:sz-cs w:val="32"/><w:lang w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"w:hint="fareast"/><w:b/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz w:val="24"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>年龄</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1695" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:adjustRightInd w:val="off"/><w:snapToGrid w:val="off"/><w:spacing w:line="260" w:line-rule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"w:hint="fareast"/><w:b/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz w:val="24"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman" w:fareast="楷体_GB2312"w:hint="fareast"/><w:b/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz w:val="24"/><w:sz-cs w:val="32"/><w:lang w:val="EN-US" w:fareast="ZH-CN"/></w:rPr><w:t>成绩</w:t></w:r></w:p></w:tc></w:tr><#assign index = 0><#list colList as col><#if col?is_last><w:tr><w:tblPrEx><w:tblBorders><w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:insideH w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:insideV w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPrEx><w:trPr><w:trHeight w:val="261" w:h-rule="atLeast"/><w:jc w:val="center"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="709" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/><#--合并两列--><w:gridSpan w:val="3"/></w:tcPr><w:p><w:pPr><w:adjustRightInd w:val="off"/><w:snapToGrid w:val="off"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:b/><w:b-cs/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz-cs w:val="21"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:b/><w:b-cs/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz-cs w:val="21"/></w:rPr><#assign index = index + 1><w:t>合计</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1276" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:b/><w:b-cs/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz-cs w:val="21"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:kern w:val="0"/><w:sz-cs w:val="21"/><w:lang w:bidi="AR-SA"/></w:rPr><w:t>${col.score?if_exists}</w:t></w:r></w:p></w:tc></w:tr><#else><w:tr><w:tblPrEx><w:tblBorders><w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:left w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:bottom w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:insideH w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:insideV w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/></w:tblBorders><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPrEx><w:trPr><w:trHeight w:val="261" w:h-rule="atLeast"/><w:jc w:val="center"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="709" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:adjustRightInd w:val="off"/><w:snapToGrid w:val="off"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:b/><w:b-cs/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz-cs w:val="21"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:b/><w:b-cs/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz-cs w:val="21"/></w:rPr><#assign index = index + 1><w:t>${index}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1276" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:b/><w:b-cs/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz-cs w:val="21"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:kern w:val="0"/><w:sz-cs w:val="21"/><w:lang w:bidi="AR-SA"/></w:rPr><w:t>${col.name?if_exists}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1276" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:b/><w:b-cs/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz-cs w:val="21"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:kern w:val="0"/><w:sz-cs w:val="21"/><w:lang w:bidi="AR-SA"/></w:rPr><w:t>${col.age?if_exists}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1276" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/></w:tcPr><w:p><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:b/><w:b-cs/><w:snapToGrid w:val="off"/><w:kern w:val="0"/><w:sz-cs w:val="21"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:h-ansi="Times New Roman"w:fareast="仿宋_GB2312"w:hint="default"/><w:kern w:val="0"/><w:sz-cs w:val="21"/><w:lang w:bidi="AR-SA"/></w:rPr><w:t>${col.score?if_exists}</w:t></w:r></w:p></w:tc></w:tr></#if></#list></w:tbl><w:p><w:pPr><w:pStyle w:val="a2"/></w:pPr></w:p><w:sectPr><w:pgSz w:w="11906" w:h="16838"/><w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992"w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:type="lines" w:line-pitch="312"/></w:sectPr></wx:sect></w:body></w:wordDocument>
关键模板代码说明:
判空:变量为空会报错
${col.score?if_exists}
合并列:
<#if col?is_last> 判断如果是最后一行进行合并
w:gridSpan,合并几列由w:val确定
<w:tcPr><w:tcW w:w="709" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/><w:noWrap w:val="0"/><w:vAlign w:val="center"/><#--合并两列--><w:gridSpan w:val="3"/>
</w:tcPr>
controller:
@Controller
public class FreemarkerController {@GetMapping("/word")public void wordFreemarker(HttpServletResponse response) {HashMap<String, Object> map = new HashMap<>();map.put("desc","这里是描述段落。。。");map.put("col","这里是动态列合并。。。");List<StudentInfo> list = getData();map.put("colList",list);FreeMakerUtil.generate("merge.ftl","word文件",map,response);System.out.println("success");}public List<StudentInfo> getData(){List<StudentInfo> list = new ArrayList<>();list.add(new StudentInfo("一班","李白","12",99));list.add(new StudentInfo("一班","阿珂","11",98));list.add(new StudentInfo("一班","剑圣","13",100));list.add(new StudentInfo("一班","药神","11",99));int sum = list.stream().mapToInt(StudentInfo::getScore).sum();list.add(new StudentInfo("","","",sum));return list;}
}
工具类
@Slf4j
public class FreeMakerUtil {public static void generate(String templateName, String fileName, Map<String,Object> dataMap, HttpServletResponse response) {//freeMarker配置实例Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);String templatePath = "/templates/";Writer out = null;try {//获取模版路径configuration.setClassForTemplateLoading(FreeMakerUtil.class, templatePath);//加载模版文件Template template = configuration.getTemplate(templateName);response.setHeader("Content-disposition","attachment;filename=" + URLEncoder.encode(fileName + ".doc", StandardCharsets.UTF_8.name()));//输出类型response.setContentType("application/msword");out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));template.process(dataMap, out);} catch (Exception ex) {log.error("生成word文件发生异常",ex);} finally {try {if (null != out) {out.flush();out.close();}} catch (Exception ex) {log.error("关闭文件流异常",ex);}}}
}
最后生成word文件效果: