【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)

背景需求:

【办公类-22-01】周计划系列(1)-生成“信息窗”(提取旧docx内容,写入EXCLE模板,再次生成新docx)

前一篇介绍了生成”信息窗“的过程,本篇介绍周计划的第2款内容——主题说明的生成

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第1张图片

  我发现:每当换一个教室,如果想要继续使用门前原有的信息窗结构,就要适应不同的板式风格。本次的信息窗都是A4横版的,因此原有的“信息+主题”合并版资料,以及全部竖版的4份资料内容,都需要修改成A4横版(竖版变成程横版)

思路:

把“2018年的中5班主题说明(8个Word-A4竖版)”中的内容,批量生成导成“2023年-中6班下学期主题说明(8个Word-A4横版)

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第2张图片

步骤: 

1、提取“2018年-中5班上学期主题说明”(8份docx)的内容,分别将”主题说明“”主题目标“”家园共育“里面的内容导入模板EXCLE的不同单元格中,

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第3张图片

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第4张图片2、用{{}}的方法提取EXCEL数据,批量生成新内容、新格式的“2023年-中6班下学期主题说明”(8份docx)

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第5张图片

一、旧数据(2018年主题知识)的文件名的修改(01+docx):

0、材料准备:

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第6张图片

1、旧文件名样式展示——2018年的,并且都是doc格式

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第7张图片

2、把周次变成两位数(原文件已经是01 02格式了,所以这里不做编号)

3、把所有doc变成docx,否则不能提取

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第8张图片

 运行后,转为docx,删除原来的doc

import os
from win32com import client as wc
import time
#  注意:目录的格式必须写成双反斜杠
path="D:\\test\\02办公类\\90周计划4份\\02 主题知识2\\旧主题知识\\"  # 使用绝对地址(可更改)
files=[]
for file in os.listdir(path):
    # 找出文件中以.doc结尾并且不以~$开头的文件(~$是为了排除临时文件)
    if file.endswith('.doc') and not file.startswith('~$'): 
        files.append(path+file)
        for file in files:
            word = wc.Dispatch("Word.Application")
            print("已处理文件:"+files[0])
            # 打开文件
            doc = word.Documents.Open(files[0])
            # 将文件另存为.docx
            doc.SaveAs("{}x".format(files[0]), 12)    # 12表示docx格式
            doc.Close()
            # 删除原doc文件
            os.remove(files[0])
            # 在files数组中删除第一个文件地址(已处理的文件地址)
            del files[0]
            word.Quit()
            time.sleep(0.5) # 暂停0.5秒
 
 

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第9张图片

doc转docx的效果

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第10张图片

二、旧数据(2018年信息窗)的文件内容的修改(删除空行):

1、删除每个docx文档里面的空行

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第11张图片

(无论有没有空行,都做一下删除,以便能够确定最后的索引范围)

  

from docx import Document
from openpyxl import load_workbook
import glob

import os
path  = r'D:\test\02办公类\90周计划4份\02 主题知识2'



for file in glob.glob(path + r'\旧主题知识\*.docx'):   # 读取所有以前的信息窗参考资料
    doc = Document(file)
    for paragraph in doc.paragraphs:  # 读取文档段落
        if len(paragraph.text) == 0:
            p = paragraph._element
            p.getparent().remove(p)
            p._p = p._element = None
       
    doc.save(file)
# # ————————————————
# # 版权声明:本文为CSDN博主「lsjweiyi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# # 原文链接:https://blog.csdn.net/lsjweiyi/article/details/121728630

运行后,8份主题说明里面的空行都删除了,没有”空行、换行、手动换行符等“

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第12张图片

 (把去掉空行的8份Word放到“”docx(无空行)“”文件夹里面备用)

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第13张图片

 三、信息窗Docx指定部分内容导入EXCLE内

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第14张图片

1、docx模板制作——主题知识_模板.docx

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第15张图片

2、EXCLE模板——主题知识过渡模板.xlsx

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第16张图片

 3、代码

# https://blog.csdn.net/lau_jw/article/details/114383781

from docx import Document
from openpyxl import load_workbook
import glob
 
#  将模板 Excel 读取进程序:
path  = r'D:\test\02办公类\90周计划4份\02 主题知识2'
workbook = load_workbook(path + r'\主题知识过渡模板.xlsx')
sheet = workbook.active

number = 0
 
for file in glob.glob(path + r'\旧主题知识\*.docx'):   # 读取所有以前的主题知识参考资料
    print(file)
    doc= Document(file)
   

    # 提取三个加粗标题所在的行数    # 参考https://www.shouxicto.com/article/96876.html

    #获取每个文档的行数  
    print("段落数:"+str(len(doc.paragraphs)))#段落数为13,每个回车隔离一段
    
    # 读取标题:
    title=[]
    for paragraph1 in doc.paragraphs[0:1]:        # 第0行标题
        t1 = paragraph1.text             # 只要原周计划中间的段落内容    
        title.append(t1[5:])
    print(title)      
    content1 = '\n'.join(title)      # 组合并加回车

    #输出每一段的内容
    for para in doc.paragraphs:    
        print(para.text) 

    # “主题说明“固定在1行,所以不用查找了 
    h0=1

    #查找“主题目标”所在的行
    for i in range(len(doc.paragraphs)):  
        # print("第"+str(i)+"段的内容是:"+file.paragraphs[i].text)  
        if '主题目标' in doc.paragraphs[i].text:
            h1=i
            print(h1)

    #查找“家园共育”所在的行
    for i in range(len(doc.paragraphs)):  
        if '家园共育' in doc.paragraphs[i].text:
            h2=i
            print(h2)

    #家园共育结束值等于-3
    h3=-3

    # 提取“主题说明”
    sm = []
    for paragraph2 in doc.paragraphs[h0+1:h1]:        #          主题说明h0固定是1行,所以从2开始提取,主题目标 是提取的行数h1-1, 索引取值,还是h1
        t2 = paragraph2.text               
        sm.append(t2)
    print(sm)    
    content2 = '\n'.join(sm)      # 组合并加回车

    # 提取“主题目标”
    mb = []
    for paragraph3 in doc.paragraphs[h1+1:h2]:        #          主题目标 是提取的行数+1,家园共育 提取行数-1 索引取值,还是h2
        t3 = paragraph3.text               
        mb.append(t3)
    print(mb)  
    content3 = '\n'.join(mb)      # 组合并加回车

    # 提取“家园共育”
    gy = []
    for paragraph4 in doc.paragraphs[h2+1:-2]:        #         家园共育 是提取的行数+1,删除最后两行的班级日期,范围是-2
        t4 = paragraph4.text             
        gy.append(t4)
    print(gy)  
    content4 = '\n'.join(gy)      # 组合并加回车


    number += 1
  
    
    sheet.append([number, content1,content2,content3,content4])  # number是序号,一共遍历提取了几分Word的内容,content是主题知识中间部分的内容
 
workbook.save(path + r'\中6班下学期主题知识.xlsx')

代码重点:

1、思路一:将“主题说明”等三个关键词批量加粗。

      但是目前读取的docx数据再次转换为docx时,所有的格式都清除了,目前还没有找到能够将关键词加粗的代码。要么手动将三个标题加粗。

2、思路二:读取“主题说明”等三个加粗标题所在的行数,

     观察代码,发现它是读取段落[0:X]的,只要确定起始段和终止段,就可以把中间的非加粗部分内容太提取出来。【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第17张图片

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第18张图片  每份”主题知识。docx”的”主题说明“都在行数1,但”主题目标“”家园共育“的行数不同(3行和4行、6行和7行)。因此需要用代码进行提取 

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第19张图片

提取到“加粗标题“的行数后,就可以制作索引范围,取出中间非加粗部分的内容写入EXCLE

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第20张图片

 4、写入EXCLE的内容1-代码直接导入的

(序号num、标题title、主题说明sm 、主题目标mb、家园共gy) 

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第21张图片

5、写入EXCLE的内容2-手动复制进去的

把班级和合并后的周次日期复制到“中6班下学期主题知识.xlsx”的指定单元格内。

(也可以写个代码调入,这里就不写了,手动复制)

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第22张图片

 (班级、时间)【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第23张图片

四、EXCLE信息窗内容转化为新模板新时间的周计划

1、检查word模板

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第24张图片

 模板中输入各种{{English}}——标题加粗(黑体三号)、段落(1.5行距)、字体(宋体小三)、0空行……这些都在word模板里面调整好

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第25张图片

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第26张图片

 2、检查EXCLE表格

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第27张图片

 3、代码展示

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第28张图片

# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
import xlwt
import xlrd
import os
import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time
import docx
from docx import Document
from docx.shared import Pt 
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT



zpath=r'D:\\test\\02办公类\\90周计划4份\\02 主题知识2'+'\\'
print(zpath)

file_path=zpath+r'\新主题知识(下学期)'
print(file_path)

# 二、遍历excel,逐个生成word(小标签.docx是前面的模板)
try:
    os.mkdir(file_path)
except:
    pass

tpl = DocxTemplate(zpath+'主题知识_横版.docx')
list = pd.read_excel(zpath+'中6班下学期主题知识.xlsx')


title = list["title"].str.rstrip()
num=list["num"]
sm=list["sm"].str.rstrip()# 没有str.rstrip()是数字格式
mb=list["mb"].str.rstrip()# 没有str.rstrip()是数字格式
gy=list["gy"].str.rstrip()# 没有str.rstrip()是数字格式
classroom =list["classroom"].str.rstrip() # str.rstrip()都是文字格式
# T1 =list["T1"].str.rstrip() # 没有str.rstrip()是数字格式
# T2 =list["T2"].str.rstrip()# 没有str.rstrip()是数字格式
time=list["time"].str.rstrip() 

# 遍历excel行,逐个生成
numnum = list.shape[0]
for i in range(numnum):
    context = {
        "num": num[i],
        "title": title[i],
        "sm": sm[i],  
        "mb" :mb[i],
        "gy" :gy[i],      
        "classroom": classroom[i],       
        "time": time[i],      
       
    }
    tpl = DocxTemplate(zpath+'主题知识_横版.docx')
    tpl.render(context)
    tpl.save(file_path+r"\{}主题知识_{}({}班下学期).docx".format('%02d'%num[i],title[i],classroom[i]))


   

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第29张图片

 ​​​【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第30张图片

 五:最终效果展示:

基本都在一页A4横版上 

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第31张图片

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第32张图片

 

【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第33张图片【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第34张图片  【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_第35张图片 

 六:后续操作

1、手动修改更新信息:

修改内容:主题说明的内容不修改,内容都是固定的。实际上只要调整板式、班级、日期

 2、确保在一页A4上:

有些周次的内容数量多,会超过一页。需要手动调整(删除空行、删除段落、调整间距等)

 3、多周一份

可以一次性批量打印好

感悟:

1、docx段落内容导入EXCEL,再转成新docx。速度快,可以反复修正。太神奇了!

2、完成第2个周计划”主题说明“的文本转移,后续继续研究育儿知识、周计划(教案)的内容转移。

你可能感兴趣的:(Python,python)