共计 3832 个字符,预计需要花费 10 分钟才能阅读完成。
背景与痛点
在日常开发中,我们经常需要将 ChatGPT 生成的内容导出为 Word 文档。手动操作虽然简单,但面临诸多问题:

- 格式丢失:ChatGPT 返回的 Markdown 或 HTML 内容复制到 Word 后,标题、列表等样式需要重新调整
- 批量处理困难:当需要处理大量 API 响应时,手动操作效率极低
- 编码问题:中文内容经常出现乱码或特殊字符显示异常
- 样式不一致:不同文档间的格式难以统一
技术选型对比
Python 生态中有几种主流方案可供选择:
- python-docx
- 优点:纯 Python 实现,跨平台,API 简洁
-
缺点:对复杂格式支持有限
-
Office API
- 优点:功能全面,完美兼容 Office
-
缺点:需要安装 Office 软件,Windows 环境依赖强
-
PyWin32
- 优点:直接调用 Win32 COM 接口,控制粒度细
- 缺点:仅限 Windows,稳定性较差
对于大多数场景,python-docx是最佳选择,它足够轻量且能满足基本需求。
核心实现
1. 安装准备
pip install python-docx markdown
2. 基础文档创建
from docx import Document
doc = Document()
doc.add_heading('ChatGPT 生成报告', level=1)
doc.add_paragraph('自动生成的文档内容')
doc.save('report.docx')
3. 处理 Markdown 内容
ChatGPT 返回的内容通常是 Markdown 格式,我们需要将其转换为 Word 支持的样式:
import markdown
from bs4 import BeautifulSoup
def markdown_to_word(text):
# 转换 Markdown 为 HTML
html = markdown.markdown(text)
# 解析 HTML
soup = BeautifulSoup(html, 'html.parser')
# 创建文档
doc = Document()
# 处理各级标题
for h in soup.find_all(['h1', 'h2', 'h3']):
level = int(h.name[1])
doc.add_heading(h.text, level=level)
# 处理段落
for p in soup.find_all('p'):
doc.add_paragraph(p.text)
# 处理列表
for ul in soup.find_all('ul'):
for li in ul.find_all('li'):
doc.add_paragraph(li.text, style='List Bullet')
return doc
4. 中文编码处理
确保文件保存时使用正确编码:
def save_with_encoding(doc, filename):
try:
doc.save(filename)
except UnicodeEncodeError:
# 处理特殊字符
for paragraph in doc.paragraphs:
for run in paragraph.runs:
run.text = run.text.encode('ascii', 'xmlcharrefreplace').decode('ascii')
doc.save(filename)
完整代码示例
import markdown
from bs4 import BeautifulSoup
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
def chatgpt_to_word(api_response, output_file):
"""
将 ChatGPT API 响应转换为格式化的 Word 文档
参数:
api_response: ChatGPT API 返回的 JSON 响应
output_file: 输出文件路径
"""
# 1. 解析 API 响应
content = api_response['choices'][0]['message']['content']
# 2. 转换 Markdown
html = markdown.markdown(content)
soup = BeautifulSoup(html, 'html.parser')
# 3. 创建文档
doc = Document()
# 设置默认字体
style = doc.styles['Normal']
font = style.font
font.name = '微软雅黑'
font.size = Pt(10.5)
# 4. 处理内容
for element in soup.children:
if element.name in ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']:
level = int(element.name[1])
doc.add_heading(element.text, level=level)
elif element.name == 'p':
p = doc.add_paragraph(element.text)
p.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
elif element.name == 'ul':
for li in element.find_all('li'):
doc.add_paragraph(li.text, style='List Bullet')
elif element.name == 'ol':
for li in element.find_all('li'):
doc.add_paragraph(li.text, style='List Number')
# 5. 保存文档
try:
doc.save(output_file)
except Exception as e:
print(f"保存失败: {e}")
raise
# 使用示例
if __name__ == "__main__":
# 模拟 ChatGPT API 响应
mock_response = {
"choices": [{
"message": {"content": "# 项目报告 \n\n## 概述 \n\n 这是自动生成的报告内容 \n\n- 第一点 \n- 第二点 \n\n1. 第一步 \n2. 第二步"}
}]
}
chatgpt_to_word(mock_response, "project_report.docx")
性能优化
处理大量或大文档时,需要注意:
- 流式处理:不要一次性加载所有内容,可以分批处理
- 内存管理:及时清理不再使用的变量
- 并发处理:对多个文档使用多线程
from concurrent.futures import ThreadPoolExecutor
def batch_process(responses, output_dir):
"""批量处理多个 API 响应"""
with ThreadPoolExecutor(max_workers=4) as executor:
futures = []
for i, response in enumerate(responses):
output_file = f"{output_dir}/report_{i}.docx"
futures.append(executor.submit(chatgpt_to_word, response, output_file))
for future in futures:
future.result() # 等待所有任务完成
避坑指南
- 字体兼容性
- 指定通用字体如 ”Microsoft YaHei” 或 ”Arial”
-
避免使用系统特有字体
-
跨平台问题
- Linux 环境下可能需要额外安装字体
-
路径处理使用
os.path保持跨平台兼容 -
错误处理
- 捕获并记录所有可能的异常
- 实现重试机制
import os
import logging
from datetime import datetime
logging.basicConfig(filename='word_export.log', level=logging.INFO)
def safe_export(response, output_path):
"""带错误处理的导出函数"""
try:
# 确保输出目录存在
os.makedirs(os.path.dirname(output_path), exist_ok=True)
# 记录开始时间
start_time = datetime.now()
# 执行转换
chatgpt_to_word(response, output_path)
# 记录成功
duration = (datetime.now() - start_time).total_seconds()
logging.info(f"成功导出 {output_path},耗时 {duration:.2f} 秒")
return True
except Exception as e:
logging.error(f"导出失败 {output_path}: {str(e)}")
return False
总结与扩展
本文介绍了将 ChatGPT 输出自动转换为 Word 文档的完整解决方案。实际应用中,你还可以考虑:
- PDF 导出 :使用
pdfkit或reportlab生成 PDF 版本 - 邮件集成:自动将生成的文档作为邮件附件发送
- 模板系统:预定义 Word 模板,保持公司统一风格
- API 服务:将功能封装为 REST API 供其他系统调用
通过这些扩展,可以构建一个完整的自动化文档处理流水线,大幅提升工作效率。
希望这篇指南能帮助你解决实际问题。如果在实现过程中遇到任何问题,欢迎在评论区交流讨论。
正文完
