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

背景需求:

1、板式变化;

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

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

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

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

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

 

2、黏贴太烦:

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

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

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

思路:

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

步骤:

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

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

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

0、材料准备:

1、旧文件名样式展示

2、把周次变成两位数,

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

 

 第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)

 2位数周次的 生成效果:

 所有文件放在一起

 

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秒
 
 

doc转docx的效果

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

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

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

多表对比后,可以发现,

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

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

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

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

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

1、EXCLE模板

 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

4、写入EXCLE的内容-2

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

 

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

1、制作word模板

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

 2、EXCLE表格

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

 3、代码展示

# 一、导入相关模块,设定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]))


   

 

 五:最终效果展示:

  

  

 

 六:后续操作

1、手动修改更新信息:

修改内容:

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

补充内容

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

  2、确保在一页A4上:

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

超过一页的处理方法

 3、一周一份

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

感悟:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值