【办公类-22-01】周计划系列(1)-生成“信息窗”(提取旧docx内容,写入EXCLE模板,再次生成新docx)
前一篇介绍了生成”信息窗“的过程,本篇介绍周计划的第2款内容——主题说明的生成
我发现:每当换一个教室,如果想要继续使用门前原有的信息窗结构,就要适应不同的板式风格。本次的信息窗都是A4横版的,因此原有的“信息+主题”合并版资料,以及全部竖版的4份资料内容,都需要修改成A4横版(竖版变成程横版)
把“2018年的中5班主题说明(8个Word-A4竖版)”中的内容,批量生成导成“2023年-中6班下学期主题说明(8个Word-A4横版)
1、提取“2018年-中5班上学期主题说明”(8份docx)的内容,分别将”主题说明“”主题目标“”家园共育“里面的内容导入模板EXCLE的不同单元格中,
2、用{{}}的方法提取EXCEL数据,批量生成新内容、新格式的“2023年-中6班下学期主题说明”(8份docx)
运行后,转为docx,删除原来的doc
import os
from win32com import client as wc
import time
# 注意:目录的格式必须写成双反斜杠
path="D:\\test\\02办公类\\90周计划4份\\02 主题知识2\\旧主题知识\\" # 使用绝对地址(可更改)
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的效果
from docx import Document
from openpyxl import load_workbook
import glob
import os
path = r'D:\test\02办公类\90周计划4份\02 主题知识2'
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
(把去掉空行的8份Word放到“”docx(无空行)“”文件夹里面备用)
# 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办公类\90周计划4份\02 主题知识2'
workbook = load_workbook(path + r'\主题知识过渡模板.xlsx')
sheet = workbook.active
number = 0
for file in glob.glob(path + r'\旧主题知识\*.docx'): # 读取所有以前的主题知识参考资料
print(file)
doc= Document(file)
# 提取三个加粗标题所在的行数 # 参考https://www.shouxicto.com/article/96876.html
#获取每个文档的行数
print("段落数:"+str(len(doc.paragraphs)))#段落数为13,每个回车隔离一段
# 读取标题:
title=[]
for paragraph1 in doc.paragraphs[0:1]: # 第0行标题
t1 = paragraph1.text # 只要原周计划中间的段落内容
title.append(t1[5:])
print(title)
content1 = '\n'.join(title) # 组合并加回车
#输出每一段的内容
for para in doc.paragraphs:
print(para.text)
# “主题说明“固定在1行,所以不用查找了
h0=1
#查找“主题目标”所在的行
for i in range(len(doc.paragraphs)):
# print("第"+str(i)+"段的内容是:"+file.paragraphs[i].text)
if '主题目标' in doc.paragraphs[i].text:
h1=i
print(h1)
#查找“家园共育”所在的行
for i in range(len(doc.paragraphs)):
if '家园共育' in doc.paragraphs[i].text:
h2=i
print(h2)
#家园共育结束值等于-3
h3=-3
# 提取“主题说明”
sm = []
for paragraph2 in doc.paragraphs[h0+1:h1]: # 主题说明h0固定是1行,所以从2开始提取,主题目标 是提取的行数h1-1, 索引取值,还是h1
t2 = paragraph2.text
sm.append(t2)
print(sm)
content2 = '\n'.join(sm) # 组合并加回车
# 提取“主题目标”
mb = []
for paragraph3 in doc.paragraphs[h1+1:h2]: # 主题目标 是提取的行数+1,家园共育 提取行数-1 索引取值,还是h2
t3 = paragraph3.text
mb.append(t3)
print(mb)
content3 = '\n'.join(mb) # 组合并加回车
# 提取“家园共育”
gy = []
for paragraph4 in doc.paragraphs[h2+1:-2]: # 家园共育 是提取的行数+1,删除最后两行的班级日期,范围是-2
t4 = paragraph4.text
gy.append(t4)
print(gy)
content4 = '\n'.join(gy) # 组合并加回车
number += 1
sheet.append([number, content1,content2,content3,content4]) # number是序号,一共遍历提取了几分Word的内容,content是主题知识中间部分的内容
workbook.save(path + r'\中6班下学期主题知识.xlsx')
1、思路一:将“主题说明”等三个关键词批量加粗。
但是目前读取的docx数据再次转换为docx时,所有的格式都清除了,目前还没有找到能够将关键词加粗的代码。要么手动将三个标题加粗。
2、思路二:读取“主题说明”等三个加粗标题所在的行数,
观察代码,发现它是读取段落[0:X]的,只要确定起始段和终止段,就可以把中间的非加粗部分内容太提取出来。
(序号num、标题title、主题说明sm 、主题目标mb、家园共gy)
模板中输入各种{{English}}——标题加粗(黑体三号)、段落(1.5行距)、字体(宋体小三)、0空行……这些都在word模板里面调整好
# 一、导入相关模块,设定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办公类\\90周计划4份\\02 主题知识2'+'\\'
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()
num=list["num"]
sm=list["sm"].str.rstrip()# 没有str.rstrip()是数字格式
mb=list["mb"].str.rstrip()# 没有str.rstrip()是数字格式
gy=list["gy"].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行,逐个生成
numnum = list.shape[0]
for i in range(numnum):
context = {
"num": num[i],
"title": title[i],
"sm": sm[i],
"mb" :mb[i],
"gy" :gy[i],
"classroom": classroom[i],
"time": time[i],
}
tpl = DocxTemplate(zpath+'主题知识_横版.docx')
tpl.render(context)
tpl.save(file_path+r"\{}主题知识_{}({}班下学期).docx".format('%02d'%num[i],title[i],classroom[i]))
修改内容:主题说明的内容不修改,内容都是固定的。实际上只要调整板式、班级、日期
有些周次的内容数量多,会超过一页。需要手动调整(删除空行、删除段落、调整间距等)
可以一次性批量打印好
1、docx段落内容导入EXCEL,再转成新docx。速度快,可以反复修正。太神奇了!
2、完成第2个周计划”主题说明“的文本转移,后续继续研究育儿知识、周计划(教案)的内容转移。