本文采用XDocReport集合Freemaiker进行处理

1. 引入Maven依赖:

fr.opensagres.xdocreport

xdocreport

2.0.1

org.apache.velocity

velocity-engine-core

2.0

org.freemarker

freemarker

2.3.23

2. 创建Word模版

新建Word,在光标处通过快捷键Ctrl+F9 或 工具栏“插入”->“文档部件或文本”->“域”

根据电脑系统不同出现的界面不同,但内容都差不多,${text} 这个text就是后期要替换的变量了。

3. Java代码处理逻辑

1 String templateFilePath = request.getSession().getServletContext().getRealPath("/WEB-INF/templates/freemarkerTest.docx");2 File file = newFile(templateFilePath);3 InputStream in = newFileInputStream(file);4 IXDocReport report;5 String targetPath = basePath + lawDownDto.getLawsName() + ".docx";6 try{7 report =XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Freemarker);8 //设置内容为HTML格式

9 FieldsMetadata metadata =report.createFieldsMetadata();10 metadata.addFieldAsTextStyling("text", SyntaxKind.Html);11

12 //创建内容-text为模版中对应都变量名称

13 IContext context =report.createContext();14 context.put("text", content);15

16 //生成文件

17 OutputStream out = newFileOutputStream(targetPath);18 report.process(context, out);19 } catch(XDocReportException e) {20 e.printStackTrace();21 }

文件下载:在生成文件逻辑后创建读取流返回即可。

=============================================================

如果文件中有图片需要处理:

图片方案一:单个图片且位置固定,可通过XDocReport配置模版处理

图片方案二:多个图片且位置不固定,可通过POI结合Freemarker进行处理

图片方案一:

1. 在模版中插入临时图片,选中图片并添加“书签”,书签名称是后续作为替换的变量

2. 代码中追加逻辑

在上面代码10后追加

//logo为模版中标签名称

metadata.addFieldAsImage("logo");

report.setFieldsMetadata(metadata);

在上面代码14行后追加

//IImageProvider可通过3种方式创建(File/IO流/ClassPath下文件)具体可参考顶部文档-Dynamic Image

IImageProvider logo = new FileImageProvider(new File("1950737_195902644.png"));

context.put("logo", logo);

图片方案二:

1. 在上面读取模版之前进行数据替换

//处理文本中的图片,使用imgReplace变量替换

Map param = new HashMap();if(StringUtils.isNotBlank(content)) {

content=HtmlUtils.htmlUnescape(content);

List> imgs =getImgStrContent(content);int count = 0;for (HashMapimg : imgs) {

count++;//处理替换以“/>”结尾的img标签

content = content.replace(img.get("img"), "${imgReplace" + count + "}");//处理替换以“>”结尾的img标签

content = content.replace(img.get("img1"), "${imgReplace" + count + "}");

Map header = new HashMap();

String result= "";

result= img.get("src");//如果没有宽高属性,默认设置为

if(img.get("width") == null || img.get("height") == null) {

header.put("width", 150);

header.put("height", 150);

}else{

header.put("width", (int)(Double.parseDouble(img.get("width"))));

header.put("height", (int) (Double.parseDouble(img.get("height"))));

}if( StringUtils.isNotBlank(result) ){

String type1= result.substring(result.lastIndexOf(".") , result.length());

header.put("type", type1);

header.put("content",this.imageToInputStream(result));

}

param.put("${imgReplace" + count + "}", header);

}

}

//获取html中的图片元素信息

private List>getImgStrContent(String htmlStr) {

List> pics = new ArrayList>();

Document doc=Jsoup.parse(htmlStr);if( doc != null){

Elements imgs= doc.select("img");if( imgs != null && imgs.size() > 0){for(Element img : imgs) {

HashMap map = new HashMap();if(!"".equals(img.attr("width"))) {

map.put("width", img.attr("width"));

}if(!"".equals(img.attr("height"))) {

map.put("height", img.attr("height"));

}

map.put("img", img.toString().substring(0, img.toString().length() - 1) + "/>");

map.put("img1", img.toString());

map.put("src", img.attr("src"));

pics.add(map);

}

}

}returnpics;

}

//读取生成的文件

readStream = newFileInputStream(targetPath);

ByteArrayOutputStream docxOs= newByteArrayOutputStream();int b = 0;byte[] buf = new byte[1024];while ((b = readStream.read(buf)) != -1) {

docxOs.write(buf,0, b);

}

docxResponseStream= newByteArrayInputStream(docxOs.toByteArray());//创建word 对象

XWPFDocument document = newXWPFDocument(docxResponseStream);

newOS= newByteArrayOutputStream();if (document != null && param != null) {//生成带图片的word(如需工具类请给我发邮件)

XWPFDocument customXWPFDocument =WordUtil.getWord(param, document);//设置表格边框样式(另外一片文章会介绍)//List list = formatTableBorder(customXWPFDocument);//处理合并单元格(另外一片文章会介绍)//mergeCell(content, list);//写入输出流返回

customXWPFDocument.write(newOS);

document.close();

customXWPFDocument.close();

resultInpu= newByteArrayInputStream(newOS.toByteArray());

}else{

resultInpu=docxResponseStream;

}

以上内容即可完成Word中多图片的动态展示。

后续会写处理表格边框、单元格合并及段落都相关内容。

xdoc html导出word,使用XDocReport将HTML格式数据转换为Word相关推荐

  1. oracle二进制转换字母,如何将oracle二进制数据转换为word文本

    现在很多项目和技术支持在线编辑word文档.有控件的和javascript操作的.这里简单的推荐一个在线编辑word文档的控件. 地址:http://www.dianju.cn/p/weboffice ...

  2. 快速将非Word中的不可编辑的公式转换为Word文档中公式编辑器里可编辑的公式的办法

      因为我最近需要翻译一篇外文文献,其中的公式比较多,如果我自己去Word里用公式编辑器编辑,那么会翻译的会很慢,于是就搞出了一套可以自动将非Word中的不可编辑的公式转换为Word中可编辑的公式的办 ...

  3. 怎么把pdf格式转成word文档?如何将 PDF 转换为 Word

    怎么把pdf格式转成word文档?PDF是运用得很广泛地的办公文档,但是不能编辑,为了方便编辑,需要将PDF转换为word,那么,如何将 PDF 转换为 Word,下面,易我小编会讲解实用的pdf转w ...

  4. 关于用java编写生成word文档,动态添加数据到word文档的一些心得

    关于用java编写生成word文档,动态添加数据到word文档的一些心得,经过翻阅了无数的有用的和无用的资料以后,总算找到了一种靠谱的方法 1.概述 经过反反复复的查阅资料,总算找到了一个靠谱的生成w ...

  5. Java 将xml模板动态填充数据转换为word文档

    需要用到的jar包: commons-codec-1.10.jar freemarker-2.3.21.jar jacob-1.6.jar 实现思路: 1.先将word文档另存为 : Word 200 ...

  6. Java导出带格式的Excel数据到Word表格

    在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用Spi ...

  7. 利用Poi-tl将富文本Html转换为Word文件

    DEMO地址:https://gitee.com/xuwangcheng/html-to-word 2019年的时候业务需要把前台的富文本html数据转换为WORD文档,百度了下,网上多数方案都是通过 ...

  8. 如何使用Python将PDF转换为Word文档?

    PDF是一种常用的文件格式,用于共享和打印文档.但是,在某些情况下,PDF 文件会转换为 Word DOCX或DOC格式以解析文本或使文档可编辑.对于此类场景,本文介绍了如何使用 Python 将 P ...

  9. Word处理控件Aspose.Words功能演示:在 Java 中将 HTML 文件转换为 Word 文档

    在各种情况下,您可能需要将 HTML 内容转换为 Word 文档.例如,用于从所见即所得 HTML 编辑器生成文档或将网页转换为 DOCX 或 DOC 格式.为了以编程方式执行此转换,本文介绍了如何将 ...

  10. CAJ Viewer安装流程以及CAJ或Pdf转换为Word格式

        不多说,直接上干货! pdf转word格式,最简单的就是,实用工具 Adobe Acrobat DC 首先声明的是,将CAJ或者Pdf转换成Word文档,包括里面的文字.图片以及格式,根本不需 ...

最新文章

  1. 牛!一周内被疯转,最终被所有大厂封杀的内容!
  2. LVS学习笔记及总结(思维导图版)
  3. python朋友圈为什么这么火-利用Python让你的微信朋友圈与众不同,更加高大上
  4. Pycharm使用详解
  5. python8个程序语言_所有程序员必知--2019年最流行的8种编程语言和框架
  6. MapXtreme 2005新增内容
  7. 数据挖掘之数理统计与常见分布与假设检验
  8. 走错路也要美美的!富有创意的404页面设计灵感
  9. java cxf服务端_webservice概述及cxf在Java开发中应用(二) 简单搭建cxf服务端
  10. 学计算机科学与技术会特效吗,女生学计算机科学与技术专业会不会很困难?看完你就明白了!...
  11. win10安装Visual Studio Code(VSCode)
  12. 【鱼眼镜头2】[鱼眼畸变模型]:评估了五个模型:radial,division,FOV,多项式(如双三次]和rational模型。
  13. python上网行为分析_用 Python 一键分析你的上网行为, 看是在认真工作还是摸鱼...
  14. fw150rm刷openwrt固件_迅捷FW150R刷TP741N后再刷Openwrt和DDWRT以及固件还原
  15. 工业物联网与人工智能合体之后 竟把魔爪第一个伸向了她……
  16. [任务2]安装ubuntu Linux
  17. 用css的animation动画属性来实现一个H5场景动态电子邀请函
  18. OC不可变字符串和可变字符串(1)
  19. 地震了!最好直接砸死我!
  20. SAP 业务交易事件BTE(Business Transaction Event)

热门文章

  1. python爬取其他人微信朋友圈_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈...
  2. jsp 展示服务器pdf文件,jsp实现pdf在线预览功能
  3. 手把手教你基于PaddlePaddle的情绪识别
  4. 转载:如何给公司取英文名字
  5. Centos 普通用户su到root用户提示错误
  6. 全国省份、城市关联表 mysql(含城市名拼音)
  7. 校园商铺项目 SSM迭代Spring Boot项目实战视频
  8. Excel文本自动换行
  9. Web端的邮件内容HTML格式规范总结
  10. 国内的邮箱哪最好用,个人的邮箱排名?