【无标题】word 中的中文排序

复制代码
import docx
from docx import Document
from docx.shared import Pt
from pypinyin import pinyin, Style, lazy_pinyin
import re


def get_first_char_pinyin(text):
    """获取中文段落开头汉字的拼音(首字母大写)"""
    if re.match(r'[\u4e00-\u9fff]', text):
        return lazy_pinyin(text[0], style=Style.FIRST_LETTER)[0].upper()
    return ''


def is_chinese_paragraph(paragraph):
    """判断段落是否为中文段落"""
    return bool(re.match(r'[\u4e00-\u9fff]', paragraph.text.strip()))


def apply_font_to_paragraph(paragraph, font_name='宋体'):
    """为段落应用指定的字体"""
    for run in paragraph.runs:
        try:
            run.font.name = font_name
        except ValueError:
            # 如果字体名称无效或不受支持,可能会引发ValueError
            # 这里可以捕获异常并做适当处理,比如记录日志或回退到默认字体
            pass


def sort_paragraphs(paragraphs):
    """根据要求排序段落,处理空文本段落"""
    chinese_paragraphs = []
    english_paragraphs = []

    for p in paragraphs:
        stripped_text = p.text.strip()
        if stripped_text:  # 只处理非空文本段落
            if is_chinese_paragraph(p):
                # 对中文段落,使用拼音首字母作为排序键(如果文本非空)
                # 注意:这里假设 get_first_char_pinyin 能处理单字符输入
                chinese_paragraphs.append(
                    (p, get_first_char_pinyin(stripped_text[0]) if len(stripped_text) > 0 else ''))
            else:
                # 对英文段落,使用文本首字母小写作为排序键(如果文本非空)
                english_paragraphs.append((p, stripped_text[0].lower() if len(stripped_text) > 0 else ''))

                # 对中英文段落分别按排序键排序(注意这里我们存储了段落和排序键的元组)
    chinese_paragraphs.sort(key=lambda x: x[1])
    english_paragraphs.sort(key=lambda x: x[1])

    # 提取排序后的段落对象列表
    sorted_chinese = [p for p, _ in chinese_paragraphs]
    sorted_english = [p for p, _ in english_paragraphs]

    # 合并排序后的中英文段落列表
    return sorted_chinese + sorted_english


def main(input_path, output_path):
    # 读取Word文档
    doc = Document(input_path)
    paragraphs = doc.paragraphs

    # 排序段落
    sorted_paragraphs = sort_paragraphs(paragraphs)

    # 创建新的Word文档并添加排序后的段落
    new_doc = Document()
    for para in sorted_paragraphs:
        new_para = new_doc.add_paragraph()
        # 复制段落内容
        new_para.add_run(para.text)
        # 为中文段落应用宋体字体(如果可用)
        if is_chinese_paragraph(para):
            apply_font_to_paragraph(new_para, '宋体')

            # 保存新的Word文档
    new_doc.save(output_path)


if __name__ == "__main__":
    input_path = 'input.docx'  # 输入的Word文件路径
    output_path = 'sorted_output.docx'  # 输出的Word文件路径
    main(input_path, output_path)
相关推荐
梦里小白龙21 分钟前
java 通过Minio上传文件
java·开发语言
m0_5613596725 分钟前
基于C++的机器学习库开发
开发语言·c++·算法
星空露珠32 分钟前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
2401_8324027533 分钟前
C++中的类型擦除技术
开发语言·c++·算法
努力学习的小廉41 分钟前
我爱学算法之—— 递归回溯综合(二)
开发语言·算法
sheji526143 分钟前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
2301_7634724643 分钟前
C++网络编程(Boost.Asio)
开发语言·c++·算法
毕设源码-邱学长44 分钟前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言
程序员清洒1 小时前
Flutter for OpenHarmony:Text — 文本显示与样式控制
开发语言·javascript·flutter
摇滚侠1 小时前
Java项目教程《尚庭公寓》java项目从开发到部署,技术储备,MybatisPlus、MybatisX
java·开发语言