#!/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)