当前位置: 代码网 > it编程>前端脚本>Python > Python将Markdown文件转换为Word(docx)完整教学

Python将Markdown文件转换为Word(docx)完整教学

2025年12月26日 Python 我要评论
在实际开发中,经常会遇到将 markdown 文档转换为 word(.docx)的需求,例如:技术文档从 markdown 迁移到 word自动生成可下载的 word 报告与 dify、fastapi

在实际开发中,经常会遇到将 markdown 文档转换为 word(.docx)的需求,例如:

  • 技术文档从 markdown 迁移到 word
  • 自动生成可下载的 word 报告
  • 与 dify、fastapi 等系统结合做文档导出

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

一、实现思路说明

整体转换流程如下:

  • 使用 markdown 库将 markdown 文本转换为 html
  • 使用 beautifulsoup 解析 html 结构
  • 遍历 html 节点,映射为 word 中的对应元素
  • 使用 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)

四、使用说明

将 markdown 文件(如 jd.md)放到当前目录

运行脚本:

python md_to_word.py

程序会在 static/ 目录下生成一个 .docx 文件,文件名为 uuid

五、适用场景

fastapi / flask 文档导出

dify 工作流中生成 word 报告

markdown 文档批量转 word

内部系统自动生成可编辑文档

六、可优化方向

增加图片(img)支持

支持代码高亮样式

表格列宽自适应

自定义标题样式、字体、行距

与 fastapi 接口结合返回下载地址

七、总结

本文实现了一个轻量、可控、易扩展的 markdown 转 word 方案,不依赖外部接口,适合后端服务或本地脚本使用。

对于需要文档导出、报告生成的场景,这种方式在稳定性和可维护性上都具有明显优势。

如果你后续需要 fastapi 接口版、dify 工作流集成版 或 样式增强版,可以在此基础上直接扩展。

到此这篇关于python将markdown文件转换为word(docx)完整教学的文章就介绍到这了,更多相关python markdown转word内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com