
背景需求:前一个《大班游戏活动室排班表》主要是针对班主任贴周计划用(按班级分类 各21周,),我想领导做资料时,用的还是word版(8周)的内容比较方便。所以试着用程序写出这种样式——按周次分割一组,每组有8各班级。

结构分析
1、每周:斜线递进1位
以第1周为例,8个班级的活动内容依次递进1位(大1班第1周 01建构 02沙水 03角色 ……,大2班第1周就从02沙水开始,03角色、04表演)
2、每班:按顺序延续
第1周的组:第1行(大1班)排序:01建构 02沙水 03角色 04表演 05角色
第2周的组:第1行(大1班)排序:06表演、07建构、08角色、01建构、02沙水
也就是表格 一个班级的使用活动室是按照顺序排列的
3、数量:只要8周(8个表格)
领导用的表格,只有8周,(8周1循环),所以只要8个表格
4、基本元素:

通过推算不重复信息,可以获得基本元素内容
01建构游戏、02沙水游戏、03角色游戏、04表演游戏、
05角色游戏、06表演游戏、07建构游戏、08角色游戏
所有的递进都是以这个为基础进行循环的。

- from msvcrt import LK_LOCK
- import sys
- import random
- import xlrd
- import xlwt
- from openpyxl import load_workbook
- import time
- import xlwings as xw
-
- time.sleep(2)
-
-
-
- '''领导用8周word表'''
-
- # 领导要的8周表
- print('---------第1步:大1版(每个表第一行)第1-8周的基本组------')
-
- # 本学期:大1,大2,大3,大4,大5,大7,大8,大9班,其中6班空缺,一共有8个大班
- # gradenum=['1','2','3','4','5','7','8','9']
-
- L=[]
- L2=[]
- L3=[]
- L4=[]
- LL=[]
- ll=[]
- gradenum=['1','2','3','4','5','7','8','9']
- # print(len(gradenum))# 8
- # radenum的长度=7,0-7,一共循环8次
-
- # 排列顺序按照原始01,02 03……排列,不需要把08元素调到01元素前。
- L3=['建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',]
- # print(L3)
-
- # 基础循环21次,并改成L
- for x in range(0,10):
- for y in L3:
- # print(y)
- L.append(y)
- # L3*10次 基本形体
- # ['建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',
- # '建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',
- # '建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',
- # '建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',
- # '建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',
- # '建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',
- # ]
-
- # 从L里面抽取8种基本形,越向后元素数量越少
- for x in range(0,8):
- LL=L[x*5:]
- # LL.append(L[x*5:])
- L2.append(LL)
- # print(L2)
-
- # 如大1班基本形:从'L3[0:]'开始
- # 建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',
- # '建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏',
- # '建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏','角色游戏'……
- # 如大2班基本形:从'L3[5:]'开始
- # '表演游戏','建构游戏','角色游戏','建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏',
- # '表演游戏','建构游戏','角色游戏',# '建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏',
- # '表演游戏','建构游戏','角色游戏……
- # 如大3班基本形:从'L3[10:]'开始
- # '角色游戏','表演游戏','角色游戏',# '表演游戏','建构游戏','角色游戏',# '建构游戏','沙水游戏',
- # '角色游戏','表演游戏','角色游戏',# '表演游戏','建构游戏','角色游戏……
-
- # 生成8个EXCEL表格
- for num in range(0,len(L2)): # num=0-8
- b=L2[num] # 提取L2[[],[]]中的单个[]
- # print(b)
- L4.clear() # 清空列表,否则第2周会有16行(每个EXCEL只需要8行)
-
- print('第{}周'.format(num+1)) # 终端里分割各个周的信息
-
- for i in range(0,1):#第1周(第X周)表格里的第1行
- # print(L[0:5]) #
- L4.append(b[0:5])
- for i in range(1,8): #第1周(第X周)里的2-7行()
- b=b[1:]
- b.append(b)
- # print(L[0:5])
- L4.append(b[0:5])
- # L3.append(L[int(num)*5:int(num)*5])
- # print(L4)
-
-
- # 第1周(第X周)表格里的8个班级信息到成EXCEL
- print('---------第4步:xls写入)------')
- workbook = xlwt.Workbook()# 新建xls工作簿
- sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
- # 第0列 写入“第1周、第二周第一周活动室安排
-
- title="第{}周 大班 活动室安排".format(num+1) # 用遍历方法获得“第1周、第2周、第21周”字样,
- sheet.write(0,0,title) #每周都写入A1格
-
-
- # 第0列 A列纵向 写入“大1班、大2班
- dates=[]
- for i in range(0,len(gradenum)):
- # print(i)
- n='大{}班'.format(gradenum[i]) # 用遍历方法获得“大1班、大2班
- dates.append(n)
-
- row=2 # 班级纵向写入第3行 A3( 0 1 2)
- for d in range(0, len(dates)):
- sheet.write(row, 0, dates[d]) # 这里enumerate不能用,因为只有一列,所以就用
- row += 1
-
-
- # 第1行(A2) 横向写入 星期一 '星期二','星期三','星期四','星期五 #
- weeks = ['班级','周一','周二','周三','周四','周五']
- week = len(weeks)
-
- col=0 # 从第0列(A)1行(2)写入,A2-F2
- for d in range(0, len(weeks)):
- sheet.write(1,col,weeks[d]) # 1=行 (0,1)
- col+= 1
-
-
- # 第B2开始写入 活动室内容
- arrlan = len(L4)# L4列表元素的数量
- row = 2 # 第3行
- for i in range(arrlan): # 遍历21组[]的总数
- for col,item in enumerate(L4[i],1): # L2[i]=表格内的内容=item,索引数字=col
- sheet.write(row,col,item) # row,col,item 行=1、列=索引数字、内容=表格内容 写入第一行第一列 2行1列=B3
- row += 1
-
- print('---------第5步:xls保存N份工作簿(每份一页)------')
- try:
- workbook.save(r"C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\第{}周大班游戏活动室安排(领导版8周).xls".format(num+1)) # 新建保存 只能xls
- print('计划生成成功')
- except e:
- print('失败...')
- print(e)
-
-
- print('--------信息合并到1张上有标题----------')
- # https://blog.csdn.net/xuyd33/article/details/72629460?
-
- import xlrd
- import xlwt
- import os
- from xlutils.copy import copy
- import os.path
- from xlwt import *
-
- # dir = input("输入文件路径\n");
- dir = r'C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png'
- start_row=1
-
- end_row = 0
- all_file = [];
-
-
- def min_s(a, b):
- if a == 0:
- return b
- if (a > b):
- return b
- else:
- return a
-
-
- # 遍历所有同学文件
- for parent, folder, filename in os.walk(dir):
- for file, x in zip(filename, range(len(filename))):
- file = os.path.join(parent, filename[x])
- print(filename[x])
- all_file.append(file)
- print("\n文件总数:", len(all_file))
- if os.path.exists('{}\result.xls'.format(dir)):
- os.remove('{}\result.xls'.format(dir))
- w = xlwt.Workbook()
- row = 0;
- ws = w.add_sheet('sheet1', cell_overwrite_ok=True)
- style = XFStyle()
- fnt = Font()
- fnt.height = 240 # 小四
- fnt.name = u'宋体'
- style.font = fnt
- align = Alignment()
- align.horz = 2
- style.alignment = align
-
- for single_file_path in all_file:
- data = xlrd.open_workbook(single_file_path)
- sheet = data.sheet_by_index(0)
- if sheet.nrows >= start_row:
- for i in range(start_row - 1, min_s(end_row, sheet.nrows)):
- list = sheet.row_values(i)
- for col in range(0, len(list)):
- ws.write(row, col, list[col], style)
- row = row + 1;
- else:
-
- print("非法填写的表格名称:" + single_file_path)
-
-
-
- # 合并A列-N列,第一个参数是位置,第二个参数是内容,第三个参数是自定义格式
-
- #设置行高,set_tow(行号,对应行高)
-
- w.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\大班游戏活动室安排(领导版8周).xls')
- os.system("pause")
-
-
- print('--------标题合并居中----------')
-
-
- '''表格处理
- 1、表格字体:宋体小四
- 2、表格段落:30绑
- 3、列宽2.5CM
- 4、手动合并表格
- '''
运行后的效果:

EXCEL表格效果


把表格选中,复制到docx里面(需要手动调整格式,适合打印。
手动调整docx也有点麻烦,最好也能用程序代码解决。
所以领导用的活动8周合并版(按周次分类,有8周)还需要研究docx的单元格合并,列宽、文字、段落大小调整。(后续做DOCX学习时再添补程序),