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

本文基于 python-docx + markdown + BeautifulSoup,實(shí)現(xiàn)一個(gè)不依賴(lài)接口、直接讀取 Markdown 文件并生成 Word 文件的完整方案,支持常見(jiàn) Markdown 語(yǔ)法。
一、實(shí)現(xiàn)思路說(shuō)明
整體轉(zhuǎn)換流程如下:
- 使用 markdown 庫(kù)將 Markdown 文本轉(zhuǎn)換為 HTML
- 使用 BeautifulSoup 解析 HTML 結(jié)構(gòu)
- 遍歷 HTML 節(jié)點(diǎn),映射為 Word 中的對(duì)應(yīng)元素
- 使用 python-docx 生成并保存 .docx 文件
支持的 Markdown 元素包括:
- 標(biāo)題(h1–h6)
- 段落
- 無(wú)序 / 有序列表
- 代碼塊
- 行內(nèi)代碼、加粗、斜體
- 表格
二、依賴(lài)安裝
pip install python-docx markdown beautifulsoup4
三、完整代碼實(shí)現(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
# 無(wú)序列表
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)
四、使用說(shuō)明
將 Markdown 文件(如 jd.md)放到當(dāng)前目錄
運(yùn)行腳本:
python md_to_word.py
程序會(huì)在 static/ 目錄下生成一個(gè) .docx 文件,文件名為 UUID
五、適用場(chǎng)景
FastAPI / Flask 文檔導(dǎo)出
Dify 工作流中生成 Word 報(bào)告
Markdown 文檔批量轉(zhuǎn) Word
內(nèi)部系統(tǒng)自動(dòng)生成可編輯文檔
六、可優(yōu)化方向
增加圖片(img)支持
支持代碼高亮樣式
表格列寬自適應(yīng)
自定義標(biāo)題樣式、字體、行距
與 FastAPI 接口結(jié)合返回下載地址
七、總結(jié)
本文實(shí)現(xiàn)了一個(gè)輕量、可控、易擴(kuò)展的 Markdown 轉(zhuǎn) Word 方案,不依賴(lài)外部接口,適合后端服務(wù)或本地腳本使用。
對(duì)于需要文檔導(dǎo)出、報(bào)告生成的場(chǎng)景,這種方式在穩(wěn)定性和可維護(hù)性上都具有明顯優(yōu)勢(shì)。
如果你后續(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python將Markdown文件格式轉(zhuǎn)為Word文檔的示例代碼
- 基于Python實(shí)現(xiàn)Markdown與Word高保真互轉(zhuǎn)
- 使用Python實(shí)現(xiàn)Markdown轉(zhuǎn)Word工具
- 使用Python將Markdown文件轉(zhuǎn)換為Word的三種方法
- Python實(shí)現(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的高效實(shí)戰(zhàn)指南
相關(guān)文章
基于Python pyecharts實(shí)現(xiàn)多種圖例代碼解析
這篇文章主要介紹了基于Python pyecharts實(shí)現(xiàn)多種圖例代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Python使用PyPDF進(jìn)行PDF操作的代碼示例
PDF 是一種非常常見(jiàn)的文件格式,用于文檔共享、電子書(shū)、合同等場(chǎng)景,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),能夠高效地操作 PDF 文件是一個(gè)重要技能,本文將介紹如何使用 Python 的 PyPDF 庫(kù)完成一些常見(jiàn)的 PDF 處理任務(wù),并分享實(shí)戰(zhàn)經(jīng)驗(yàn),需要的朋友可以參考下2025-01-01
詳解python3類(lèi)型注釋annotations實(shí)用案例
這篇文章主要介紹了詳解python3類(lèi)型注釋annotations實(shí)用案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Pytorch技巧:DataLoader的collate_fn參數(shù)使用詳解
今天小編就為大家分享一篇Pytorch技巧:DataLoader的collate_fn參數(shù)使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python庫(kù)使用Fire庫(kù)生成命令行參數(shù)
Python Fire是一個(gè)開(kāi)源庫(kù),能把Python對(duì)象轉(zhuǎn)換為命令行界面,F(xiàn)ire庫(kù)是一個(gè)非常有用的工具,它可以幫助開(kāi)發(fā)人員創(chuàng)建命令行界面,并且可以將任何Python對(duì)象轉(zhuǎn)換為命令行界面,這篇文章主要介紹了python庫(kù)使用Fire庫(kù)生成命令行參數(shù),需要的朋友可以參考下2024-02-02
2行Python代碼實(shí)現(xiàn)給pdf文件添加水印
你們?cè)诮oPDF文件添加水印時(shí),還在手動(dòng)一頁(yè)頁(yè)添加嗎?本文小編為大家?guī)?lái)了一個(gè)更方便的方法,即用Python的2行代碼來(lái)實(shí)現(xiàn),感興趣的小伙伴可以學(xué)習(xí)一下2022-02-02
Python使用pickle進(jìn)行序列化和反序列化的示例代碼
這篇文章主要介紹了Python使用pickle進(jìn)行序列化和反序列化,幫助大家更好的理解和使用python的pickle庫(kù),感興趣的朋友可以了解下2020-09-09
詳盡講述用Python的Django框架測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的教程
這篇文章主要介紹了詳盡講述用Python的Django框架測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的教程,主要使用TDD工具,全文介紹非常詳細(xì),需要的朋友可以參考下2015-04-04
使用Python隨機(jī)生成數(shù)據(jù)的方法
這篇文章主要介紹了使用Python隨機(jī)生成數(shù)據(jù)的方法,在日常開(kāi)發(fā)中竟然會(huì)遇到需要測(cè)試大量數(shù)據(jù)的地方,那么隨機(jī)生成數(shù)據(jù)就可以有效的加快我們的效率,通過(guò)Python_Faker生成測(cè)試數(shù)據(jù)需要安裝Faker包,需要的朋友可以參考下2023-10-10

