xdoc html导出word,使用XDocReport将HTML格式数据转换为Word
本文采用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相关推荐
- oracle二进制转换字母,如何将oracle二进制数据转换为word文本
现在很多项目和技术支持在线编辑word文档.有控件的和javascript操作的.这里简单的推荐一个在线编辑word文档的控件. 地址:http://www.dianju.cn/p/weboffice ...
- 快速将非Word中的不可编辑的公式转换为Word文档中公式编辑器里可编辑的公式的办法
因为我最近需要翻译一篇外文文献,其中的公式比较多,如果我自己去Word里用公式编辑器编辑,那么会翻译的会很慢,于是就搞出了一套可以自动将非Word中的不可编辑的公式转换为Word中可编辑的公式的办 ...
- 怎么把pdf格式转成word文档?如何将 PDF 转换为 Word
怎么把pdf格式转成word文档?PDF是运用得很广泛地的办公文档,但是不能编辑,为了方便编辑,需要将PDF转换为word,那么,如何将 PDF 转换为 Word,下面,易我小编会讲解实用的pdf转w ...
- 关于用java编写生成word文档,动态添加数据到word文档的一些心得
关于用java编写生成word文档,动态添加数据到word文档的一些心得,经过翻阅了无数的有用的和无用的资料以后,总算找到了一种靠谱的方法 1.概述 经过反反复复的查阅资料,总算找到了一个靠谱的生成w ...
- Java 将xml模板动态填充数据转换为word文档
需要用到的jar包: commons-codec-1.10.jar freemarker-2.3.21.jar jacob-1.6.jar 实现思路: 1.先将word文档另存为 : Word 200 ...
- Java导出带格式的Excel数据到Word表格
在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用Spi ...
- 利用Poi-tl将富文本Html转换为Word文件
DEMO地址:https://gitee.com/xuwangcheng/html-to-word 2019年的时候业务需要把前台的富文本html数据转换为WORD文档,百度了下,网上多数方案都是通过 ...
- 如何使用Python将PDF转换为Word文档?
PDF是一种常用的文件格式,用于共享和打印文档.但是,在某些情况下,PDF 文件会转换为 Word DOCX或DOC格式以解析文本或使文档可编辑.对于此类场景,本文介绍了如何使用 Python 将 P ...
- Word处理控件Aspose.Words功能演示:在 Java 中将 HTML 文件转换为 Word 文档
在各种情况下,您可能需要将 HTML 内容转换为 Word 文档.例如,用于从所见即所得 HTML 编辑器生成文档或将网页转换为 DOCX 或 DOC 格式.为了以编程方式执行此转换,本文介绍了如何将 ...
- CAJ Viewer安装流程以及CAJ或Pdf转换为Word格式
不多说,直接上干货! pdf转word格式,最简单的就是,实用工具 Adobe Acrobat DC 首先声明的是,将CAJ或者Pdf转换成Word文档,包括里面的文字.图片以及格式,根本不需 ...
最新文章
- 牛!一周内被疯转,最终被所有大厂封杀的内容!
- LVS学习笔记及总结(思维导图版)
- python朋友圈为什么这么火-利用Python让你的微信朋友圈与众不同,更加高大上
- Pycharm使用详解
- python8个程序语言_所有程序员必知--2019年最流行的8种编程语言和框架
- MapXtreme 2005新增内容
- 数据挖掘之数理统计与常见分布与假设检验
- 走错路也要美美的!富有创意的404页面设计灵感
- java cxf服务端_webservice概述及cxf在Java开发中应用(二) 简单搭建cxf服务端
- 学计算机科学与技术会特效吗,女生学计算机科学与技术专业会不会很困难?看完你就明白了!...
- win10安装Visual Studio Code(VSCode)
- 【鱼眼镜头2】[鱼眼畸变模型]:评估了五个模型:radial,division,FOV,多项式(如双三次]和rational模型。
- python上网行为分析_用 Python 一键分析你的上网行为, 看是在认真工作还是摸鱼...
- fw150rm刷openwrt固件_迅捷FW150R刷TP741N后再刷Openwrt和DDWRT以及固件还原
- 工业物联网与人工智能合体之后 竟把魔爪第一个伸向了她……
- [任务2]安装ubuntu Linux
- 用css的animation动画属性来实现一个H5场景动态电子邀请函
- OC不可变字符串和可变字符串(1)
- 地震了!最好直接砸死我!
- SAP 业务交易事件BTE(Business Transaction Event)
热门文章
- python爬取其他人微信朋友圈_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈...
- jsp 展示服务器pdf文件,jsp实现pdf在线预览功能
- 手把手教你基于PaddlePaddle的情绪识别
- 转载:如何给公司取英文名字
- Centos 普通用户su到root用户提示错误
- 全国省份、城市关联表 mysql(含城市名拼音)
- 校园商铺项目 SSM迭代Spring Boot项目实战视频
- Excel文本自动换行
- Web端的邮件内容HTML格式规范总结
- 国内的邮箱哪最好用,个人的邮箱排名?