工作中经常有时会遇到需要给用户创建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. 如何优雅的设计java异常
  2. bzoj2527: [Poi2011]Meteors
  3. 使用OpenApi弹性管理云服务器ECS
  4. python3 tensorflowprint错误_解决import tensorflow as tf 出错的原因
  5. 微信小程序支付html标签,微信小程序/支付宝小程序 WxParse解析富文本(html)代码...
  6. Kafka 入门之集群部署遇到问题
  7. vue,vue-router实现浏览器返回不刷新页面
  8. video.min.js php,在WordPress中使用videojs来播放七牛私有空间视频
  9. 计算机java培训总结,java培训总结范文
  10. unity3D游戏开发实战原创视频讲座系列7之消消乐游戏开发
  11. python爬取新浪博客_python爬虫-韩寒新浪博客博文
  12. 对《小王子》英文原版进行词频统计,发现他最爱的是......
  13. ASEMI快恢复二极管US1M参数,US1M恢复时间,US1M压降
  14. 软件工程基础知识 二
  15. 2021 年第一个双月总结
  16. Linux paste合并文件,使用多个字符作为间隔符
  17. Javascript frameworks
  18. 线程让步(yield)和线程睡眠(sleep)区别
  19. windowsXP用户无法远程桌面连接天翼云2008云主机
  20. 数据结构:堆(Heap)+图(Graph)

热门文章

  1. 【书摘】批判性思维工具
  2. python画正切函数_Python
  3. matlab pv图,Matlab中imagesc
  4. 如何快速深入理解监控知识? | 技术干货
  5. 一天入门Tableau详细教程(上)
  6. SATI下载-安装-使用 一看便懂+spss聚类(附安装包)
  7. 取消一个项目git版本控制
  8. C10K 和 C1000K
  9. Java开发必备软件安装大全(建议学生党初学Java开发收藏)
  10. 熟练掌握CAD制图,能做哪些工作?