跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 实现 Markdown 转 Word(docx)文档转换方案

介绍使用 Python 将 Markdown 文件转换为 Word(.docx)格式的完整方案。通过 python-docx、markdown 和 BeautifulSoup 库,解析 Markdown 语法并映射为 Word 文档元素。支持标题、段落、列表、代码块及表格等常见格式。无需依赖外部接口,可直接读取本地文件生成可编辑文档,适用于技术文档迁移、报告自动生成等场景。

Kubernet发布于 2026/3/30更新于 2026/5/3055 浏览
Python 实现 Markdown 转 Word(docx)文档转换方案

Python 实现 Markdown 转 Word(docx)文档转换方案

在实际开发中,经常会遇到将 Markdown 文档转换为 Word(.docx)的需求,例如技术文档从 Markdown 迁移到 Word,或自动生成可下载的 Word 报告。

本文基于 python-docx、markdown 和 BeautifulSoup 库,实现一个不依赖接口、直接读取 Markdown 文件并生成 Word 文件的完整方案,支持常见 Markdown 语法。

一、实现思路说明

整体转换流程如下:

  1. 使用 markdown 库将 Markdown 文本转换为 HTML
  2. 使用 BeautifulSoup 解析 HTML 结构
  3. 遍历 HTML 节点,映射为 Word 中的对应元素
  4. 使用 python-docx 生成并保存 .docx 文件

支持的 Markdown 元素包括:

  • 标题(h1–h6)
  • 段落
  • 无序 / 有序列表
  • 代码块
  • 行内代码、加粗、斜体
  • 表格

二、依赖安装

pip install python-docx markdown beautifulsoup4

三、完整代码实现

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 文本转换为 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
    # 标题
    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):
    """ 处理行内样式:加粗、斜体、行内代码 """
    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)

四、使用说明

  1. 将 Markdown 文件(如 jd.md)放到当前目录
  2. 运行脚本:
python md_to_word.py
  1. 程序会在 static/目录下生成一个 .docx 文件,文件名为 UUID

五、适用场景

  • FastAPI / Flask 文档导出
  • Dify 工作流中生成 Word 报告
  • Markdown 文档批量转 Word
  • 内部系统自动生成可编辑文档

六、可优化方向

  • 增加图片(img)支持
  • 支持代码高亮样式
  • 表格列宽自适应
  • 自定义标题样式、字体、行距
  • 与 FastAPI 接口结合返回下载地址

七、总结

本文实现了一个轻量、可控、易扩展的 Markdown 转 Word 方案,不依赖外部接口,适合后端服务或本地脚本使用。对于需要文档导出、报告生成的场景,这种方式在稳定性和可维护性上都具有明显优势。

目录

  1. Python 实现 Markdown 转 Word(docx)文档转换方案
  2. 一、实现思路说明
  3. 二、依赖安装
  4. 三、完整代码实现
  5. 四、使用说明
  6. 五、适用场景
  7. 六、可优化方向
  8. 七、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 使用 PyQt5 开发二维码生成器桌面应用
  • 别瞎改了!直接抄DeepSeek这5大降AIGC指令,搭配3款超有效工具,亲测98%暴降至5%!
  • Llama-Factory 模型评估系统:科学衡量微调后性能变化
  • AI Agent 框架选型指南:OpenClaw、LangChain、AutoGPT、CrewAI 深度对比
  • MHT-MD761 与云影无人机的集成实操要点,硬件安装与接口对接
  • Z-Image 模型结构解析与 RTX 4090 适配原理
  • 前端实战:从零实现浏览器桌面通知功能
  • Claude Code macOS 安装与更新指南
  • VSCode + Continue + Ollama 实现本地 AI 编程助手
  • OpenClaw 完整部署指南:安装 + 三大 Coding Plan 配置 + CC Switch + 飞书机器人
  • 从 MVP 到千万级并发:AI 在前后端开发中的差异化落地
  • OpenClaw 配置飞书机器人指南(本地部署)
  • OpenClaw QQ 机器人插件安装与配置指南
  • Quartus Prime 新手完全使用指南
  • Microsoft 365 Copilot 与 Copilot Chat 详细对比
  • AI 生成前端 UI 效果差?三步提升设计质感
  • LIO-SAM 算法在 Ubuntu 22.04 与 ROS2 Humble 下的仿真实现
  • 基于低代码引擎的企业级审批系统搭建实战
  • 数据结构详解:KMP 算法、Trie 树与并查集
  • 本地 AI 服务远程安全访问方案:基于 P2P 虚拟组网技术

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online