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

背景需求:

1、板式变化;

很多年没有带中班了,今年中6班的信息墙上的所有4份文件都是横版的。

 这和以前的的周计划4份资料有区别

以前样式一:信息传和主题知识并在一个A4横版上

以前样式二:信息窗在A4竖版上,主题知识在A4竖版上,两个都是单独一份

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

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

 

2、黏贴太烦:

去年我用{{}}方法批量生成过新日期下的大班周计划资料。但是采用“打开20个旧word,手动复制旧文件里面各个段落、表格的内容到EXCLE的相应单元格内”。这种方法下,光是复制黏贴就足足用了2周。最终实现了EXCLE-WORD文件的转化,我很开心。只是后续还要对内容进行修改,也要费不少时间。因此我就觉得前期手动黏贴Word内容的过程,非常耗费时间和精力,低价值无效率。

大班批量的信息窗+主题知识

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

 在两年码龄后,再次做这种数据的转移工作,我觉得一定有办法直接把word里面的内容导入到EXCLE单元格内。通过各种网络搜索代码并测试了一晚上,我实现了批量提取整段文字的需求

思路:

把“2018年的中5班信息窗(19个Word-A4竖版)”中的内容,批量生成导成“2023年-中6班下学期信息窗(19个Word-A4横版)

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

步骤:

1、提取“2018年-中5班上学期信息窗”(19份docx)的内容,导入模板EXCLE中,

2、用{{}}的方法提取EXCEL数据,批量生成新内容、新格式的“2023年-中6班下学期信息窗(19份docx)

一、旧数据(2018年信息窗)的文件名的修改(01+docx):

0、材料准备:

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

1、旧文件名样式展示

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

2、把周次变成两位数,

这样提取时确保顺序正确(第01周DOC内容提取到EXCLE01行)

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

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

 第X周变成第0X周

import os
import time


path =r"D:\test\02办公类\90Word表格内容写入Excel\01 信息窗\旧信息窗"

fileList=os.listdir(path)

print(fileList)

for file in fileList:
    
  split_str = file.split('第')
  newname1 = split_str[0]  # _的第0部分=序号 
  print(newname1)
  newname2= split_str[1]  # _的第0部分=序号 
  print(newname2)
  newname=newname1+'第0'+newname2
  oldname_path = os.path.join(path,file)
  # 文件新路径
  newname_path = os.path.join(path,newname)
  # 新旧对调
  os.rename(oldname_path, newname_path)

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

 2位数周次的 生成效果:

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

 所有文件放在一起

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

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

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

import os
from win32com import client as wc
import time
#  注意:目录的格式必须写成双反斜杠
path="D:\\test\\02办公类\\90Word表格内容写入Excel\\01 信息窗\\旧信息窗\\"  # 使用绝对地址(可更改)
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-01】周计划系列(1)-生成“信息窗”(提取旧docx内容,写入EXCLE模板,再次生成新docx)_第11张图片

doc转docx的效果

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

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

1、随机打开几份信息窗。只需要黄色部分的内容导入EXCLE

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

 前面的三行和最后的空行、班级、教师名字、日期、空行 不要

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

多表对比后,可以发现,

1、每一份的初始三行信息是一样的,也就是1-3行不需要

2、每份最后的行数不一样,有大量不确定行数的空行(回车、制表符、软回车等)

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

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

  

from docx import Document
from openpyxl import load_workbook
import glob

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



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

删除空行后,所有信息窗的班级信息与内容之间无空行,日期后面还有两行(小点、中点)

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

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

 三、信息窗Docx黄色部分的内容导入EXCLE内

1、EXCLE模板

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

 2、代码

# 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办公类\90Word表格内容写入Excel\01 信息窗'
workbook = load_workbook(path + r'\信息窗过渡模板.xlsx')
sheet = workbook.active

number = 0
 
for file in glob.glob(path + r'\旧信息窗\*.docx'):   # 读取所有以前的信息窗参考资料
    print(file)
    doc= Document(file)
    # print(wordfile)
    content_lst = []
    for paragraph in doc.paragraphs[3:-5]:        # 去掉前面3行(周次、家长、您好012 保留3以后的)去掉最后两行(班级 老师、日期-1 -2)
        content = paragraph.text             # 只要原周计划中间的段落内容     
        # print(content)
        q='        '+content    # '    '是首行缩进8格
#         # print(q)
        content_lst.append(q)
    print(content_lst)      

    content = '\n'.join(content_lst)      # 组合并加回车
    number += 1
  
    sheet.append([number, content])    # number是序号,一共遍历提取了几分Word的内容,content是信息窗中间部分的内容
 
workbook.save(path + r'\中6班下学期信息窗 (1-{}周).xlsx'.format(number))

3、写入EXCLE的内容-1

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

4、写入EXCLE的内容-2

自动换行后的样式(提取了所有旧信息窗里面的中间黄色部分内容,并且有首行缩进8个空格)

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

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

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

1、制作word模板

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

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

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

 2、EXCLE表格

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

 把周次的日期范围和标题里的汉字数字复制到保存有信息窗内容的那份EXLCE里

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

 3、代码展示

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

# 一、导入相关模块,设定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办公类\\周计划4份\\01 信息窗'+'\\'
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()
name =list["name"]
content=list["content"].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行,逐个生成
num = list.shape[0]
for i in range(num):
    context = {
       "title": title[i],
       "content": content[i],        
       "classroom": classroom[i],
       "name" :name[i],
       "T1": T1[i],
       "T2": T2[i],       
       "time": time[i],      
       
    }
    tpl = DocxTemplate(zpath+'信息窗_横版.docx')
    tpl.render(context)
    tpl.save(file_path+r"\第{}周的信息窗({}班下学期).docx".format('%02d'%name[i],classroom[i]))


   

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

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

 五:最终效果展示:

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

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

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

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

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

 六:后续操作

1、手动修改更新信息:

修改内容:

2018年的信息窗内容与2023年的环境不同,因此虽然批量导入了原有的内容,但每周打印时还是需要根据班级实际情况,删除、补入新内容。

补充内容

同时如果原有信息窗周次19周,与现在的周次20周,不一致,教师需要自行撰写一篇信息窗补足缺失。

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

  2、确保在一页A4上:

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

【办公类-22-01】周计划系列(1)-生成“信息窗”(提取旧docx内容,写入EXCLE模板,再次生成新docx)_第35张图片 超过一页的处理方法

 3、一周一份

平时通常是第1-2周一份,6-7周一份(7天),运用遍历后,我觉得还是一周做一份(5天),确保最后是01周、02周的格式,便于后续的再次提取不会顺序出错。

感悟:

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

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

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