使用Java將HTML內容轉換為Word文檔的實現步驟
1. 技術背景
在日常開發(fā)中,我們經常需要將網頁內容或者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();
}
這段代碼的關鍵步驟包括:
- 創(chuàng)建輸入流:將HTML字符串轉換為字節(jié)數組,并指定編碼格式(這里是GBK)
- 創(chuàng)建輸出流:指定輸出文件路徑
- 構建POI文件系統:使用
POIFSFileSystem創(chuàng)建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警情系統中接警反映機動車“涉逃逸涉酒”事故警情進行核查,情況如下:
一、涉逃逸涉酒警情及查處情況
共發(fā)生機動車“涉逃逸涉酒”警情X宗,其中已辦結X宗,未辦結X宗。
(一)已辦結警情
1.xxx 大隊 XX中隊(警情編號:xxxx),警情時間:XXX年XXX月XX時XX分XX秒,警情地點:XXX,警情內容:xxxx。查處情況:逃逸人員XX已抓獲,吹氣數值:XXmg/100ml,從警情發(fā)生事件至抓獲逃逸人員用時XX小時。
2.xxx 大隊 XX中隊(警情編號:xxxx),警情時間:XXX年XXX月XX時XX分XX秒,警情地點:XXX,警情內容:xxxx。查處情況:逃逸人員XX已抓獲,吹氣數值:XXmg/100ml,從警情發(fā)生事件至抓獲逃逸人員用時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">共發(fā)生機動車"涉逃逸涉酒"警情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,從警情發(fā)生事件至抓獲逃逸人員用時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,從警情發(fā)生事件至抓獲逃逸人員用時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的轉換功能。雖然方案相對簡單,但在許多實際項目中都能發(fā)揮重要作用。對于更復雜的需求,可以考慮集成專業(yè)的文檔處理庫如Flying Saucer或Docx4j。
以上就是使用Java將HTML內容轉換為Word文檔的實現步驟的詳細內容,更多關于Java HTML內容轉為Word文檔的資料請關注腳本之家其它相關文章!
相關文章
java中同類對象之間的compareTo()和compare()方法對比分析
這篇文章主要介紹了java中同類對象之間的compareTo()和compare()方法對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
java后臺調用HttpURLConnection類模擬瀏覽器請求實例(可用于接口調用)
這篇文章主要介紹了java后臺調用HttpURLConnection類模擬瀏覽器請求實例,該實例可用于接口調用,具有一定的實用價值,需要的朋友可以參考下2014-10-10
Debian 7 和 Debian 8 用戶安裝 Java 8的方法
Oracle Java 8 穩(wěn)定版本近期已發(fā)布,有很多新的特征變化。其中,有功能的程序支持通過“Lambda項目 ”,收到了一些安全更新和界面改進上的bug修復,使得開發(fā)人員的工作更容易。2014-03-03
Java報錯java.awt.AWTException: AWT的解決方法
在Java圖形用戶界面(GUI)編程中,java.awt.AWTException是一個常見的異常,它通常與AWT(Abstract Window Toolkit)組件相關,這個異??赡茉趪L試進行與窗口、圖形環(huán)境或系統剪貼板等操作時拋出,本文將詳細探討AWTException的成因,并提供多種解決方案2024-12-12

