word文档创建及在线预览方法

article/2025/8/25 14:23:08

工作中经常有时会遇到需要给用户创建word文档并实现word文档在线预览 的需求,我来讲一讲我所知道的解决方案。

一、word文档模板定义

因word文档中内容是根据不同用户显示不一样,所以需要使用较为灵活的模板了,本文使用的是freemarker+xml来定义模板:

1. maven依赖:

        <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.20</version></dependency>

2.word文档准备

需要准备好一份word文档,内容已充填好,.doc格式文档

类似这种:

填写完成后需另存为.xml格式文档,需要注意,图片会已base64编码保存下来,需要把这个xml中的图片替换成可配置的参数;找到contentType="image/jpeg"的标记,替换base64图片的内容为:${image1}/${image2} 另外,${}标签中不要包含空格,否则会被word给分隔,形成的文档会无法识别这个替换符号

 二、word文档创建

模板准备好后,需要使用freemarker来生成word

具体方法如下:

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import sun.misc.BASE64Encoder;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;@Slf4j
public class WordUtil {private static final String ENCODING = "UTF-8";private static Configuration cfg = new Configuration();public static String CURRENT_DIR = System.getProperty("user.dir").replace('\\', '/');public static String FREEMARKER_PATH = "freemarker";public static String NOT_FOUND_IMG = CURRENT_DIR + File.separator + FREEMARKER_PATH + File.separator + "404.jpg";//初始化cfgstatic {//设置模板所在文件夹try {cfg.setDirectoryForTemplateLoading(new File(CURRENT_DIR + File.separator + FREEMARKER_PATH));} catch (IOException e) {log.error("load freemarker error 404");}// setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码cfg.setEncoding(Locale.getDefault(), ENCODING);// 设置对象的包装器cfg.setObjectWrapper(new DefaultObjectWrapper());// 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);}//获取模板对象public static Template getTemplate(String templateFileName) throws IOException {return cfg.getTemplate(templateFileName, ENCODING);}/*** 据数据及模板生成文件** @param data             Map的数据结果集* @param templateFileName ftl模版文件名* @param outFilePath      生成文件名称(可带路径)*/public static File crateFile(Map<String, Object> data, String templateFileName, String outFilePath) {Writer out = null;File outFile = new File(outFilePath);try {// 获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致Template template = getTemplate(templateFileName);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);// 处理模版template.process(data, out);out.flush();} catch (Exception e) {log.error("模板生成文件失败:{}, {}, {}", outFilePath, templateFileName, e.getMessage());} finally {try {if (out != null) {out.close();}} catch (IOException e) {log.error("关闭Write对象出错", e);}}return outFile;}//获得图片的base64码public static String getImageBase(String src) throws Exception {if (StringUtils.isBlank(src)) {return "";}InputStream in;byte[] data = null;if (src.startsWith("http")) {URL url = new URL(src);if (StringUtils.isBlank(url.getFile())) {return "";}HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(3000);connection.setDoInput(true);connection.setRequestMethod("GET");int code = connection.getResponseCode();if (code == 200) {in = new BufferedInputStream(connection.getInputStream());} else {log.error("request {} error", src);return "";}} else {File file = new File(src);if (!file.exists()) {return "";}in = new FileInputStream(file);}try {data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {log.error(e.getMessage());}BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);}public static void main(String[] args) throws Exception {Map<String, Object> data = new HashMap<>();data.put("userId", 1);data.put("username", "test");data.put("phone", "110");data.put("image1", getImageBase("C:\\Users\\Public\\Pictures\\Sample Pictures\\139268975275.JPG"));data.put("image2", getImageBase("C:\\Users\\Public\\Pictures\\Sample Pictures\\139268975275.JPG"));crateFile(data, "model.xml", "C:\\Users\\pc02\\Desktop\\sql\\result.doc");}
}

手动调用main方法就可以创建word了,创建的word如图:

三、word在线预览方案 

word文档大家也知道,浏览器是无法识别在线查看的,一般都需要下载下来使用本地的办公软件打开,所以需要使用第三方工具进行在线预览,推荐永中文档在线预览,方便快捷

1.申请应用

进入永中云服务网站:  https://open.yozocloud.cn

点击产品- 文档云预览

进入后先申请一个云预览的appId和密钥,审批通过后就可以调用api接口实现在线预览的功能了

2.上传文档

先调用接口上传文件到服务器中: http://dmc.yozocloud.cn/api/ file/upload?appId=xxxx&sign=xxxx 

调用成功后会返回一个文件版本信息:

{"data": {"fileVersionId": "fileVersionId", //文件的版本id"fileId": "fileId" //文件id},"message": "操作成功","errorcode": 0
}

3.查看预览效果

通过使用这个fileVersionId就可以查看预览页面 http://eic.yozocloud.cn/api/view/file?fileVersionId=xxxx&appId=xxxx&sign=xxxxx

在浏览器中输入这个拼接好的地址就可以直接重定向到在线查看这个html页面了 效果如下:

这样就可以给用户在线查看所需要的word文档了 


http://chatgpt.dhexx.cn/article/W0eEVJgM.shtml

相关文章

自学Java没学历可以找到工作吗?

除非技术真的diao 炸 天&#xff0c;否则大概率是找不到的 低学历能自学编程的人大有人在&#xff0c;你在搜索引擎上一查&#xff0c;低学历自学编程改变自身命运的不胜枚举。 但无一不例外的&#xff0c;每个求学者的叙述都透漏着心酸、艰难困苦&#xff0c;披荆斩棘。这些词…

自学Java真能找到好工作吗

最近跟学生沟通的时候总是能听到这样的对话 学生&#xff1a;老师&#xff0c;我觉得没必要报个班学习Java&#xff0c;我有好多师兄现在都在自学的&#xff0c;我觉得他们学的也挺不错的&#xff0c;没有想象的那么难&#xff0c;我也准备自学了&#xff01; 老师&#xff1…

自学编程到底多难?能不能找到工作?阿里技术专家这样回答……

最近逛知乎&#xff0c;看到一个问题&#xff0c;有感而发&#xff0c;原问题如下&#xff1a; 想自学编程恳请大神推荐app网站&#xff01;? 数学不好&#xff0c;再从小学数学开始重修 想学习编程&#xff0c;请问各位大神 1、编程要求哪方面数学知识&#xff1f; 2、有…

自学Java真的可以找到工作吗?

就java得市场而言&#xff0c;不管自学还是科班找到工作都不是很难。当然&#xff0c;自学的话&#xff0c;首先要解决的是自制力的问题&#xff0c;如果没有自制力&#xff0c;也就没有了恒心&#xff0c;学不了东西&#xff0c;自然也找不到工作。 其次&#xff0c;java发展…

java能自学吗_java能自学吗?

java能自学吗&#xff1f; Java是一门面向对象编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了…

自学编程5个月找到了月薪12K的工作,我的方法值得大家借鉴

昨晚在刷知乎的时候&#xff0c;突然跳出了字节发来的录用邮件&#xff0c;期待了很久offer&#xff0c;最大的感受就是这5个月的编程自学没有白费。 高中对编程很感兴趣&#xff0c;但是一边搞主课一边自学编程导致高考没考好&#xff0c;编程也没学出什么苗头。于是选择了一个…

自学java到可以找工作要多久_自学编程需要多久才能找到工作?

自学编程需要多久才能找到工作&#xff1f; 很多编程初学者都会有这种疑问&#xff0c;自学学到什么程度或者学多久能够找到工作&#xff0c;这种问题没有统一答案&#xff0c;因为每个人的出发时候的基础以及在学习过程中掌握的程度不尽相同&#xff0c;也会导致结果不一样&am…

自学java能找到工作吗?公司会要吗?

java是一门面向对象编程语言&#xff0c;它不仅仅吸收了C语言的各种优点&#xff0c;还摒弃了C语言当中很难理解的多继承、指针等概念&#xff0c;所以&#xff0c;java语言具有着功能简单、简单易用这两个特征。 java学习起来还是非常的简单的&#xff0c;现在有很多的人都会自…

零基础自学编程的程序员如何找到工作

现在很多年轻人喜欢计算机,喜欢软件开发,想从事IT行业但又不是学这个专业的,很多人就想通过自学的途径走上这条道路,但大家肯定也和我当初一样有很多的困惑。本人学校学的是国际贸易专业,毕业之后的不顺利加上自身的兴趣爱好,走上编程的道路,下面就结合亲身经历说说自己…

自学单片机能找到工作吗?能有出路吗?

你现在的情况跟我十年前很像啊&#xff0c; 或许我当时的情况比你现在还糟一些。 我们是电气工程毕业的&#xff0c;第一年学了一些电气相关的知识&#xff0c;后面几年学校给我们安排的全是电梯的课程。 我和很多人的想法一样&#xff0c;电梯还需要开专业的课程&#xff1f…

配置Nginx端口

一、起因 昨天晚上闲来无事,上了下阿里云发现自己的域名和服务器都还没过期,所以就把自己的域名绑定到服务器地址上,做了一个DNS解析。但是我发现,每次需要访问8888端口时仍需要使用 域名:8888 这种方式访问,所以我想用Nginx做一个反向代理,将默认打开的80端口转发到808…

宝塔配置Nginx

如果出404 就是因为点击了 恢复默认配置 解决办法 &#xff1a; 重新 指向 目录位置即可

本地项目配置nginx代理请求接口

nginx安装 安装下载地址&#xff1a;http://nginx.org/en/download.htmlnginx配置 相关命令(针对小白&#xff0c;本人也是)&#xff1a; 1. start nginx // 启动ng服务器2. nginx -s reload // 服务杀死后进行重启&#xff08;每次修改配置需执行此操作&#xff09;3. nginx -…

5分钟教你快速配置nginx实现访问

文章目录 需求操作步骤一、开放端口二、在nginx配置文件中配置端口1&#xff09;server块2&#xff09;区分root和alias3&#xff09;区分server块的root和location块的root4&#xff09;proxy_pass处理跨域 三、根据配置文件往路径下丢包 总结 需求 工作中我们时常需要完成个…

Debian配置Nginx和PHP

要求&#xff1a; 安装nginx软件包&#xff1b; 配置文件名为ispweb.conf&#xff0c;放置在/etc/nginx/conf.d/目录下&#xff1b; 网站根目录为/mut/crypt&#xff08;目录不存在需创建&#xff09;&#xff1b; 启用FastCGI功能&#xff0c;让nginx能够解析php请求&#xff…

云服务器安装并配置nginx

初次购买完云服务器&#xff0c;通过 ssh 连接到远程云服务器时&#xff0c;如果在浏览器直接访问&#xff0c;会访问无效&#xff0c;情况如下&#xff1a; 所以我们需要 给云服务器安装 web 服务器。 安装nginx 用 SFTP 工具&#xff08; Final Shell / Filezilla / WinSCP …

win10安装配置nginx

准备工作 去nginx.org下载nginx&#xff0c;我下载的是 nginx/Windows-1.10.3版本 进入页面->点击download->点击 nginx/Windows-1.10.3 安装 解压&#xff0c;然后启动nginx.exe 当进程中有nginx&#xff0c;就算是启动成功了 访问测试 浏览器访问 127.0.0.1 或者…

安装配置Nginx全分布

目录 一安装准备 1.1安装c环境 1.2下载安装包 二安装配置 2.1上传安装包到相应位置 2.2解压 2.3进入解压的Nginx目录&#xff08;nginx-1.12.2&#xff09; 2.4启动/关闭Nginx&#xff08;要用执行root&#xff09; 2.5配置负载均衡 三验证 一安装准备 1.1安装c环境 s…

docker安装配置nginx

https://hub.docker.com/search?qnginx&typeimage 一、查看docker是否安装nginx docker images二、安装nginx docker pull nginx三、运行nginx镜像 docker run --name mynginx -p 80:80 -d nginx四、查看运行结果 docker ps网页访问&#xff0c;浏览器输入虚拟机IP:端…

Docker配置nginx

1.Docker安装nginx 安装的命令 sudo docker search nginx docker pull nginx查看是否安装 docker images运行测试nginx docker run --name nginx-test -p 9091:80 -d nginx --name #给你启动的容器起个名字&#xff0c;以后可以使用这个名字启动或者停止容器 -p #映射端口…