自动为word标题插入序号
使用python自动为word标题插入序号、自动排版;
代码开始???
from docx import Document import re import cn2an def word_str2num(path): """ 此代码为word文档标题,中文数字转阿拉伯数字; :param path: 指定word文件位置; :return: 返回处理完成的word; """ word = Document(path) for i_head in word.paragraphs: if re.match('^Heading \d+$', i_head.style.name): # 匹配各个标题; title_num = cn2an.transform(i_head.text) # 将中文数字标题修改成阿拉伯数字标题; if re.search('\d、', title_num): if re.search('、', i_head.text): new_title_text = re.sub('、', '.', cn2an.transform(i_head.text), 1) i_head.text = i_head.text.replace(i_head.text, new_title_text) return word
def word_clear_title_num(path): """ 这是一个将word标题前面的序号,进行删除的函数; :param path: 指定函数word_str2num(path)的路径;也就是被处理文件的路径; :return: 返回一个被处理完成的word; """ word = word_str2num(path) for i_head in word.paragraphs: if re.match('^Heading \d+$', i_head.style.name): new_title_text = re.sub('^\d.*\.', '', i_head.text) if re.match('^\d', new_title_text): new2_title_text = re.sub('^\d+', '', new_title_text) i_head.text = i_head.text.replace(i_head.text, new2_title_text) elif re.match('^(\d+)', new_title_text): new3_title_text = re.sub('^(\d+)', '', new_title_text) i_head.text = i_head.text.replace(i_head.text, new3_title_text) elif re.match('^\\(\d+\\)', new_title_text): new4_title_text = re.sub('^\\(\d+\\)', '', new_title_text) i_head.text = i_head.text.replace(i_head.text, new4_title_text) else: i_head.text = i_head.text.replace(i_head.text, new_title_text) return word word = word_clear_title_num('/Users/fgh/Desktop/test/test.docx') paragraph_list = [] # 存放选择标题列表; title_number_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 存放标题号的列表; count1 = 0 for i_head in word.paragraphs: if re.match('^Heading 1$', i_head.style.name): if count1 < 5: paragraph_list.append(i_head.text) count1 += 1 count2 = 1 for i_info in paragraph_list: print('%s-%s' % (count2, i_info)) count2 += 1 while True: input_info = str.strip(input('输入开始插入标题序号(例如:1、2、3...):')) # str.strip去掉输出字符的两边的空格; if len(input_info) != 0: if re.match('\d+', input_info) is not None: if 0 < int(input_info) <= 10: break else: print('注意:输入值必须小于等于10!!!') else: print('注意:输入必须为数字!!!') else: print('注意:不能输入为空!!!') while True: input_number = str.strip(input('输入标题从第几部分开始(只能输入数字):')) if len(input_number) != 0 and re.match('\d+', input_number) is not None: title_number_list[1] = int(input_number) break else: print('输入的内容不合法,请重新输入数字。' '回车继续!') input() time_start = time.time() paragraph_info = paragraph_list[int(input_info) - 1] # 开始插入标题的段落; count3 = 0 # 作为是否是第一次修改标题的依据; old_title_number = 1 for i_head in word.paragraphs: if count3 == 0: if re.match('^Heading \d+$', i_head.style.name): if i_head.text == paragraph_info: new_title = '%s.%s' % (title_number_list[1], i_head.text) i_head.text = i_head.text.replace(i_head.text, new_title) count3 = 1 # 核心代码开始; elif count3 == 1: if re.match('^Heading \d+$', i_head.style.name): title_number = int(re.search('\d+', i_head.style.name).group()) if title_number > old_title_number: title_number_list[title_number] = title_number_list[title_number] + 1 title_number_value = '' for i in title_number_list: if i > 0: title_number_value += '%s.' % i new_title = '%s%s' %(title_number_value, i_head.text) old_title_number = title_number i_head.text = i_head.text.replace(i_head.text, new_title) elif title_number < old_title_number: count4 = 0 for i in title_number_list: if count4 > title_number: title_number_list[count4] = 0 count4 += 1 elif count4 == title_number: title_number_list[count4] = title_number_list[count4] + 1 count4 += 1 else: count4 += 1 title_number_value = '' for i in title_number_list: if i > 0: title_number_value += '%s.' % i new_title = '%s%s' % (title_number_value, i_head.text) old_title_number = title_number i_head.text = i_head.text.replace(i_head.text, new_title) else: title_number_list[title_number] = title_number_list[title_number] + 1 title_number_value = '' for i in title_number_list: if i > 0: title_number_value += '%s.' % i new_title = '%s%s' % (title_number_value, i_head.text) old_title_number = title_number # 核心代码结束 i_head.text = i_head.text.replace(i_head.text, new_title) word.save('/Users/fgh/Desktop/test/test.docx')
以上作为参考、也可以直接拿来使用,更多姿势等待后续!!!