使用Java将HTML内容转换为Word文档

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

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

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

4. HTML内容设计要点

为了让生成的Word文档有更好的显示效果,需要注意以下几点:

  1. 字体设置

    css 复制代码
    body {
        font-family: '仿宋_GB2312', serif;
        font-size: 21.3px;
        line-height: 28px;
    }
  2. 标题样式

    css 复制代码
    h1 {
        font-family: '方正小标宋简体', serif;
        font-size: 29.3px;
        text-align: center;
    }
  3. 段落缩进

    css 复制代码
    p {
        text-indent: 2em;
    }

5. 实际应用场景

这种技术特别适用于以下场景:

  • 自动生成各类报告和统计文档
  • 将网页内容保存为可编辑的Word格式
  • 批量生成格式统一的文档文件
  • 在线文档导出功能

6. 注意事项

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

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

相关推荐
GDAL2 小时前
HTML Form 深入全面讲解教程
html·form
一人の梅雨2 小时前
京东商品详情接口深度解析:从宙斯签名到商详数据价值重构
java·spring cloud·微服务
spencer_tseng2 小时前
org.eclipse.wst.common.project.facet.core.xml could not be read.
xml·java·eclipse
Lisonseekpan2 小时前
为什么Spring 推荐使用构造器注入而非@Autowired字段注入?
java·后端·spring·log4j
Lovely Ruby2 小时前
Cursor 迁移到 Zed 编辑器
java·缓存·编辑器
橙 子_2 小时前
在 Amazon Bedrock 中推出 Claude Sonnet 4.5:Anthropic 最智能的模型,最适合编码和复杂代理
人工智能·python·云原生·html
Gu_yyqx2 小时前
IDEA中debug的使用
java·ide·intellij-idea
老华带你飞2 小时前
个人网盘管理|基于springboot + vue个人网盘管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
宸津-代码粉碎机2 小时前
告别繁琐SQL!MyBatis - Flex让数据库操作“飞”起来
java·服务器·tomcat