使用Java将HTML内容转换为Word文档的实现步骤

 更新时间:2025年12月22日 09:08:48   作者:liuhm~  
这篇文章主要介绍了如何使用Java代码将HTML内容转换为Word文档,这个功能在很多业务场景中都非常有用,比如自动生成报告、合同、证书等正式文档,需要的朋友可以参考下

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();
}

这段代码的关键步骤包括:

  1. 创建输入流:将HTML字符串转换为字节数组,并指定编码格式(这里是GBK)
  2. 创建输出流:指定输出文件路径
  3. 构建POI文件系统:使用POIFSFileSystem创建Word文档结构
  4. 写入文档内容:将HTML内容作为"WordDocument"写入文件系统
  5. 完成写入:关闭流并输出成功信息

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. 注意事项

  1. 编码问题:注意字符编码的一致性,避免乱码
  2. 兼容性:这种方法生成的是较老的DOC格式,不是DOCX
  3. 样式限制:复杂的CSS样式可能无法完全保留
  4. 字体依赖:目标机器需要安装相应的中文字体

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文档的资料请关注脚本之家其它相关文章!

相关文章

  • Java中join线程操作实例分析

    Java中join线程操作实例分析

    这篇文章主要介绍了Java中join线程操作,结合实例形式分析了java使用join方法操作线程的相关原理与实现技巧,需要的朋友可以参考下
    2019-09-09
  • 解决程序包org.springframework.test.context不存在

    解决程序包org.springframework.test.context不存在

    这篇文章主要介绍了解决程序包org.springframework.test.context不存在的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringMVC拦截器零基础掌握

    SpringMVC拦截器零基础掌握

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器的概念及入门案例,感兴趣的可以尝试一下
    2023-03-03
  • Java基础之super关键字浅析

    Java基础之super关键字浅析

    java中的super关键字是一个引用变量,用于引用直接父类对象,下面这篇文章主要给大家介绍了关于Java基础之super关键字的相关资料,需要的朋友可以参考下
    2022-04-04
  • SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决

    SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决

    这篇文章主要介绍了SpringBoot 配置文件中配置的中文,程序读取出来是乱码的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Mybatis批量修改联合主键数据的两种方法

    Mybatis批量修改联合主键数据的两种方法

    最近遇上需要批量修改有联合主键的表数据,找很多资料都不是太合适,最终自己摸索总结了两种方式可以批量修改数据,对Mybatis批量修改数据相关知识感兴趣的朋友一起看看吧
    2022-04-04
  • Struts2 使用OGNL遍历map方法详解

    Struts2 使用OGNL遍历map方法详解

    这篇文章主要介绍了Struts2 使用OGNL遍历map方法详解,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • 利用Postman和Chrome的开发者功能探究项目(毕业设计项目)

    利用Postman和Chrome的开发者功能探究项目(毕业设计项目)

    这篇文章主要介绍了利用Postman和Chrome的开发者功能探究项目(毕业设计项目),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • spring boot admin 搭建详解

    spring boot admin 搭建详解

    本篇文章主要介绍了spring boot admin 搭建详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Java Thread中join方法使用举例详解

    Java Thread中join方法使用举例详解

    Java Thread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍了Java Thread中join方法使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07

最新评论