背景需求
承接上文,继续制作周计划
【办公类-22-09】周计划系列(5-1)“周计划-01源文件统一名称“ (2024年调整版本)-CSDN博客文章浏览阅读76次。【办公类-22-09】周计划系列(5-1)“周计划-01源文件统一名称“ (2024年调整版本)https://blog.csdn.net/reasonsummer/article/details/136307443
去年做过周计划的提取——用的是旧模板(部分框架内容有缺失)【办公类-22-04】周计划系列(4)-生成“周计划”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_用python做周计划-CSDN博客文章浏览阅读498次。【办公类-22-04】周计划系列(4)-生成“周计划”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_用python做周计划https://blog.csdn.net/reasonsummer/article/details/130451332经过1年的循环,本次用的是更新过的模板及内容(所有框架内容都有)——新模板
素材准备:
word读取内容
第1页
第2-4页
第5页(反思)
提取的内容很多很多很多……到现在我也不确定代码提取的内容和占位格是否”全”了o(╥﹏╥)o,不断调试吧。
代码展示:
from docx import Document
import os,time
from openpyxl import load_workbook
import glob
import re
import xlrd
pathall=[]
path =r'D:\test\02办公类\91周计划4份_2024年中4班\04 周计划\03去掉回车'
for file_name in os.listdir(path):
print(path+'\\'+file_name)
pathall.append(path+'\\'+file_name)
print(pathall)
print(len(pathall))# 19
# 新建EXCEL
import xlwt
f = xlwt.Workbook('encoding = utf-8')#设置工作簿编码
sheet1 = f.add_sheet('sheet1',cell_overwrite_ok=True)#创建sheet工作表
n=1
for h in range(len(pathall)): # 19份19行
LIST=[]
path=pathall[h]
doc = Document(path)
# 获取第一行段落文字
bt=doc.paragraphs[0].text
# print(bt)
# 中(5)班 第三周 活动安排
LIST.append(bt[0]) # 添加年级
LIST.append(bt[2]) # 添加班号
LIST.append(bt[7:-6]) # 添加周次 大写
# 获取第一行段落文字
rq1=doc.paragraphs[1].text
LIST.append(rq1[3:]) # 添加起止日期
# print(LIST)
# 获取所有表格对象
tables = doc.tables
# 获取word中第一个表格(周计划表)
table = tables[0]
# # print('-----提取第1张表格(周计划表)里面的内容----------')
# 星期X
for xq in range(3,8):
xq1 = table.cell(0,xq).text # K.append(k)
LIST.append(xq1)
#
# 生活名称
l = table.cell(1,4).text
# print(l)
# 吃点心
LIST.append(l)
# 生活说明(1格2行,分开) (导入做参考,实际是自己写)
ll=table.cell(2,4).text.split('\n')
# print(ll)
# ['1.观察值日生在自主午餐环节中帮助阿姨分碗筷、毛巾的情况。', '2.提醒幼儿在自主午餐的过程中不说话,打喷嚏咳嗽要对外。']
# 不要“1、”、“2、”
L=[]
for lll in range(2): # 一共2条
L.append(ll[lll][2:]) # # 不要“1、”、“2、”
LIST.append(ll[lll][2:])
# print(L)
# # ['观察幼儿在吃点心时是否能熟练地使用夹子夹取饼干。', '提醒个别幼儿喝完牛奶擦嘴巴。']
# 运动=集体游戏+分散游戏 导入,做参考,需要调整
# 集体游戏
for jt in range(3,8):
jt1 = table.cell(3,jt).text # K.append(k)
LIST.append(jt1)
# 集体游戏
for jt2 in range(3,8):
jt3 = table.cell(4,jt2).text # K.append(k)
LIST.append(jt3)
# 运动观察与指导(导入做参考,实际是自己写)
s=table.cell(5,4).text.split('\n')
# print(s)
# # [1.'观察幼儿是否能双手握住曲棍杆将皮球打出一定距离。', '2.观察幼儿是否能寻找皮球的多种玩法。', '3.提醒幼儿注意打曲棍干的安全。']
# # 有些序号是自动编号,不占字数。
S=[]
for sss in range(3): # 一共3条
S.append(s[sss][2:]) # 不要“1、”、“2、”、“3、”
LIST.append(s[sss][2:])
# print(S)
# # ['幼儿是否能双手握住曲棍杆将皮球打出一定距离。', '幼儿是否能寻找皮球的多种玩法。', '提醒幼儿注意打曲棍干的安全。']
# 游戏内容 角色游戏 导入做参考,每年都在更换
for fj in range(3,8):
fj2 = table.cell(7,fj).text
LIST.append(fj2)
# 游戏观察与指导(导入做参考,实际是自己写)
g=table.cell(8,4).text.split('\n')
# print(g)
# ['1、观察娃娃家的幼儿是否会照顾娃娃,与娃娃互动。', '2、重点观察医生在小医院游戏中,与病人的互动时能否加上一些肢体动作。', '3、观察幼儿角色游戏结束后,能否帮助其他伙伴一同整理材料。']
# 有些序号是自动编号,不占字数。
G=[]
for ggg in range(2): # 一共3条
G.append(g[ggg][2:]) # 不要“1、”、“2、”、“3、”
LIST.append(g[ggg][2:])
# print(G)
# # ['观察娃娃家的幼儿是否会照顾娃娃,与娃娃互动。', '重点观察医生在小医院游戏中,与病人的互动时能否加上一些肢体动作。', '观察幼儿角色游戏结束后,能否帮助其他伙伴一同整理材料。']
# 主题和主题说明
ti=table.cell(9,4).text.split('\n')
# print(ti)
# ['春天来了', '1、了解春天是个万物生长的季节,关注自然环境的不断变化。', '2、感受大自然美丽的景像,以各种方式表达自己的情感与体验。']
# 有些序号是自动编号,不占字数。
T=[]# 第1个春天来了,不需要删除序号,直接添加
T.append(ti[0])
LIST.append(ti[0])
for ttt in range(1,3): # 一共2条主题说明
T.append(ti[ttt][2:]) # 不要“1、”、“2、”、
LIST.append(ti[ttt][2:])
# print(T)
# ['春天来了', '了解春天是个万物生长的季节,关注自然环境的不断变化。', '感受大自然美丽的景像,以各种方式表达自己的情感与体验。']
# 个别化内容(3-5项) 一行多个,全部写入
iiii=table.cell(10,4).text.split('\n')
# print(iiii)
for xx in iiii:
LIST.append(xx)
# ['电风扇转起来了、漂亮的帽子、绿太阳、大雨小雨、做柳树等']
# 个别化观察与指导(导入做参考,实际是自己写)
ii=table.cell(12,4).text.split('\n')
# print(ii)
# # ['1.观察幼儿组装各种小电风扇的情况,鼓励幼儿不断进行尝试。', '2.观察幼儿制作帽子的情况,提示幼儿尝试不同的材料进行装饰。', '3.观察幼儿在活动过程中的专注程度,鼓励幼儿专心做自己的事。']
# # # 有些序号是自动编号,不占字数。
I=[]
for iii1 in range(3): # 一共3条
I.append(ii[iii1][2:]) # 不要“1、”、“2、”、“3、”
LIST.append(ii[iii1][2:])
# print(I)
# # ['观察幼儿是否能通过协商分配角色表演故事《三只蝴蝶》。', '观察幼儿是否能看懂图谱,跟着音乐打节奏。']
# 集体学习 横向五个格子
K =[]
for e in range(3,8):
k = table.cell(13,e).text
K.append(k)
LIST.append(k)
# print(K)
# # ['空中小屋\n(偏语言领域)', '花园里有什么\n(偏科学领域-探究)', '*猴子看猴子做\n(偏艺术领域-音乐)', '*借形想象\n(偏艺术领域-美术)', 'PATHS课程--赞美1(偏社会领域)']
# 家园共育(导入做参考,实际是自己写)
yy=table.cell(14,4).text.split('\n')
# print(yy)
# ['1、为春游活动做准备。', '2、在家长的帮助下学习折一些纸花。', '3、天气转暖,适当地为孩子减少衣服。']
# 有些序号是自动编号,不占字数。删除2字符后,可能会少前面几个字
Y=[]
for yyy in range(2): # 一共3条
Y.append(yy[yyy][2:]) # 不要“1、”、“2、”、“3、”
LIST.append(yy[yyy][2:])
# print(Y)
# ['为春游活动做准备。', '在家长的帮助下学习折一些纸花。', '天气转暖,适当地为孩子减少衣服。']
# # 反馈与调整(变化很大)不导入
ff=table.cell(1,8).text.split('\n')
# print(ff)
# print(h+1,len(ff))
# # 8行
for j in range(2):
# 提取活动1
LIST.append(ff[j*4][0:4])
# # 提取身份1
LIST.append(ff[j*4][10:-1])
# 提取反思1
LIST.append(ff[j*4+1])
# print(LIST)
# # # 提取调整1
LIST.append(ff[j*4+3])
# print(LIST)
print('-----提取第2-5张表格(教案)里面的内容----------')
# 第1周、第20周,或国庆周会出现格子表格不满的情况,需要手动调整
# 第2、3页教案上的日期
# 由于不能确定段落
# 所以直接list 3空格(小日期、周次、班级
# for er in range(3):
tk1='2023年2月27日—2023年2月28日'
tk2='周次1、2、3'
tk3='中4'
LIST.append(tk1)
LIST.append(tk2)
LIST.append(tk3)
for a in range(1,3): # 先提取2张表( 共有3张表,其中第1、2张表提取00和01,第3表提取00)
for b in range(2): # 表1有两个格子00 01 表2有两个格子00 01
table = tables[a] # 表1 表2
# 有两张表
all=table.cell(0,b).text.split('\n')
print(len(all))
# 看看表格里面的行数,如果等于1行(元宵节放假),就写6个空格
if len(all)==1:
for tt in range(6):
LIST.append('')
else:
# print(all)
# 提取活动名称(删除后面的执教人员)
title=all[0][5:][:-6]
LIST.append(title)
# print(title)
# 空中小屋等4个题目
# 提取活动目标(2行)删除前面的序号
topic=[]
for to in range(2,4): # 行数
mb=all[to][2:]
LIST.append(mb)
# topic.append(all[to][2:])
# print(topic)
# ['理解故事,知道春天是竹笋快速生长的季节。', '乐意想办法帮助小狐狸解决问题,并能大胆表达自己的想法。']
# 提取活动准备
# (第一种:经验准备)
pre1=all[5][5:]
LIST.append(pre1)
# print(pre)
# (第二种:材料准备)
pre2=all[6][5:]
LIST.append(pre2)
# print(pre2)
# ppt、故事录音
# 提取活动过程
pro=all[8:]
PRO='\n'.join(pro)
# print(PRO)
LIST.append(PRO)
# 一、我家住几楼---导入主题,激起幼儿兴趣
# 1、你们的家住在哪里?住在几楼?为什么买这么高?
# 小结:是呀,住这么高的房子可以看到远远的风景。
# 2、小狐狸也想住楼房,楼上的房间高高的,远远望去,可以看见一片美景,那该多开心。
# 二、房子造在哪?---分段欣赏
for a in range(3,4): # 最后提取第3张表的00部分
for b in range(1): # 表1有两个格子00 01 表2有两个格子00 01
table = tables[a] # 表1 表2
# 有两张表
all=table.cell(0,b).text.split('\n')
if len(all)==1:
LIST.append('')
# print(all)
else:
# 提取活动名称(删除后面的执教人员)
title=all[0][5:][:-6]
LIST.append(title)
# print(title)
# 空中小屋 只有一个标题
# 提取活动目标(2行)删除前面的序号
topic=[]
for t in range(2,4): # 行数
topic.append(all[t][2:])
LIST.append(all[t][2:])
# print(topic)
# ['理解故事,知道春天是竹笋快速生长的季节。', '乐意想办法帮助小狐狸解决问题,并能大胆表达自己的想法。']
# 提取活动准备
# (第一种:经验准备)
pre1=all[5][5:]
LIST.append(pre1)
# print(pre)
# (第二种:材料准备)
pre2=all[6][5:]
LIST.append(pre2)
# print(pre2)
# 提取活动过程
pro=all[8:]
# print(pro)
# # 这是列表样式
# ['一、我家住几楼---导入主题,激起幼儿兴趣', '1、你们的家住在哪里?住在几楼?为什么买这么高?', '小结:是呀,住这么高的房子可以看到远远的风景。', '2、小狐狸也想住楼房,楼上的房间高高的,远远望去
# ,可以看见一片美景,那该多开心。', '二、房
# 合并列表
PRO='\n'.join(pro)
# print(PRO)
LIST.append(PRO)
# 一、我家住几楼---导入主题,激起幼儿兴趣
# 1、你们的家住在哪里?住在几楼?为什么买这么高?
# 小结:是呀,住这么高的房子可以看到远远的风景。
# 2、小狐狸也想住楼房,楼上的房间高高的,远远望去,可以看见一片美景,那该多开心。
# 二、房子造在哪?---分段欣赏
for c in range(2): # 表3的01有两个上下格子 表2有两个格子00 01
table = tables[3] # 表3
# 有两张表
fs=table.cell(c,1).text.split('\n')
# print(fs)
# 提取反思的课程名字
# 提取活动名称(删除后面的执教人员)
fstitle=fs[1][5:][:-6]
# print(fstitle)
LIST.append(fstitle)
# 纯反思部分(第三行开始)
fs1=fs[2:]
# print(fs1)
fs3=[]
for i in range(len(fs1)):
fs4=' '+fs1[i] # 主动添加缩进2字符
# print(fs4)
fs3.append(fs4)
# 合并列表
fs2='\n'.join(fs3)
# print(fs2)
LIST.append(fs2)
# print(LIST)
for g in range(len(LIST)):
# K =[1,3,4,6,8,10]#要写入的列表的值
sheet1.write(n,g,LIST[g])#写入数据参数对应 行,列,值
n+=1
f.save(r'D:\test\02办公类\91周计划4份_2024年中4班\04 周计划\09 原计划提取的内容.xls')#保存.x1s到当前工作目录
# doc.close(path)
time.sleep(5)
print('--打开XLSX-,把里面的空格删除,把1、替换成1.--')#
# # 关闭Excel文件
# workbook.close()
import xlrd
import xlwt
# 打开Excel文件
workbook = xlrd.open_workbook(r'D:\test\02办公类\91周计划4份_2024年中4班\04 周计划\09 原计划提取的内容.xls')
worksheet = workbook.sheet_by_index(0) # 选择要读取的工作表
# 创建一个新的Workbook对象
new_workbook = xlwt.Workbook()
new_worksheet = new_workbook.add_sheet('Sheet1') # 新建一个工作表
# 遍历每一行
for row_index in range(worksheet.nrows):
row_values = worksheet.row_values(row_index)
for col_index, cell_value in enumerate(row_values):
if isinstance(cell_value, str):
# 清除单元格内文字的格式
cell_value = cell_value.strip()
# 替换文本
for s in range(1, 10):
cell_value = cell_value.replace("{}、".format(s), "{}.".format(s))
cell_value = cell_value.replace("执教:", "")
cell_value = cell_value.replace("执教", "")
cell_value = cell_value.replace("XX", "")#源文件上的教师名字
cell_value = cell_value.replace("XXX", "") #源文件上的教师名字
cell_value = cell_value.replace(' ', '')
cell_value = cell_value.replace(' ', '')
cell_value = cell_value.replace( " ", '')
# # 判断单元格中的文字是否有空格
# if ' ' in cell_value:
# # 替换空格为无空格
# cell_value = cell_value.replace(' ', '')
# if ' ' in cell_value:
# # 替换空格为无空格
# cell_value = cell_value.replace(' ', '')
# 替换文本
for s in range(1, 10):
cell_value = cell_value.replace("{}、".format(s), "{}.".format(s))
# 将修改后的值写入新的Workbook中
new_worksheet.write(row_index, col_index, cell_value)
# 保存修改后的Excel文件
new_workbook.save(r'D:\test\02办公类\91周计划4份_2024年中4班\04 周计划\09 原计划提取的内容(仅导出部分).xls')
重点:
一、读取word表格中的每个单元格的坐标,在提取里面的数据
因为这里有合并,(1,4)坐标与(1,3)(1,5、1、6 、1、7)都显示“我是小小值日生”这个内容
二、遇到节日“无教案”,读不到相关数据,程序会出现报错。
处理方法:先判断表格里面的文字有几段?如果等于1段,就直接写入6个空格(占位用),如果大于1段,说明里面有教案,就分别提取每段的内容