使用Java將HTML內(nèi)容轉(zhuǎn)換為Word文檔的實(shí)現(xiàn)步驟
1. 技術(shù)背景
在日常開發(fā)中,我們經(jīng)常需要將網(wǎng)頁內(nèi)容或者HTML格式的數(shù)據(jù)導(dǎo)出為Word文檔供用戶下載。傳統(tǒng)的做法可能是使用模板引擎或者專門的報(bào)表工具,但對(duì)于簡單的場(chǎng)景,我們可以利用Apache POI庫來實(shí)現(xiàn)這一功能。
擴(kuò)展,使用AI大模型生成word報(bào)告,可以先將生成的要求輸出成html,再將html轉(zhuǎn)成word,對(duì)于文檔的樣式比markdown好看很多。
2. 實(shí)現(xiàn)原理
核心思路是利用POIFSFileSystem類將HTML內(nèi)容作為Word文檔的內(nèi)容插入。雖然這不是真正的DOCX格式,但對(duì)于基本的文本內(nèi)容展示已經(jīng)足夠。
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>
讓我們來看一下關(guān)鍵的實(shí)現(xiàn)代碼:
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();
}
這段代碼的關(guān)鍵步驟包括:
- 創(chuàng)建輸入流:將HTML字符串轉(zhuǎn)換為字節(jié)數(shù)組,并指定編碼格式(這里是GBK)
- 創(chuàng)建輸出流:指定輸出文件路徑
- 構(gòu)建POI文件系統(tǒng):使用
POIFSFileSystem創(chuàng)建Word文檔結(jié)構(gòu) - 寫入文檔內(nèi)容:將HTML內(nèi)容作為"WordDocument"寫入文件系統(tǒng)
- 完成寫入:關(guān)閉流并輸出成功信息
4. HTML內(nèi)容設(shè)計(jì)要點(diǎn)
為了讓生成的Word文檔有更好的顯示效果,需要注意以下幾點(diǎn):
字體設(shè)置:
body {
font-family: '仿宋_GB2312', serif;
font-size: 21.3px;
line-height: 28px;
}
標(biāo)題樣式:
h1 {
font-family: '方正小標(biāo)宋簡體', serif;
font-size: 29.3px;
text-align: center;
}
段落縮進(jìn):
p {
text-indent: 2em;
}
5. 實(shí)際應(yīng)用場(chǎng)景
這種技術(shù)特別適用于以下場(chǎng)景:
- 自動(dòng)生成各類報(bào)告和統(tǒng)計(jì)文檔
- 將網(wǎng)頁內(nèi)容保存為可編輯的Word格式
- 批量生成格式統(tǒng)一的文檔文件
- 在線文檔導(dǎo)出功能
6. 注意事項(xiàng)
- 編碼問題:注意字符編碼的一致性,避免亂碼
- 兼容性:這種方法生成的是較老的DOC格式,不是DOCX
- 樣式限制:復(fù)雜的CSS樣式可能無法完全保留
- 字體依賴:目標(biāo)機(jī)器需要安裝相應(yīng)的中文字體
7. 結(jié)合AI模型生成word
7.1. 測(cè)試提示詞
角色設(shè)定
你是一位資深警情數(shù)據(jù)分析專家,具備豐富的數(shù)據(jù)分析經(jīng)驗(yàn),能夠從今日警情數(shù)據(jù){{#xxx.xh_jt#}}和回看警情數(shù)據(jù){{xxx.xh_hk#}}中準(zhǔn)確提取關(guān)鍵信息,并按照公安系統(tǒng)標(biāo)準(zhǔn)格式生產(chǎn)《支隊(duì)涉逃逸涉酒警情處置核查情況》報(bào)告。
任務(wù)要求
文檔標(biāo)題為《支隊(duì)涉逃逸涉酒警情處置核查情況》,標(biāo)題與正文之間空一行。
“一、涉逃逸涉酒警情及查處情況”部分僅使用今日警情{{#xxx.xhjq_jt#}}中統(tǒng)計(jì)標(biāo)記為“統(tǒng)計(jì)”的警情。
“二、昨日未落地警情回頭看情況”部分僅使用回看警情{{#xxx.jhjg_hk#}}中統(tǒng)計(jì)標(biāo)記為“統(tǒng)計(jì)”且辦結(jié)標(biāo)志不為“已辦結(jié)”的警情。
輸出格式必須嚴(yán)格遵循示例,并確保字段完整、數(shù)據(jù)準(zhǔn)確。
輸出格式要求(嚴(yán)格按照以下格式輸出,不得更改)
支隊(duì)涉逃逸涉酒警情處置核查情況
經(jīng)偵查大隊(duì)對(duì)xxx年xx月xx日6時(shí)至xxx年xx月xx日6時(shí)期間122警情系統(tǒng)中接警反映機(jī)動(dòng)車“涉逃逸涉酒”事故警情進(jìn)行核查,情況如下:
一、涉逃逸涉酒警情及查處情況
共發(fā)生機(jī)動(dòng)車“涉逃逸涉酒”警情X宗,其中已辦結(jié)X宗,未辦結(jié)X宗。
(一)已辦結(jié)警情
1.xxx 大隊(duì) XX中隊(duì)(警情編號(hào):xxxx),警情時(shí)間:XXX年XXX月XX時(shí)XX分XX秒,警情地點(diǎn):XXX,警情內(nèi)容:xxxx。查處情況:逃逸人員XX已抓獲,吹氣數(shù)值:XXmg/100ml,從警情發(fā)生事件至抓獲逃逸人員用時(shí)XX小時(shí)。
2.xxx 大隊(duì) XX中隊(duì)(警情編號(hào):xxxx),警情時(shí)間:XXX年XXX月XX時(shí)XX分XX秒,警情地點(diǎn):XXX,警情內(nèi)容:xxxx。查處情況:逃逸人員XX已抓獲,吹氣數(shù)值:XXmg/100ml,從警情發(fā)生事件至抓獲逃逸人員用時(shí)XX小時(shí)。
(二)未辦結(jié)警情
1.xxx 大隊(duì) XX中隊(duì)(警情編號(hào):xxxx),警情時(shí)間:XXX年XXX月XX時(shí)XX分XX秒,警情地點(diǎn):XXX,警情內(nèi)容:xxxx。查處情況:逃逸人員XX未抓獲。
2.xxx 大隊(duì) XX中隊(duì)(警情編號(hào):xxxx),警情時(shí)間:XXX年XXX月XX時(shí)XX分XX秒,警情地點(diǎn):XXX,警情內(nèi)容:xxxx。查處情況:逃逸人員XX未抓獲。
落款在右下角顯示內(nèi)容:
偵查大隊(duì)一中隊(duì)
XXX年XX月XX日(當(dāng)前年月日時(shí)間)
約束條件(必須嚴(yán)格遵守)
文檔格式xxx
字體顏色統(tǒng)一為黑色。
一級(jí)級(jí)標(biāo)題使用字體為“方正小標(biāo)宋簡體”,字號(hào)二號(hào)(29.3px),居中對(duì)齊
二級(jí)標(biāo)題字體為“楷體_GB2312”,字號(hào)三號(hào)(21.3px),居左對(duì)齊,首行縮進(jìn)2個(gè)字符
正文段落使用字體“仿宋_GB2312”,字號(hào)三號(hào)(21.3px),居左對(duì)齊,首行縮進(jìn)2個(gè)字符;“警情編號(hào)、警情時(shí)間、警情地點(diǎn)、警情內(nèi)容、查處情況”這幾個(gè)字符需要進(jìn)行加粗,“查處情況”另起一行。
文檔行距設(shè)置為固定值28磅
段落首行縮進(jìn)2字符,文本前后、段前段后均設(shè)置為0字符
落款前需換兩行,顯示在右下角,居右對(duì)齊,離右邊有4個(gè)字符距離,字體為仿宋_GB2312,字號(hào)三號(hào)(21.3px)
輸出:內(nèi)容用html(A4)格式輸出,確保標(biāo)題、列表、加粗等標(biāo)簽完整且不輸出額外的解釋。
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>支隊(duì)涉逃逸涉酒警情處置核查情況</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: "方正小標(biāo)宋簡體", "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">支隊(duì)涉逃逸涉酒警情處置核查情況</div>
<div class="line-break"></div>
<div class="content">經(jīng)偵查大隊(duì)對(duì)2025年11月18日6時(shí)至2025年11月19日6時(shí)期間122警情系統(tǒng)中接警反映機(jī)動(dòng)車"涉逃逸涉酒"事故警情進(jìn)行核查,情況如下:</div>
<div class="line-break"></div>
<div class="section-title">一、涉逃逸涉酒警情及查處情況</div>
<div class="content">共發(fā)生機(jī)動(dòng)車"涉逃逸涉酒"警情3宗,其中已辦結(jié)2宗,未辦結(jié)1宗。</div>
<div class="section-title">(一)已辦結(jié)警情</div>
<div class="case-item">
<div class="content">1.交警支隊(duì) 一大隊(duì)三中隊(duì)(<span class="bold-text">警情編號(hào):</span>JQ20251118001),<span class="bold-text">警情時(shí)間:</span>2025年11月18日08時(shí)30分25秒,<span class="bold-text">警情地點(diǎn):</span>人民路與解放路交叉口,<span class="bold-text">警情內(nèi)容:</span>黑色轎車追尾后逃逸,目擊者稱司機(jī)疑似酒駕。</div>
<div class="content"><span class="bold-text">查處情況:</span>逃逸人員張三已抓獲,吹氣數(shù)值:85mg/100ml,從警情發(fā)生事件至抓獲逃逸人員用時(shí)2小時(shí)。</div>
</div>
<div class="case-item">
<div class="content">2.交警支隊(duì) 二大隊(duì)一中隊(duì)(<span class="bold-text">警情編號(hào):</span>JQ20251118002),<span class="bold-text">警情時(shí)間:</span>2025年11月18日14時(shí)20分10秒,<span class="bold-text">警情地點(diǎn):</span>中山北路128號(hào)門前,<span class="bold-text">警情內(nèi)容:</span>白色SUV撞傷行人后逃逸,現(xiàn)場(chǎng)有濃烈酒味。</div>
<div class="content"><span class="bold-text">查處情況:</span>逃逸人員李四已抓獲,吹氣數(shù)值:92mg/100ml,從警情發(fā)生事件至抓獲逃逸人員用時(shí)3小時(shí)。</div>
</div>
<div class="section-title">(二)未辦結(jié)警情</div>
<div class="case-item">
<div class="content">1.交警支隊(duì) 三大隊(duì)二中隊(duì)(<span class="bold-text">警情編號(hào):</span>JQ20251118003),<span class="bold-text">警情時(shí)間:</span>2025年11月18日21時(shí)15分40秒,<span class="bold-text">警情地點(diǎn):</span>建設(shè)南路與友誼路交叉口,<span class="bold-text">警情內(nèi)容:</span>灰色面包車撞壞護(hù)欄后逃逸,有目擊者看到司機(jī)走路搖晃。</div>
<div class="content"><span class="bold-text">查處情況:</span>逃逸人員王五未抓獲。</div>
</div>
<div class="signature">
<div>偵查大隊(duì)一中隊(duì)</div>
<div>2022年11月19日</div>
</div>
</body>
</html>
7.3. 轉(zhuǎn)換成word
通過java代碼將上訴返回的html轉(zhuǎn)換成word再進(jìn)行下載即可。
8. 總結(jié)
通過上述方法,我們可以快速實(shí)現(xiàn)HTML到Word的轉(zhuǎn)換功能。雖然方案相對(duì)簡單,但在許多實(shí)際項(xiàng)目中都能發(fā)揮重要作用。對(duì)于更復(fù)雜的需求,可以考慮集成專業(yè)的文檔處理庫如Flying Saucer或Docx4j。
以上就是使用Java將HTML內(nèi)容轉(zhuǎn)換為Word文檔的實(shí)現(xiàn)步驟的詳細(xì)內(nèi)容,更多關(guān)于Java HTML內(nèi)容轉(zhuǎn)為Word文檔的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決程序包org.springframework.test.context不存在
這篇文章主要介紹了解決程序包org.springframework.test.context不存在的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決
這篇文章主要介紹了SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Mybatis批量修改聯(lián)合主鍵數(shù)據(jù)的兩種方法
最近遇上需要批量修改有聯(lián)合主鍵的表數(shù)據(jù),找很多資料都不是太合適,最終自己摸索總結(jié)了兩種方式可以批量修改數(shù)據(jù),對(duì)Mybatis批量修改數(shù)據(jù)相關(guān)知識(shí)感興趣的朋友一起看看吧2022-04-04
利用Postman和Chrome的開發(fā)者功能探究項(xiàng)目(畢業(yè)設(shè)計(jì)項(xiàng)目)
這篇文章主要介紹了利用Postman和Chrome的開發(fā)者功能探究項(xiàng)目(畢業(yè)設(shè)計(jì)項(xiàng)目),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

