Python將Markdown文件轉(zhuǎn)換為Word(docx)完整教學(xué)
在實際開發(fā)中,經(jīng)常會遇到將 Markdown 文檔轉(zhuǎn)換為 Word(.docx)的需求,例如:
- 技術(shù)文檔從 Markdown 遷移到 Word
- 自動生成可下載的 Word 報告
- 與 Dify、FastAPI 等系統(tǒng)結(jié)合做文檔導(dǎo)出

本文基于 python-docx + markdown + BeautifulSoup,實現(xiàn)一個不依賴接口、直接讀取 Markdown 文件并生成 Word 文件的完整方案,支持常見 Markdown 語法。
一、實現(xiàn)思路說明
整體轉(zhuǎn)換流程如下:
- 使用 markdown 庫將 Markdown 文本轉(zhuǎn)換為 HTML
- 使用 BeautifulSoup 解析 HTML 結(jié)構(gòu)
- 遍歷 HTML 節(jié)點(diǎn),映射為 Word 中的對應(yīng)元素
- 使用 python-docx 生成并保存 .docx 文件
支持的 Markdown 元素包括:
- 標(biāo)題(h1–h6)
- 段落
- 無序 / 有序列表
- 代碼塊
- 行內(nèi)代碼、加粗、斜體
- 表格
二、依賴安裝
pip install python-docx markdown beautifulsoup4
三、完整代碼實現(xiàn)
from docx import Document
from docx.shared import Pt
from bs4 import BeautifulSoup
import markdown
import uuid
import os
FILE_DIR = "static"
os.makedirs(FILE_DIR, exist_ok=True)
def md_to_word(md_text: str) -> str:
"""
將 Markdown 文本轉(zhuǎn)換為 Word,返回生成的文件名
"""
html = markdown.markdown(
md_text,
extensions=["extra", "tables", "fenced_code"]
)
soup = BeautifulSoup(html, "html.parser")
doc = Document()
for element in soup.contents:
handle_element(doc, element)
filename = f"{uuid.uuid4().hex}.docx"
file_path = os.path.join(FILE_DIR, filename)
doc.save(file_path)
return filename
def handle_element(doc, el):
if not hasattr(el, "name") or el.name is None:
return
# 標(biāo)題
if el.name in ["h1", "h2", "h3", "h4", "h5", "h6"]:
doc.add_heading(el.get_text(), level=int(el.name[1]))
return
# 段落
if el.name == "p":
p = doc.add_paragraph()
add_inline_text(p, el)
return
# 無序列表
if el.name == "ul":
for li in el.find_all("li", recursive=False):
p = doc.add_paragraph(style="List Bullet")
add_inline_text(p, li)
return
# 有序列表
if el.name == "ol":
for li in el.find_all("li", recursive=False):
p = doc.add_paragraph(style="List Number")
add_inline_text(p, li)
return
# 代碼塊
if el.name == "pre":
code_el = el.find("code")
code = code_el.get_text() if code_el else el.get_text()
p = doc.add_paragraph()
run = p.add_run(code)
run.font.name = "Courier New"
run.font.size = Pt(10)
return
# 表格
if el.name == "table":
rows = el.find_all("tr")
cols = rows[0].find_all(["th", "td"])
table = doc.add_table(rows=len(rows), cols=len(cols))
table.style = "Table Grid"
for r, row in enumerate(rows):
for c, cell in enumerate(row.find_all(["th", "td"])):
paragraph = table.rows[r].cells[c].paragraphs[0]
run = paragraph.add_run(cell.get_text())
if cell.name == "th":
run.bold = True
def add_inline_text(paragraph, el):
"""
處理行內(nèi)樣式:加粗、斜體、行內(nèi)代碼
"""
for node in el.contents:
if isinstance(node, str):
paragraph.add_run(node)
else:
run = paragraph.add_run(node.get_text())
if node.name == "strong":
run.bold = True
elif node.name == "em":
run.italic = True
elif node.name == "code":
run.font.name = "Courier New"
run.font.size = Pt(10)
def md_to_word_from_file(md_file_path: str) -> str:
"""
從 Markdown 文件生成 Word
"""
with open(md_file_path, "r", encoding="utf-8") as f:
md_text = f.read()
return md_to_word(md_text)
if __name__ == "__main__":
md_path = "jd.md" # Markdown 文件路徑
filename = md_to_word_from_file(md_path)
print("生成的 Word 文件:", filename)
四、使用說明
將 Markdown 文件(如 jd.md)放到當(dāng)前目錄
運(yùn)行腳本:
python md_to_word.py
程序會在 static/ 目錄下生成一個 .docx 文件,文件名為 UUID
五、適用場景
FastAPI / Flask 文檔導(dǎo)出
Dify 工作流中生成 Word 報告
Markdown 文檔批量轉(zhuǎn) Word
內(nèi)部系統(tǒng)自動生成可編輯文檔
六、可優(yōu)化方向
增加圖片(img)支持
支持代碼高亮樣式
表格列寬自適應(yīng)
自定義標(biāo)題樣式、字體、行距
與 FastAPI 接口結(jié)合返回下載地址
七、總結(jié)
本文實現(xiàn)了一個輕量、可控、易擴(kuò)展的 Markdown 轉(zhuǎn) Word 方案,不依賴外部接口,適合后端服務(wù)或本地腳本使用。
對于需要文檔導(dǎo)出、報告生成的場景,這種方式在穩(wěn)定性和可維護(hù)性上都具有明顯優(yōu)勢。
如果你后續(xù)需要 FastAPI 接口版、Dify 工作流集成版 或 樣式增強(qiáng)版,可以在此基礎(chǔ)上直接擴(kuò)展。
到此這篇關(guān)于Python將Markdown文件轉(zhuǎn)換為Word(docx)完整教學(xué)的文章就介紹到這了,更多相關(guān)Python Markdown轉(zhuǎn)Word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python將Markdown文件格式轉(zhuǎn)為Word文檔的示例代碼
- 基于Python實現(xiàn)Markdown與Word高保真互轉(zhuǎn)
- 使用Python實現(xiàn)Markdown轉(zhuǎn)Word工具
- 使用Python將Markdown文件轉(zhuǎn)換為Word的三種方法
- Python實現(xiàn)快速提取Word表格并轉(zhuǎn)Markdown
- Python使用pypandoc將markdown文件和LaTex公式轉(zhuǎn)為word
- Python將Word文檔轉(zhuǎn)換為Markdown格式
- Python文檔轉(zhuǎn)換之Markdown轉(zhuǎn)Word的高效實戰(zhàn)指南
相關(guān)文章
Django微信小程序后臺開發(fā)教程的實現(xiàn)
這篇文章主要介紹了Django微信小程序后臺開發(fā)教程的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
python實現(xiàn)提取str字符串/json中多級目錄下的某個值
今天小編就為大家分享一篇python實現(xiàn)提取str字符串/json中多級目錄下的某個值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python/Django后端使用PIL Image生成頭像縮略圖
這篇文章主要為大家詳細(xì)介紹了Python/Django后端使用PIL Image生成頭像縮略圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
Python編寫通訊錄通過數(shù)據(jù)庫存儲實現(xiàn)模糊查詢功能
數(shù)據(jù)庫存儲通訊錄,要求按姓名/電話號碼查詢,查詢條件只有一個輸入入口,自動識別輸入的是姓名還是號碼,允許模糊查詢。這篇文章主要介紹了Python編寫通訊錄,支持模糊查詢,利用數(shù)據(jù)庫存儲,需要的朋友可以參考下2019-07-07
Java Web開發(fā)過程中登陸模塊的驗證碼的實現(xiàn)方式總結(jié)
Java的SSH三大Web開發(fā)框架中,對于驗證碼這一基本功能的處理都比較得心應(yīng)手,接下來我們就來看看整理出的Java Web開發(fā)過程中登陸模塊的驗證碼的實現(xiàn)方式總結(jié):2016-05-05
Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析
這篇文章主要介紹了Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10
python初學(xué)者,用python實現(xiàn)基本的學(xué)生管理系統(tǒng)(python3)代碼實例
這篇文章主要介紹了用python實現(xiàn)學(xué)生管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
簡單實現(xiàn)Python爬取網(wǎng)絡(luò)圖片
這篇文章主要教大家如何簡單實現(xiàn)Python爬取網(wǎng)絡(luò)圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
PyQt5?python?數(shù)據(jù)庫?表格動態(tài)增刪改詳情
這篇文章主要介紹了PyQt5?python?數(shù)據(jù)庫?表格動態(tài)增刪改詳情,首先手動連接數(shù)據(jù)庫與下一個的程序連接數(shù)據(jù)庫是獨(dú)立的2個部分,下面來看看文章的詳細(xì)介紹2022-01-01

