很多年没有带中班了,今年中6班的信息墙上的所有4份文件都是横版的。
这和以前的的周计划4份资料有区别
以前样式一:信息传和主题知识并在一个A4横版上
以前样式二:信息窗在A4竖版上,主题知识在A4竖版上,两个都是单独一份
我发现:每当换一个教室,如果想要继续使用门前原有的信息窗结构,就要适应不同的板式风格。本次的信息窗都是A4横版的,因此原有的“信息+主题”合并版资料,以及全部竖版的4份资料内容,都需要修改成A4横版(竖版变成程横版)
去年我用{{}}方法批量生成过新日期下的大班周计划资料。但是采用“打开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)”
这样提取时确保顺序正确(第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位数周次的 生成效果:
所有文件放在一起
运行后,转为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的效果
前面的三行和最后的空行、班级、教师名字、日期、空行 都不要
1、每一份的初始三行信息是一样的,也就是1-3行不需要
2、每份最后的行数不一样,有大量不确定行数的空行(回车、制表符、软回车等)
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
删除空行后,所有信息窗的班级信息与内容之间无空行,日期后面还有两行(小点、中点)
1、EXCLE模板
# 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))
模板中输入各种{{English}}——标题加粗(黑体三号)、段落(1.5行距)、字体(宋体小三)、三个空行……这些都在word模板里面调整好
把周次的日期范围和标题里的汉字数字复制到保存有信息窗内容的那份EXLCE里
# 一、导入相关模块,设定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]))
修改内容:
2018年的信息窗内容与2023年的环境不同,因此虽然批量导入了原有的内容,但每周打印时还是需要根据班级实际情况,删除、补入新内容。
补充内容
同时如果原有信息窗周次19周,与现在的周次20周,不一致,教师需要自行撰写一篇信息窗补足缺失。
有些周次的内容数量多,会超过一页。需要手动调整(删除空行、删除段落、调整间距等)
超过一页的处理方法平时通常是第1-2周一份,6-7周一份(7天),运用遍历后,我觉得还是一周做一份(5天),确保最后是01周、02周的格式,便于后续的再次提取不会顺序出错。
1、docx段落内容导入EXCEL,再转成新docx。速度快,可以反复修正。太神奇了!
2、完成第1个”信息窗“的转移,后续继续研究主题说明、育儿知识、周计划(教案)的内容转移。