当前位置: 首页 > news >正文

word模板导出word文件

前期准备工作word模板
右键字段如果无编辑域 ctrl+F9 一下,然后再右键
在这里插入图片描述

wps 直接 ctrl+F9 会变成编辑域
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

pom.xml所需依赖

<dependencies>
<!--word 依赖-->
<dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document.docx</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId><version>2.0.2</version></dependency></dependencies><plugins><!--模板是放入项目中,编辑的时候会破坏模板结构,导致模板文件类型不支持pom文件增加文件过滤(maven ckean后重试)
--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.6</version><configuration><encoding>UTF-8</encoding><nonFilteredFileExtensions><nonFilteredFileExtension>docx</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin></plugins>

Controller 层

@Slf4j
@RestController
@RequestMapping("/word")
public class WordController{@Autowiredprivate WordService  word;/*** * @param response * @param query 查询参数*/@GetMapping("/export")public void export(HttpServletResponse response,  CommonQuery query){word.export(response,query);}
}

Service 层

public interface WordService  {void export(response,query);
}
package com.Lichao.word;import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
import lombok.extern.slf4j.Slf4j;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;@Slf4j
@Service
public class WordServiceImpl  {@Overridepublic void export(HttpServletResponse response, CommonQuery query) {try {/*测试数据File file = new File("C:\\Users\\Licha\\Desktop\\模板.docx");InputStream ins = new FileInputStream(file);*///获取Word模板,模板存放路径在项目的resources目录下InputStream ins = this.getClass().getResourceAsStream("/template/模板.docx");IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,TemplateEngineKind.Freemarker);IContext context = report.createContext();Vo vo = 获取写入数据方法(query);//创建要替换的文本变量// 字段 ${title}context.put("title" , vo.getTitle());//集合 -- ${list.type} context.put("list" , vo.listVos());//创建字段元数据FieldsMetadata fm = report.createFieldsMetadata();//Word模板中的表格数据对应的集合类型fm.load("list" , ListVo.class, true);/*//输出到本地目录FileOutputStream out = new FileOutputStream(new File("C:\\Users\\Licha\\Desktop\\数据.docx"));report.process(context, out);*/response.setCharacterEncoding("utf-8");response.setContentType("application/msword");String fileName = ledgerVo.getTitle() + ".docx";response.setHeader("Content-Disposition" , "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));report.process(context, response.getOutputStream());} catch (IOException e) {log.error("IOException报错" , e);} catch (XDocReportException e) {log.error("XDocReportException报错" , e);} catch (Exception e) {log.error("Exception" , e);}}
}

参考资料

https://blog.csdn.net/plxddyxnmd/article/details/109129838 - 学习

https://www.cnblogs.com/huigee/p/16588297.html - 解决文件读取乱码bug

模板工具类

package com.util.xdoc;import cn.hutool.core.util.ObjectUtil;
import com.leader.task.domain.vo.LedgerInfoDataVo;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;/*** word模板工具类* @author Lsc* @date 2023-12-01*/
public class WordUtil {private static final Logger log = LoggerFactory.getLogger(WordUtil.class);/**** @param response 返回数据* @param data 数据   数据字段要与模板中的字段一一对应* @param ins 输入流=模板* @param title 题目*/public static void exportWord(HttpServletResponse response, Object data , InputStream ins ,String title ){try {IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,TemplateEngineKind.Freemarker);IContext context = report.createContext();Class aClass = data.getClass();Field[] declaredFields = aClass.getDeclaredFields();Map<String, Class<?>> map = new HashMap<>();//创建要替换的文本变量for (Field declaredField : declaredFields) {declaredField.setAccessible(true);context.put(declaredField.getName() , ObjectUtil.isNotEmpty(declaredField.get(data))?declaredField.get(data):"");if (declaredField.toString().contains("java.util.List")){String name = declaredField.getName();map.put(name ,  null);}}Method[] methods = aClass.getMethods();for (Method method : methods) {//获取方法的名称String methodName = method.getName();//判断是否是studentDao中的get方法,if(methodName.startsWith("get")&& !methodName.startsWith("getClass")) {Type genericReturnType = method.getGenericReturnType();//获取实际返回的参数名String returnTypeName = genericReturnType.getTypeName();if (returnTypeName.contains("java.util.List")){for (String key : map.keySet()) {String substring = methodName.substring(3);String uncapitalize = StringUtils.uncapitalize(substring);if (uncapitalize.equals(key)){int i = returnTypeName.indexOf("<")+1;int i2 = returnTypeName.indexOf(">");String s = returnTypeName.substring(i, i2);map.put(key, Class.forName(s));}}}}}//创建字段元数据FieldsMetadata fm = report.createFieldsMetadata();for (String k : map.keySet()) {Class<?> v = map.get(k);fm.load(k, v, true);}//Word模板中的表格数据对应的集合类型response.setCharacterEncoding("utf-8");response.setContentType("application/msword");String fileName = title + ".docx";response.setHeader("Content-Disposition" , "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));report.process(context, response.getOutputStream());} catch (IOException e) {log.error("IOException报错" , e);} catch (XDocReportException e) {log.error("XDocReportException报错" , e);} catch (Exception e) {log.error("Exception" , e);}}}
http://www.lryc.cn/news/254804.html

相关文章:

  • debianubuntu的nvidia驱动升级
  • 【开源视频联动物联网平台】视频接入网关的用法
  • 【bug排查解决】现象级延迟8-10s
  • 【人生感悟】不能对一个人太好是有心理学原理的
  • 动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数
  • CSS新手入门笔记整理:CSS列表样式
  • 12月07日,每日信息差
  • spring mvc理解
  • HTML-标签之文字排版、图片、链接、音视频
  • 圣诞将至—C语言圣诞树代码来啦
  • Git常用命令#merge分支合并
  • Windows server 2019 域环境部署
  • Cocos Creator加入图片没有被识别
  • java double类型保留两位小数并去除后面多余的0
  • C++学习寄录(九.多态)
  • 【Linux基础开发工具】yum生态vim的配置与使用
  • java-HashMap、TreeMap、LinkedHashMap、ArrayList、LinkedList使用笔记
  • Oracle中mybatis批量更新报错ORA-00933:SQL命令未正确结束
  • Mysql综合案例练习<1>
  • Linux系统编程:线程总结
  • activemq启动成功但web管理页面却无法访问
  • 【Flink on k8s】- 0 - Flink kubernetes operator 快速入门与实战
  • 毕设:《基于hive的音乐数据分析系统的设计与实现》
  • PHP使用HTTP代码示例模板
  • 头歌题目-数组
  • C++ vector基本操作
  • 使用SLS日志服务采集Kong网关的日志
  • TA-Lib学习研究笔记(九)——Pattern Recognition (1)
  • 基于GAN的多尺度门合并多模态MRI图像合成
  • 浅谈https