0

0

如何使用 Python 生成带语法高亮的 .docx 文件

碧海醫心

碧海醫心

发布时间:2026-02-01 14:48:08

|

980人浏览过

|

来源于php中文网

原创

如何使用 Python 生成带语法高亮的 .docx 文件

本文介绍如何借助 pygments 实现 xml(及其他语言)代码的语法高亮,并将其高质量嵌入 word 文档(.docx),突破 python-docx 原生不支持富文本着色的限制。

在 Python 中生成带语法高亮的 .docx 文件,核心难点在于:python-docx 本身不支持按词法(如标签、属性、字符串、注释)逐项设置不同字体颜色或样式——它仅允许对整个段落、运行(run)甚至单个字符应用统一格式,无法自动识别 XML 结构并差异化着色。

因此,正确路径不是手动解析 XML 并“猜”哪些该标红/蓝/绿,而是借助成熟的语法高亮引擎:Pygments

✅ 推荐方案:用 Pygments 渲染为 HTML → 提取样式化文本 → 用 python-docx 模拟还原

Pygments 是 Python 生态中最权威的通用语法高亮库,内置 XmlLexer,能精准识别 、attribute="value"、、CDATA 等全部 XML 语法单元,并输出带内联样式的 HTML(或 ANSI/RTF 等)。我们可利用其 HTML 输出作为样式蓝图,再通过 python-docx 的 Run 对象逐段复现颜色与字体效果。

maven使用方法 中文WORD版
maven使用方法 中文WORD版

本文档主要讲述的是maven使用方法;Maven是基于项目对象模型的(pom),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven将你的注意力从昨夜基层转移到项目管理层。Maven项目已经能够知道 如何构建和捆绑代码,运行测试,生成文档并宿主项目网页。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

? 示例:将 XML 高亮后插入 Word

from docx import Document
from docx.shared import RGBColor
from lxml import etree
from pygments import highlight
from pygments.lexers import XmlLexer
from pygments.formatters import HtmlFormatter
from bs4 import BeautifulSoup, Tag

def xml_to_highlighted_runs(doc, xml_path, style_name="Code"):
    """将 XML 文件高亮后,以带样式的 runs 插入 doc 的新段落"""
    # 1. 解析并美化 XML
    tree = etree.parse(xml_path)
    xml_str = etree.tostring(tree, pretty_print=True, encoding="unicode")

    # 2. 用 Pygments 生成带样式的 HTML(无 head/body,仅 code 标签)
    html = highlight(
        xml_str,
        XmlLexer(),
        HtmlFormatter(
            full=False,          # 不生成完整 HTML 页面
            noclasses=True,      # 使用内联 style,避免 CSS 依赖
            style="vs"           # 可选 'default', 'vs', 'emacs', 'monokai' 等
        )
    )

    # 3. 解析 HTML,提取 token + style
    soup = BeautifulSoup(html, "html.parser")
    code_tag = soup.find("code")
    if not code_tag:
        raise ValueError("Pygments HTML output missing  tag")

    # 4. 遍历 HTML 中的子元素(text 或纯文本)
    p = doc.add_paragraph()
    for elem in code_tag.children:
        if isinstance(elem, Tag) and elem.name == "span" and elem.get("style"):
            style = elem["style"]
            text = elem.get_text()
            run = p.add_run(text)

            # 解析 style="color:#0000FF; font-weight:bold;" → 设置颜色/粗体等
            if "color:" in style:
                hex_color = style.split("color:")[1].split(";")[0].strip("# ")
                try:
                    r, g, b = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
                    run.font.color.rgb = RGBColor(r, g, b)
                except (ValueError, TypeError):
                    pass  # 忽略无效颜色
            if "font-weight:bold" in style:
                run.bold = True
            if "font-style:italic" in style:
                run.italic = True

        elif elem.strip():  # 纯文本节点(如换行符、空格需保留)
            p.add_run(elem.strip())

# ✅ 使用示例
doc = Document()
xml_to_highlighted_runs(doc, "example.xml")
doc.save("highlighted_xml.docx")
? 依赖安装: pip install python-docx pygments beautifulsoup4 lxml

⚠️ 注意事项与最佳实践

  • 字体兼容性:Word 中若未安装高亮主题所用字体(如 Consolas),会回退为默认字体。建议在 HtmlFormatter(style=...) 中指定 font_family="Consolas, 'Courier New', monospace"(需配合自定义 CSS,当前示例用内联 style,故需额外处理)。
  • 换行与缩进:etree.tostring(..., pretty_print=True) 保证结构清晰;Pygments 默认保留空白,但 Word 中
    不被识别,因此应确保 HTML 输出使用 包裹每行,或手动按 \n 分行处理。
  • 性能优化:批量处理多个 XML 文件时,可复用 Document 对象,避免重复初始化;对超大 XML,建议分块高亮或启用 Pygments 的 full=False + nowrap=True 减少 HTML 开销。
  • 替代方案权衡
    • ❌ 直接写 OpenXML(.docx 底层):技术门槛高,易出错,不推荐新手;
    • ⚠️ 导出 PDF 再转 DOCX:失真风险高,且破坏可编辑性;
    • ✅ 当前方案平衡了可靠性、可维护性与专业度,是生产环境首选。

通过 Pygments + python-docx 协同,你不仅能渲染 XML,还可轻松扩展至 Python、JSON、HTML、SQL 等任意 Pygments 支持的语言——只需更换 XmlLexer() 为 PythonLexer() 或 JsonLexer(),即刻获得全语言高亮能力。

立即学习Python免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

771

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1324

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

362

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

901

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

425

2024.04.29

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 26万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号