这是需求:需要做一张这样的word文件,需要用freemark自动下载生成
1打开这个word文件或者自制一张这样的word文件将其加入字段
这里需要空一行空白,这里需要做之后数据并没有填充完整个表格的留白。完了之后将其保存为xml格式,
2 .将xml格式文件,手动改成ftl格式文件
3,然后将这个ftl格式文件导入到foxechs里面进行字段修改,这款软件针对ftl格式文件非常好用
4,打开后,右键缩进排版。然后找到里面之前编辑的字段 比如“day"字段
foxechs软件打开后会有错误比如把”day"字段分开成了<w:t>d</w:t>和<w:t>ay</w:t>
我们需要把这些分开的字段合并<w:t>day</w:t>
然后加上需要的特殊符号<w:t>${day}</w:t>
将所有字段做一次这样的修改后保存。
5下面就是导入项目中作为模板了。我这里用的是springboot,额外要加入pom文件freemark的
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
这里用的是2.3.20版本;
6将刚刚整理好的ftl文件插入spring静态文件中
然后再springboot里面的cotroller层里面下业务代码
这里是基于下载方法生成word
@RestController
public class TestController25 {
// 处理下载word文档
@RequestMapping("/MeasuringTable11")
public void downloadWord(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
// 告诉浏览器用什么软件可以打开此文件
response.setHeader("content-Type", "application/msword");
// 下载文件的默认名称
response.setHeader("Content-Disposition", "attachment;filename=表7 钢弦式多点位移计监测记录、计算表.doc");
Map<String, Object> dataMap = this.getData();
//创建配置实例对象
Configuration configuration = new Configuration();
//设置编码
configuration.setDefaultEncoding("UTF-8");
//加载需要装填的模板
configuration.setClassForTemplateLoading(this.getClass(), "/");
//设置对象包装器
configuration.setObjectWrapper(new DefaultObjectWrapper());
//设置异常处理器
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
//获取ftl模板对象
Template template = configuration.getTemplate("MeasuringTable7.ftl");
//输出文档
String fileName="表7 钢弦式多点位移计监测记录、计算表.doc";
try {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="
+ new String(fileName.toString().getBytes("GBK"), "ISO-8859-1"));
response.setCharacterEncoding("utf-8");//处理乱码问题
//生成Word文档
template.process(dataMap, response.getWriter());
} catch (Exception e) {
e.printStackTrace();
} finally {
response.flushBuffer();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//getData方法被调用
private Map<String, Object> getData() {
Map<String, Object> dataMap = new HashMap<>();
//基础数据
dataMap.put("measuringNumber", "l安丘");
dataMap.put("measuringElevation", "刘飞");
dataMap.put("frequencyValueOne", "l安丘");
dataMap.put("frequencyValueTwo", "l安丘");
dataMap.put("frequencyValueThree", "l安丘");
dataMap.put("frequencyValueFour", "l安丘");
dataMap.put("frequencyValueFive", "l安丘");
dataMap.put("frequencyValueSix", "l安丘");
dataMap.put("sensitivityCoefficientGone", "刘飞");
dataMap.put("sensitivityCoefficientGtwo", "刘飞");
dataMap.put("sensitivityCoefficientGthree", "刘飞");
dataMap.put("sensitivityCoefficientGfour", "刘飞");
dataMap.put("sensitivityCoefficientGfive", "刘飞");
dataMap.put("sensitivityCoefficientGsix", "刘飞");
dataMap.put("year", "1998");
dataMap.put("page", "6");
//1.创建有数据的单元格行list
List<Map<String, Object>> measuringData = new ArrayList<>();
int x=5;//从数据库里面一次读到数据的数量,这里假设是16个
for (int i = 1; i <= x; i++) {
Map<String, Object> userMap = new HashMap<>();
userMap.put("day", "张三" + i);
userMap.put("temperatureT", "1");
userMap.put("frequencyone", "1");
userMap.put("frequencytwo", "1");
userMap.put("frequencythree", "1");
userMap.put("frequencyfour", "1");
userMap.put("frequencyfive", "1");
userMap.put("frequencysix", "1");
userMap.put("displacementOne", "1");
userMap.put("displacementTwo", "1");
userMap.put("displacementThree", "1");
userMap.put("displacementFour", "1");
userMap.put("displacementFive", "1");
userMap.put("displacementSix", "1");
measuringData.add(userMap);
}
dataMap.put("measuringData", measuringData);
//2.创建有数据的单元格行list
List<Map<String,Object>>blankList=new ArrayList<>();
int tablePage=x/7;
for(int i=1;i<=7*(tablePage+1)-x;i++) {
HashMap<String,Object> blankHashMap = new HashMap<>();
blankList.add(blankHashMap);
}
dataMap.put("blank", blankList);
return dataMap;
}
}