用Java生成word文档

  • 生成word思路
    • 编辑好需要使用的word文档
    • Java代码层编写
    • 生成后的文档如下图

生成word思路

用WPS或者office编辑好word的样式,然后另存为word xml文档,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Docx。

编辑好需要使用的word文档

1、把需要注入的信息换成变量名称,比如公司名称用${data1}表示,全部替换后的格式如下图所示

2、替换完成后另存为word xml格式的文档,如下图

3、生成后更改xml后缀为ftl格式文件,如下图

Java代码层编写

1、引用到freemaker的jar包,以及这里还引用了冰蓝云的一个jar包(导入这个jar包是为了后续解决用WPS创建的文档部分手机不能兼容,出现很多格式的问题,使用office手机可以很好的兼容),在pom.xml配置文件中,添加依赖

        <!-- freemarker jar --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version></dependency><!-- spire.doc jar --><dependency><groupId> e-iceblue</groupId><artifactId>spire.doc.free</artifactId><version>3.9.0</version></dependency>

2、创建生成动态文档帮助类

package com.mallplus.order.utils;import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Data;import java.io.*;
import java.util.Map;/*** @author * @date * @apiNote 生成动态文档帮助类*/
@Data
public class WordUtil {private Configuration configuration = null;/** 模板文件存放的目录*/private String baseDir;/** 模板文件名称*/private String templateFile;/** word生成的输出目录*/private String outputDir;public WordUtil(){configuration = new Configuration();configuration.setDefaultEncoding("UTF-8");}/** <p>转换成word<br>*/public String createWord(Map<String,Object> dataMap){configuration.setClassForTemplateLoading(this.getClass(), "");//模板文件所在路径Template t = null;try {//得到模板文件configuration.setDirectoryForTemplateLoading(new File(baseDir));t = configuration.getTemplate(templateFile);} catch (IOException e) {e.printStackTrace();}// GwUtil.getFileNo(""); 调用生成随机数的方法File outFile = new File(outputDir+ GwUtil.getFileNo("")  + ".docx"); //导出文件Writer out = null;try {out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));} catch (FileNotFoundException e1) {e1.printStackTrace();}try {t.process(dataMap, out); //将填充数据填入模板文件并输出到目标文件return outFile.getPath();} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return "文档生成失败";}}

3、将ftl模板文件复制到项目的指定路径下,模拟数据进行测试

   public static void main(String[] args) {// 调用word文档帮助类WordUtil wordUtil = new WordUtil();// 模板文件存放的目录wordUtil.setBaseDir("E:/ww");// 模板文件名称wordUtil.setTemplateFile("采购计划表模板.ftl");// word生成的输出目录wordUtil.setOutputDir("E:/image/");// 初始化数据mapMap<String,Object> dataMap = new HashMap<>();// 录入采购基本数据dataMap.put("data1", "XX公司");dataMap.put("data2", "XX项目");dataMap.put("data3", "2022.01.01");dataMap.put("data4", "采购部");dataMap.put("data5", "张三");dataMap.put("data6", "189XXXXXXX");dataMap.put("data7", "李四");dataMap.put("data8", "张主任");dataMap.put("data9", "王总");dataMap.put("data10", "王某");dataMap.put("data11", "王某");dataMap.put("data12", "张三");// 录入表格数据(3条数据循环三次)for (int i = 1; i <= 3; i++) {dataMap.put("dataName"+i, "笔记本电脑"+i);dataMap.put("dataBand"+i, "金山牌"+i);dataMap.put("model"+i, "JHHJ6"+i);dataMap.put("price"+i, 5000+i);dataMap.put("quantity"+i, 3+i);dataMap.put("total"+i, 15000+i);}//处理定价方式复选框dataMap.put("select", "☑境内采购" + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t" + "□境外采购");String oldPath = wordUtil.createWord(dataMap);if (oldPath.equals("操作失败")){System.out.println("操作失败");}//输出生成后的文件路径System.out.println(oldPath);}

如果是使用WPS创建的文档需要最后一步加上如下代码进行处理(防止文档在部分手机上不能兼容或者格式问题):

//转化后本质是doc(x)的word文档。Document document = new Document(oldPath);File file = new File(oldPath);// 判断有没有父路径,就是判断文件整个路径是否存在if (!file.getParentFile().exists()) {// 不存在就全部创建file.getParentFile().mkdirs();}//将本质是xml的文件转化为真正的doc(x)document.saveToFile(oldPath, FileFormat.Docx);

生成后的文档如下图

spire.doc 免费版的对word的内容量有限制(要求 Word 文档不超过 500 个段落,https://www.e-iceblue.cn/Introduce/Free-Spire-Doc-JAVA.html)
采购计划表word模板文档地址:https://download.csdn.net/download/weixin_49104405/85187627?spm=1001.2014.3001.5501

用Java生成word文档相关推荐

  1. [摘]用Java生成Word文档

    开发中隔三叉五的就要用到Word,经常被搞得不胜其烦,不过这次找到了不少好例子,干脆将他们都摘了过来,内容如下: 1. poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这 ...

  2. 用java生成word文档(转载)

    用java生成word文档 poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: 下载经过封装后的poi包: 这个包就是:tm-extrac ...

  3. Java 生成Word文档 — 简单示例

    前言 这篇文章将介绍如何使用免费Java Word组件Free Spire.Doc for Java在Java应用程序中生成Word文档,插入文本,并设置段落的字体格式.对齐方式以及段后间距等. Fr ...

  4. java生成word文档freemarker

    java freemarker + word 模板 生成 word 文档 (变量替换,数据的循环,表格数据的循环,以及图片的替换) 1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下 ...

  5. Java生成Word文档

    在开发文档系统或办公系统的过程中,有时候我们需要导出word文档.在网上发现了一个用PageOffice生成word文件的功能,就将这块拿出来和大家分享. 生成word文件与我们编辑word文档本质上 ...

  6. java生成word文档(最简单)

    首先说明,使用该方法时,尽量不要使用wps新建word文档,经测试,手机不能兼容,出现很多格式问题,office则手机可以很好的兼容,所以,本文以office做教程 1 首先新建一个word文档,然后 ...

  7. 记录一次用Java生成word文档的经验

    业务背景 最近接到一个需求需要将学员的基本信息生成word格式的内容,word的格式如下图所示 开发的任务就是将学员的信息替换掉表格中的** 即可,感觉还蛮简单的. 相信大家以前做的最多的是Java和 ...

  8. java word模板poi生成文件_poi读写word模板 / java生成word文档

    有一word文档表格 形如: 姓名 ${name} 电话 ${tel} 下载包链接:点击进入 从数据库读取记录替换上述变量 import java.io.FileOutputStream; impor ...

  9. java生成word文档_Java多种方式动态生成doc文档

    本来是要在Android端生成doc的(这需求...),最后方法没有好的方法能够在Android上做到完美,最后还是只能搬迁到服务器.不浪费,还是记录下各框架不支持Android的原因以及他们的特点. ...

  10. java生成word文档 图片_java生成带有图片的word的文档-Go语言中文社区

    生成带有图片的word的文档 @RequestMapping(params ="getWordByDate",produces = "text/html;charset= ...

最新文章

  1. 8种最坑的SQL错误用法,第一个就很坑?
  2. 安装惠普笔记本XP三种方法
  3. KMP 算法并非字符串查找的优化 [转]
  4. Hangfire使用ApplicationInsigts监控
  5. 【汇编语言】(王爽)实验4解答
  6. 从XMLHttpRequest中获取请求的URL
  7. 三维点云学习(4)3-Model Fitting Least Square
  8. wps打开pdf乱码_wps pdf转换成word乱码
  9. SWMM[Storm Water Management Model]模型代码编译调试环境设置
  10. js调用qq互联api实现第三方登录
  11. 浅聊一下车载以太网技术及其EAVB和TSN技术
  12. 牛逼的 弹出层 layer !!!
  13. 连接mysql数据库error 2003_连接mysql数据库error 2003
  14. 大型机汇编HLASM - HOOK ISPF命令START(一)
  15. 微商必备6款软件!十分好用
  16. WPF LiveCharts 折线图XY轴关联赋值,可显示不同时间段数据
  17. 工具 | 百度网盘限速解决方案
  18. Python3.4 调用语音及警报声
  19. 2021中青杯数学建模A题思路详细分析 代码?
  20. php 不重复订单号,php如何生成不重复的订单号,php不重复订单编号

热门文章

  1. c语言编黑白棋的思路,黑白棋的问题。。555。。头发都掉了。。。
  2. 一、super slomo介绍
  3. Android同步时出错,Android Studio中的Gradle给出错误项目同步失败
  4. html中代表颜色的字母16个,html中16进制的代码对应颜色表
  5. 小学生信息奥赛学c语言,适合小学生的信息学奥赛(NOIP)课程来袭!
  6. x32下PsSetLoadImageNotifyRoutine的逆向
  7. mysql id 主键 外键_mysql主键 外键
  8. 本征频率有时也称为特征频率,固有频率,本振频率
  9. Redis官方中文翻译系列 - Redis文档
  10. arcgis公里坐标转经纬度_利用arcgis实现经纬度和平面坐标互转