工作中经常有时会遇到需要给用户创建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文档了

word文档创建及在线预览方法相关推荐

  1. java doc转图片_使用Java实现word文档转图片 在线预览

    [Java] 纯文本查看 复制代码/** * licence 验证 * @return * @throws Exception */ public static boolean getLicense( ...

  2. word文档转html在线预览Demo

    demo地址:https://download.csdn.net/download/caidingnu/11390310

  3. 文档转换、在线预览的几种方式以及推荐

    互联网时代的繁荣期,在线教育犹如三国中的巴蜀之地,无论是各大巨头还是中小软件.都希望在此领域分的一口肥肉. 其中,关于文档转换.一直是开发在线教育软件让人头痛的事. 在这先说一下文档转换以及预览的几种 ...

  4. .net oss存储 oss api接口开发 office文档上传在线预览oss存储 office文档上传oss 阿里云oss接口开发

    word在线预览api接口 office在线预览接口 word转图片 ppt在线预览 excel在线预览 预览支持的文件格式:word(doc,docx),excel(xls,xlsx),ppt(pp ...

  5. Angualr6+ 将数据转换整合PDF文档导出或在线预览

    前言:需要将自己的数据单或是图片等转换成PDF格式,可以在线预览与下载:所需pdfmakes和ng2-pdf-viewer:并且解决pdfmakes中文与中文符号乱码问题: 一.安装Pdfmakes ...

  6. WEB端和微信小程序端的文档文件在线预览方法

    文件的在线预览方式汇总 文件在线预览功能可以提高用户体验,值得加入. 一般常见的文件有office套装.pdf.txt.md.和音视频. 音视频的预览是单独一块,今天主要说说文档文件的在线预览功能. ...

  7. 使用永中文档实现java在线预览Word,Excel,Pptx,Pdf

    使用永中文档实现java在线预览Word,Excel,Pptx,Pdf 永中文档提供了在线预览的功能 永中开发者文档 如果需要直接运行,请直接修改代码中的两个参数 转换类型在下方,根据传入以及输出类型 ...

  8. Spring Boot整合OpenOffice实现Word、Excel、PPT在线预览

    Spring Boot整合OpenOffice实现Word.Excel.PPT在线预览 1 介绍下OpenOffice 官网:https://www.openoffice.org/download/ ...

  9. Win10 右键新建没有WORD文档创建菜单?

    环境: Win10 专业版 问题描述: 右键新建没有WORD文档创建菜单? 解决方案: 1.打开注册表,计算机\HKEY_CLASSES_ROOT.docx,右侧默认数值改为Word.Document ...

  10. 将vue文档下载到本地预览

    将vue文档下载到本地预览 由于vue文档在服务器在国外,因此访问速度较慢,为了方便文档查看,可以将文档下载到本地预览 步骤 到vue的GitHub仓库下载文档源码 下载node.js和git安装到本 ...

最新文章

  1. python100个免费实例-Python实例100个(基于最新Python3.7版本)
  2. mysql数据库入门教程(5):多表操作(连接查询,子查询,分页查询,联合查询)
  3. 问题类像程序员一样思考
  4. 每天一道LeetCode-----使用最少的操作将一个字符串转换成另一个字符串,只有插入,删除,替换三种操作
  5. c_str()的用法
  6. Redis持久化配置
  7. Word2vec之CBOW模型和Skip-gram模型形象解释
  8. OpenGL基础33:帧缓冲(上)之离屏渲染
  9. python-16: time 模块 之一
  10. 推荐几本 Go 语言电子书
  11. 十五种小游戏代码(有0积分下载的哦)
  12. dota5显示正在连接协调服务器,win10系统打开dota2提示已连接至DOTA2游戏协调服务器正在登陆中如何解决...
  13. [干货分享]硬件测试快速入门你必须了解的知识!
  14. 【重要】国庆节快乐!有三AI所有课程限时7天优惠
  15. 【word】双栏写作如何调整为写满左栏再写右栏
  16. 如何安装虚拟机———一台电脑,多个系统体验
  17. html5 canvas绘制圆形印章,以及与页面交互
  18. 代码:吃货联盟订餐系统
  19. 金融与python-基于Python的金融分析与风险管理
  20. 学弟:功能测试转测试开发容易吗?

热门文章

  1. USB转串口驱动安装失败解决方法
  2. VC6.0下载及安装
  3. 关爱程序员的生活 -- 巴氏刷牙法
  4. 【梳理】离散数学 第15章 欧拉图与哈密顿图 15.1 欧拉图 15.2 哈密顿图
  5. html固定表格宽度代码,如何固定HTML表格的宽度
  6. Win10下安装GrADS
  7. 大学计算机系最努力的同学都是如何学习的?
  8. 如何才能实现文字转语音播放?只要这三个步骤就能快速搞定!
  9. 8uftp,什么是8uftp
  10. ​24小时企业级微信小程序全套开发视频教程