1. 技术背景
在日常开发中,我们经常需要将网页内容或者html格式的数据导出为word文档供用户下载。传统的做法可能是使用模板引擎或者专门的报表工具,但对于简单的场景,我们可以利用apache poi库来实现这一功能。
扩展,使用ai大模型生成word报告,可以先将生成的要求输出成html,再将html转成word,对于文档的样式比markdown好看很多。
2. 实现原理
核心思路是利用poifsfilesystem类将html内容作为word文档的内容插入。虽然这不是真正的docx格式,但对于基本的文本内容展示已经足够。
3. 核心代码分析
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>
让我们来看一下关键的实现代码:
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文档有更好的显示效果,需要注意以下几点:
字体设置:
body {
font-family: '仿宋_gb2312', serif;
font-size: 21.3px;
line-height: 28px;
}
标题样式:
h1 {
font-family: '方正小标宋简体', serif;
font-size: 29.3px;
text-align: center;
}
段落缩进:
p {
text-indent: 2em;
}
5. 实际应用场景
这种技术特别适用于以下场景:
- 自动生成各类报告和统计文档
- 将网页内容保存为可编辑的word格式
- 批量生成格式统一的文档文件
- 在线文档导出功能
6. 注意事项
- 编码问题:注意字符编码的一致性,避免乱码
- 兼容性:这种方法生成的是较老的doc格式,不是docx
- 样式限制:复杂的css样式可能无法完全保留
- 字体依赖:目标机器需要安装相应的中文字体
7. 结合ai模型生成word
7.1. 测试提示词
角色设定
你是一位资深警情数据分析专家,具备丰富的数据分析经验,能够从今日警情数据{{#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样式
<!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。
以上就是使用java将html内容转换为word文档的实现步骤的详细内容,更多关于java html内容转为word文档的资料请关注代码网其它相关文章!
发表评论