Files
car-maintenance-system/generate_word.py
wangziqi 35098f3028 add
2026-01-08 13:23:09 +08:00

136 lines
3.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
将实习报告Markdown转换为Word文档
"""
from docx import Document
from docx.shared import Pt, RGBColor, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
import re
def set_cell_border(cell):
"""设置表格边框"""
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
tcPr = cell._element.get_or_add_tcPr()
tcBorders = OxmlElement('w:tcBorders')
for border_name in ['top', 'left', 'bottom', 'right']:
border = OxmlElement(f'w:{border_name}')
border.set(qn('w:val'), 'single')
border.set(qn('w:sz'), '4')
border.set(qn('w:space'), '0')
border.set(qn('w:color'), '000000')
tcBorders.append(border)
tcPr.append(tcBorders)
def add_paragraph_with_format(doc, text, bold=False, font_size=12, alignment=WD_ALIGN_PARAGRAPH.LEFT):
"""添加带格式的段落"""
para = doc.add_paragraph()
para.alignment = alignment
run = para.add_run(text)
run.font.size = Pt(font_size)
run.font.name = '宋体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
if bold:
run.bold = True
return para
def add_heading(doc, text, level=1):
"""添加标题"""
heading = doc.add_heading(text, level=level)
for run in heading.runs:
run.font.size = Pt(16 - level * 2)
run.font.name = '黑体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
return heading
def parse_markdown_to_docx(md_file, docx_file):
"""解析Markdown文件并转换为Word文档"""
# 创建Word文档
doc = Document()
# 设置页面边距
sections = doc.sections
for section in sections:
section.top_margin = Inches(1)
section.bottom_margin = Inches(1)
section.left_margin = Inches(1.25)
section.right_margin = Inches(1.25)
# 读取Markdown文件
with open(md_file, 'r', encoding='utf-8') as f:
content = f.read()
# 分割成行
lines = content.split('\n')
i = 0
while i < len(lines):
line = lines[i].strip()
# 跳过空行
if not line:
i += 1
continue
# 处理标题
if line.startswith('#'):
level = line.count('#')
title_text = line.lstrip('#').strip()
if level <= 6:
add_heading(doc, title_text, min(level, 3))
else:
add_paragraph_with_format(doc, title_text, font_size=14, bold=True)
i += 1
continue
# 处理水平线
if line.startswith('---'):
doc.add_paragraph('_' * 50)
i += 1
continue
# 处理粗体文本
if line.startswith('**') and line.endswith('**'):
text = line.replace('**', '').strip()
add_paragraph_with_format(doc, text, bold=True)
i += 1
continue
# 处理列表
if line.startswith('- ') or line.startswith(''):
text = line.lstrip('').strip()
add_paragraph_with_format(doc, ' ' + text)
i += 1
continue
# 处理编号列表
if re.match(r'^\d+[、.]', line):
add_paragraph_with_format(doc, line)
i += 1
continue
# 处理普通段落(可能是多行)
para_text = line
i += 1
while i < len(lines) and lines[i].strip() and not lines[i].startswith('#') and not lines[i].startswith('-') and not lines[i].startswith('**'):
para_text += ' ' + lines[i].strip()
i += 1
add_paragraph_with_format(doc, para_text)
# 保存文档
doc.save(docx_file)
print(f"Word文档已生成: {docx_file}")
if __name__ == '__main__':
md_file = '杨璐-实习报告.md'
docx_file = '杨璐-实习报告.docx'
parse_markdown_to_docx(md_file, docx_file)