使用Java将HTML内容转换为Word文档
我想分享一个实用的技术技巧:如何使用Java代码将HTML内容转换为Word文档。这个功能在很多业务场景中都非常有用,比如自动生成报告、合同、证书等正式文档。
文章目录
- 使用Java将HTML内容转换为Word文档
-
- [1. 技术背景](#1. 技术背景)
- [2. 实现原理](#2. 实现原理)
- [3. 核心代码分析](#3. 核心代码分析)
- [4. HTML内容设计要点](#4. HTML内容设计要点)
- [5. 实际应用场景](#5. 实际应用场景)
- [6. 注意事项](#6. 注意事项)
- [7. 结合AI模型生成word](#7. 结合AI模型生成word)
-
- [7.1. 测试提示词](#7.1. 测试提示词)
- [7.2. AI大模型返回的html样式](#7.2. AI大模型返回的html样式)
- [7.3. 转换成word](#7.3. 转换成word)
- [8. 总结](#8. 总结)
1. 技术背景
在日常开发中,我们经常需要将网页内容或者HTML格式的数据导出为Word文档供用户下载。传统的做法可能是使用模板引擎或者专门的报表工具,但对于简单的场景,我们可以利用Apache POI库来实现这一功能。
扩展,使用AI大模型生成word报告,可以先将生成的要求输出成html,再将html转成word,对于文档的样式比markdown好看很多。
2. 实现原理
核心思路是利用POIFSFileSystem类将HTML内容作为Word文档的内容插入。虽然这不是真正的DOCX格式,但对于基本的文本内容展示已经足够。
3. 核心代码分析
pom 引入
pom
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
让我们来看一下关键的实现代码:
java
try {
InputStream is = new ByteArrayInputStream(htmlContent.getBytes("GBK"));
OutputStream os = new FileOutputStream("html.doc");
POIFSFileSystem fs = new POIFSFileSystem();
fs.createDocument(is, "WordDocument");
fs.writeFilesystem(os);
os.close();
is.close();
System.out.println("Word document created successfully.");
} catch (Exception e) {
e.printStackTrace();
}
这段代码的关键步骤包括:
- 创建输入流:将HTML字符串转换为字节数组,并指定编码格式(这里是GBK)
- 创建输出流:指定输出文件路径
- 构建POI文件系统 :使用
POIFSFileSystem创建Word文档结构 - 写入文档内容:将HTML内容作为"WordDocument"写入文件系统
- 完成写入:关闭流并输出成功信息
4. HTML内容设计要点
为了让生成的Word文档有更好的显示效果,需要注意以下几点:
-
字体设置:
cssbody { font-family: '仿宋_GB2312', serif; font-size: 21.3px; line-height: 28px; } -
标题样式:
cssh1 { font-family: '方正小标宋简体', serif; font-size: 29.3px; text-align: center; } -
段落缩进:
cssp { text-indent: 2em; }
5. 实际应用场景
这种技术特别适用于以下场景:
- 自动生成各类报告和统计文档
- 将网页内容保存为可编辑的Word格式
- 批量生成格式统一的文档文件
- 在线文档导出功能
6. 注意事项
- 编码问题:注意字符编码的一致性,避免乱码
- 兼容性:这种方法生成的是较老的DOC格式,不是DOCX
- 样式限制:复杂的CSS样式可能无法完全保留
- 字体依赖:目标机器需要安装相应的中文字体
7. 结合AI模型生成word
7.1. 测试提示词
text
角色设定
你是一位资深警情数据分析专家,具备丰富的数据分析经验,能够从今日警情数据{{#xxx.xh_jt#}}和回看警情数据{{xxx.xh_hk#}}中准确提取关键信息,并按照公安系统标准格式生产《支队涉逃逸涉酒警情处置核查情况》报告。
任务要求
文档标题为《支队涉逃逸涉酒警情处置核查情况》,标题与正文之间空一行。
"一、涉逃逸涉酒警情及查处情况"部分仅使用今日警情{{#xxx.xhjq_jt#}}中统计标记为"统计"的警情。
"二、昨日未落地警情回头看情况"部分仅使用回看警情{{#xxx.jhjg_hk#}}中统计标记为"统计"且办结标志不为"已办结"的警情。
输出格式必须严格遵循示例,并确保字段完整、数据准确。
输出格式要求(严格按照以下格式输出,不得更改)
支队涉逃逸涉酒警情处置核查情况
经侦查大队对xxx年xx月xx日6时至xxx年xx月xx日6时期间122警情系统中接警反映机动车"涉逃逸涉酒"事故警情进行核查,情况如下:
一、涉逃逸涉酒警情及查处情况
共发生机动车"涉逃逸涉酒"警情X宗,其中已办结X宗,未办结X宗。
(一)已办结警情
1.xxx 大队 XX中队(警情编号:xxxx),警情时间:XXX年XXX月XX时XX分XX秒,警情地点:XXX,警情内容:xxxx。查处情况:逃逸人员XX已抓获,吹气数值:XXmg/100ml,从警情发生事件至抓获逃逸人员用时XX小时。
2.xxx 大队 XX中队(警情编号:xxxx),警情时间:XXX年XXX月XX时XX分XX秒,警情地点:XXX,警情内容:xxxx。查处情况:逃逸人员XX已抓获,吹气数值:XXmg/100ml,从警情发生事件至抓获逃逸人员用时XX小时。
(二)未办结警情
1.xxx 大队 XX中队(警情编号:xxxx),警情时间:XXX年XXX月XX时XX分XX秒,警情地点:XXX,警情内容:xxxx。查处情况:逃逸人员XX未抓获。
2.xxx 大队 XX中队(警情编号:xxxx),警情时间:XXX年XXX月XX时XX分XX秒,警情地点:XXX,警情内容:xxxx。查处情况:逃逸人员XX未抓获。
落款在右下角显示内容:
侦查大队一中队
XXX年XX月XX日(当前年月日时间)
约束条件(必须严格遵守)
文档格式xxx
字体颜色统一为黑色。
一级级标题使用字体为"方正小标宋简体",字号二号(29.3px),居中对齐
二级标题字体为"楷体_GB2312",字号三号(21.3px),居左对齐,首行缩进2个字符
正文段落使用字体"仿宋_GB2312",字号三号(21.3px),居左对齐,首行缩进2个字符;"警情编号、警情时间、警情地点、警情内容、查处情况"这几个字符需要进行加粗,"查处情况"另起一行。
文档行距设置为固定值28磅
段落首行缩进2字符,文本前后、段前段后均设置为0字符
落款前需换两行,显示在右下角,居右对齐,离右边有4个字符距离,字体为仿宋_GB2312,字号三号(21.3px)
输出:内容用html(A4)格式输出,确保标题、列表、加粗等标签完整且不输出额外的解释。
7.2. AI大模型返回的html样式
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>支队涉逃逸涉酒警情处置核查情况</title>
<style>
@page {
size: A4;
margin: 2cm;
}
body {
width: 21cm;
min-height: 29.7cm;
margin: 0 auto;
padding: 2cm;
font-family: "仿宋_GB2312", "FangSong", serif;
font-size: 21.3px;
line-height: 28pt;
color: #000000;
}
.main-title {
font-family: "方正小标宋简体", "SimHei", sans-serif;
font-size: 29.3px;
text-align: center;
line-height: 28pt;
margin-bottom: 28pt;
}
.section-title {
font-family: "楷体_GB2312", "KaiTi", serif;
font-size: 21.3px;
text-align: left;
line-height: 28pt;
margin: 14pt 0 7pt 0;
text-indent: 2em;
}
.content {
font-family: "仿宋_GB2312", "FangSong", serif;
font-size: 21.3px;
text-align: left;
line-height: 28pt;
margin: 0;
text-indent: 2em;
}
.case-item {
margin: 7pt 0;
text-indent: 0;
}
.bold-text {
font-weight: bold;
}
.signature {
font-family: "仿宋_GB2312", "FangSong", serif;
font-size: 21.3px;
text-align: right;
line-height: 28pt;
margin-top: 56pt;
padding-right: 4em;
}
.line-break {
height: 28pt;
}
</style>
</head>
<body>
<div class="main-title">支队涉逃逸涉酒警情处置核查情况</div>
<div class="line-break"></div>
<div class="content">经侦查大队对2025年11月18日6时至2025年11月19日6时期间122警情系统中接警反映机动车"涉逃逸涉酒"事故警情进行核查,情况如下:</div>
<div class="line-break"></div>
<div class="section-title">一、涉逃逸涉酒警情及查处情况</div>
<div class="content">共发生机动车"涉逃逸涉酒"警情3宗,其中已办结2宗,未办结1宗。</div>
<div class="section-title">(一)已办结警情</div>
<div class="case-item">
<div class="content">1.交警支队 一大队三中队(<span class="bold-text">警情编号:</span>JQ20251118001),<span class="bold-text">警情时间:</span>2025年11月18日08时30分25秒,<span class="bold-text">警情地点:</span>人民路与解放路交叉口,<span class="bold-text">警情内容:</span>黑色轿车追尾后逃逸,目击者称司机疑似酒驾。</div>
<div class="content"><span class="bold-text">查处情况:</span>逃逸人员张三已抓获,吹气数值:85mg/100ml,从警情发生事件至抓获逃逸人员用时2小时。</div>
</div>
<div class="case-item">
<div class="content">2.交警支队 二大队一中队(<span class="bold-text">警情编号:</span>JQ20251118002),<span class="bold-text">警情时间:</span>2025年11月18日14时20分10秒,<span class="bold-text">警情地点:</span>中山北路128号门前,<span class="bold-text">警情内容:</span>白色SUV撞伤行人后逃逸,现场有浓烈酒味。</div>
<div class="content"><span class="bold-text">查处情况:</span>逃逸人员李四已抓获,吹气数值:92mg/100ml,从警情发生事件至抓获逃逸人员用时3小时。</div>
</div>
<div class="section-title">(二)未办结警情</div>
<div class="case-item">
<div class="content">1.交警支队 三大队二中队(<span class="bold-text">警情编号:</span>JQ20251118003),<span class="bold-text">警情时间:</span>2025年11月18日21时15分40秒,<span class="bold-text">警情地点:</span>建设南路与友谊路交叉口,<span class="bold-text">警情内容:</span>灰色面包车撞坏护栏后逃逸,有目击者看到司机走路摇晃。</div>
<div class="content"><span class="bold-text">查处情况:</span>逃逸人员王五未抓获。</div>
</div>
<div class="signature">
<div>侦查大队一中队</div>
<div>2022年11月19日</div>
</div>
</body>
</html>
7.3. 转换成word
通过java代码将上诉返回的html转换成word再进行下载即可。
8. 总结
通过上述方法,我们可以快速实现HTML到Word的转换功能。虽然方案相对简单,但在许多实际项目中都能发挥重要作用。对于更复杂的需求,可以考虑集成专业的文档处理库如Flying Saucer或Docx4j。
希望这个小技巧能帮助到正在做类似功能的开发者朋友们!
下面的markdown-to-word