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)
【无标题】word 中的中文排序
坚持吧20212025-07-26 20:42
相关推荐
almighty2717 小时前
C#实现导入CSV数据到List<T>的完整教程How_doyou_do17 小时前
数据传输优化-异步不阻塞处理增强首屏体验jingfeng51417 小时前
C++11可变参数模板、emplace系列接口、包装器云天徽上17 小时前
【数据可视化-107】2025年1-7月全国出口总额Top 10省市数据分析:用Python和Pyecharts打造炫酷可视化大屏Tina表姐18 小时前
(C题|NIPT 的时点选择与胎儿的异常判定)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合程序猿多布18 小时前
Lua和C#比较轮到我狗叫了19 小时前
牛客.小红的子串牛客.kotori和抽卡牛客.循环汉诺塔牛客.ruby和薯条yudiandian201419 小时前
【QT 5.12.12 下载 Windows 版本】高山有多高19 小时前
详解文件操作狂奔的sherry20 小时前
单例模式(巨通俗易懂)普通单例,懒汉单例的实现和区别,依赖注入......