作品展示:
背景需求
前文对“2023年2月”的一套信息窗主题知识的文件系列,进行第一次的提取。获得基础模板。
【办公类-22-07】周计划系列(3-1)“信息窗+主题知识(提取)” (2024年调整版本)-CSDN博客文章浏览阅读795次,点赞7次,收藏16次。【办公类-22-07】周计划系列(3-1)“信息窗+主题知识(提取)” (2024年调整版本)https://blog.csdn.net/reasonsummer/article/details/136281042
可以看到,生成的“信息窗+主题知识”并非正好凑满1页,因此需要在每个word里添加一些时事内容了。控制字数多少与版面样式(在一页内的2分栏左右)。
第5步:增添文字内容,确定板式,把文字内容重新导入EXCEL,然后批量制作WROD
(1)在19份word里补全文字,控制字数
(2)最终确保 信息窗撑满半页、主题说明撑满半页
6、将以上第一次生成19份word(正确样式)做为“源文件”放入“03修改补充版”的新建文件夹。
复制“04合成新信息窗主题知识”的19份word(修订过的)到“03修改补充版”内
# https://blog.csdn.net/lau_jw/article/details/114383781
from openpyxl import load_workbook
from docx import Document
import glob
# 把 ”03去掉回车版“里面修改过的word文件 复制一份到 “03修改补充版”
#
import os
import shutil
path = r'D:\test\02办公类\91周计划4份_2024年中4班\06 信息窗+主题知识'
# 源文件夹路径
source_folder= path+r'\04合成新信息窗主题知识'
# 目标文件夹路径
target_folder = path+r'\03修改补充版'
# 遍历源文件夹中的所有文件
for file in os.listdir(source_folder):
# 判断文件类型为 Word(后缀名为 .docx、.doc)
if file.endswith('.docx') or file.endswith('.doc'):
# 构建源文件的完整路径
source_file = os.path.join(source_folder, file)
# 将文件从源文件夹复制到目标文件夹
target_file = os.path.join(target_folder, file)
shutil.copy2(source_file, target_file)
7、把19份修改过的WORD,写入EXCEL写入(让内容逐步丰富,此时不要删除空格了。)
(1)信息窗内容(读取第3行开始到“中4班”之间的内容,包含回车)
(2)主题说明内容( 还是通过获取“主题名称”“主题说明”“主题目标”“家园共育”的段落数,进行提取。其中家园共育的最大索引是=2)
(3)因为内容、格式、空行都是调整过了,所以不需要对EXCEL的内容删除空行、空格、清除格式。
(4)重点说明
这份原始模板里面的格式必须都改成文本,以免添加进去的文字出现内容缺失
代码展示:
# https://blog.csdn.net/lau_jw/article/details/114383781
from openpyxl import load_workbook
from docx import Document
import glob
# 把 ”03去掉回车版“里面修改过的word文件 复制一份到 “03修改补充版”
#
import os
import shutil
print('-----复制修改过的文件“04合成新信息窗和主题知识”到03修改补充版,类似与再次放在“03去掉回车”-----')
path = r'D:\test\02办公类\91周计划4份_2024年中4班\06 信息窗+主题知识'
# 源文件夹路径
source_folder= path+r'\04合成新信息窗主题知识'
# 目标文件夹路径
target_folder = path+r'\03修改补充版'
# 遍历源文件夹中的所有文件
for file in os.listdir(source_folder):
# 判断文件类型为 Word(后缀名为 .docx、.doc)
if file.endswith('.docx') or file.endswith('.doc'):
# 构建源文件的完整路径
source_file = os.path.join(source_folder, file)
# 将文件从源文件夹复制到目标文件夹
target_file = os.path.join(target_folder, file)
shutil.copy2(source_file, target_file)
print('---读取新的信息窗和主题说明里面的灰色字体部分,但是不要清除空格---')
path = r"D:\test\02办公类\91周计划4份_2024年中4班\06 信息窗+主题知识"
workbook = load_workbook(path + r'\10 改周次过渡模板_信息窗主题知识.xlsx')
sheet = workbook.active
number = 0
number1 = 0
d=[]
for file in glob.glob(path + r'\04合成新信息窗主题知识\*.docx'):
print(file)
doc = Document(file)
# 上面是提取信息窗灰色字体内容
content_lst = []
for paragraph in doc.paragraphs[3:]:
# 改过的模板里面,第0行周次,第1行亲爱的家长, 第2行你们好,从第3行开始选取
content = paragraph.text
# 判断单元格中的文字是否有空格
if content == '中4班':
# 改过的模板里面,碰到“中4”就不读取了
break
else:
q = ' ' + content # 如果段落有文字,读取整段,并在前面加4个空格(2字符)
content_lst.append(q)
print(content_lst)
content = '\n'.join(content_lst)
number += 1
# 写入AB列
sheet.cell(row=number+1, column=1).value = number
sheet.cell(row=number+1, column=2).value = content
# 下面是提取主题知识4块内容
#获取每个文档的行数
print("段落数:"+str(len(doc.paragraphs)))#段落数为13,每个回车隔离一段
d=len(doc.paragraphs)
for i in range(len(doc.paragraphs)):
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)
for i in range(len(doc.paragraphs)):
if '家园共育:' in doc.paragraphs[i].text:
h3=i # 家园共育在第几行
# # #家园共育结束值等于总行数
h4=d
z1=[] # 主题名称:
# 查找“主题名称”所在的行
for i in range(len(doc.paragraphs)):
# print("第"+str(i)+"段的内容是:"+doc.paragraphs[i].text)
if '主题名称:' in doc.paragraphs[i].text:
a1=doc.paragraphs[i].text
z1.append(a1[5:])
# 在同一行上,从5开始提取后面的汉字
# print(z1)
content1 = '\n'.join(z1) # 组合并加回车
z2=[] # 主题说明:
# 提取“主题说明”
for paragraph2 in doc.paragraphs[h1+1:h2]: # 主题说明h0固定是1行,所以从2开始提取,主题目标 是提取的行数h1-1, 索引取值,还是h1
t22 = paragraph2.text
t2= ' ' + t22
z2.append(t2)
print(z2)
content2 = '\n'.join(z2) # 组合并加回车
z3=[] # 主题目标:
# 提取“主题目标”
for paragraph3 in doc.paragraphs[h2+1:h3]: # 主题说明h0固定是1行,所以从2开始提取,主题目标 是提取的行数h1-1, 索引取值,还是h1
t3 = paragraph3.text
z3.append(t3)
print(z3)
content3 = '\n'.join(z3) # 组合并加回车
z4=[] # 家园共育:
# 提取“家园共育”
for paragraph4 in doc.paragraphs[h3+1:-2]: # 主题说明h0固定是1行,所以从2开始提取,主题目标 是提取的行数h1-1, 索引取值,还是h1
t4 = paragraph4.text
z4.append(t4)
print(z4)
content4 = '\n'.join(z4) # 组合并加回车
number1 += 1
# sheet.append([number, content1,content2,content3,content4]) # number是序号,一共遍历提取了几分Word的内容,content是主题知识中间部分的内容
# 写入第9=13列
sheet.cell(row=number+1, column=9).value = number1
sheet.cell(row=number+1, column=10).value = content1
sheet.cell(row=number+1, column=11).value = content2
sheet.cell(row=number+1, column=12).value = content3
sheet.cell(row=number+1, column=13).value = content4
workbook.save(path + r'\11 中4班下学期_信息窗主题知识.xlsx')
workbook.close()
# print('--打开XLSX-,把里面的空格删除,把1、替换成1.--')#
# # 打开Excel文件
# workbook = load_workbook(path + r'\11 中4班下学期_信息窗主题知识.xlsx')
# # 获取第一个工作表
# worksheet = workbook.active
# # # 遍历每个单元格
# for row in worksheet.iter_rows():
# for cell in row:
# if cell.value and isinstance(cell.value, str):
# # 清除单元格内文字的格式
# cell.value = cell.value.strip()
# # # 判断单元格中的文字是否有空格
# # if ' ' in str(cell.value):
# # # 替换空格为无空格
# # cell.value = str(cell.value).replace(' ', '')
# # if ' ' in str(cell.value):
# # # 替换空格为无空格
# # cell.value = str(cell.value).replace(' ', '')
# # # 替换文本
# # for s in range(1,10):
# # if cell.value and isinstance(cell.value, str):
# # cell.value = cell.value.replace("{}、".format(s), "{}.".format(s))
# # 保存修改后的Excel文件
# workbook.save(path + r'\11 中4班下学期_信息窗主题知识.xlsx')
# # 关闭Excel文件
# workbook.close()
(5)EXCEL还是使用
EXCEL看不出是否提取了所有的内容并格式正确。所以在生成一次19份WROD
8、再次生成19份WORD(板式都在A4半页)
# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
import xlwt
import xlrd
import os ,time
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
# path=r'D:\\test\\02办公类\\90周计划4份\\06 信息窗+主题知识'+'\\'
path = r"D:\test\02办公类\91周计划4份_2024年中4班\06 信息窗+主题知识"
print(path)
file_path=path+r'\04合成新信息窗主题知识(修改补充版)'
print(file_path)
# 二、遍历excel,逐个生成word(小标签.docx是前面的模板)
try:
os.mkdir(file_path)
except:
pass
list = pd.read_excel(path+'\\11 中4班下学期_信息窗主题知识.xlsx')
# 信息窗
title = list["title"].str.rstrip()
name =list["name"]
content=list["content"]
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()
# 主题知识
titlename = list["titlename"].str.rstrip()
name1=list["name1"]
sm=list["sm"].str.rstrip()# 没有str.rstrip()是数字格式
mb=list["mb"].str.rstrip()# 没有str.rstrip()是数字格式
gy=list["gy"].str.rstrip()# 没有str.rstrip()是数字格式
classroom1 =list["classroom1"].str.rstrip() # str.rstrip()都是文字格式
# T1 =list["T1"].str.rstrip() # 没有str.rstrip()是数字格式
# T2 =list["T2"].str.rstrip()# 没有str.rstrip()是数字格式
time1=list["time1"].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],
"name1": name1[i],
"titlename": titlename[i],
"sm": sm[i],
"mb" :mb[i],
"gy" :gy[i],
"classroom1": classroom1[i],
"time1": time1[i],
}
tpl = DocxTemplate(path+'\\12 信息窗主题知识_竖版双.docx')
# tpl = DocxTemplate(path+'\\12 信息窗主题知识_横版双.docx')
tpl.render(context)
# tpl.save(file_path+r"\\第{}周 {}班 信息窗({}).docx".format('%02d'%name[i],classroom[i],time[i]))
tpl.save(file_path+r"\\第{}周 {}班 信息窗主题知识({}).docx".format('%02d'%name[i],classroom[i],time[i]))
……通过反复的循环操作,让本次信息窗+主题知识的板式、字数、符合标准——两篇在A4一页上,信息窗和主题说明分别在半页上,
到此,本学的信息窗+主题说明完成了!!!!
第9步:把“信息窗+主题知识”转为png格式(a4横板一页)
代码展示:
'''
作者:毛毛
性质:转载
原网址 https://zhuanlan.zhihu.com/p/367985422
安装python,确保以下模块已经安装:win32com,fitz,re
在桌面新建文件夹,命名为:word2pdf2png
将需要转换的word(只能docx格式,可以多个)放入文件夹word2pdf2png
复制以下代码并运行。
本代码只生成png 文件夹内只有一级,子文件不生成
说明:
1、
2、把“03 新周计划生成(原版)”的内容复制到“04 新周计划(没有反思的打印)”
3、把“04 新周计划(没有反思的打印)”内容复制到“05 新周计划(没有反思的jpg上传)”
4、然后“05 新周计划(没有反思的jpg上传)”文件夹删除并生成第一张无反思的图片20份
5、空余时间。把““03 新周计划生成(原版)”文件夹的内容复制到“08 新周计划生成(手动修改-准)”文件夹,手动修改
(1)周计划第一页反思(限定在一页内)
(2)教案等
'''
#coding=utf-8
from win32com.client import Dispatch
import os
import re
import fitz
wdFormatPDF = 17 #转换的类型
zoom_x=2 #尺寸大小,越大图片越清晰 5超大,这里改成2
zoom_y=2 #尺寸大小,越大图片越清晰,长宽保持一致
rotation_angle=0#旋转的角度,0为不旋转
# print(----'把"04合成新信息窗主题知识"文件夹里的资料复制到"05jpg上传"'-----)
import os
import shutil
def copy_docx_files(source_dir, dest_dir):
for filename in os.listdir(source_dir):
source_path = os.path.join(source_dir, filename)
dest_path = os.path.join(dest_dir, filename)
if os.path.isfile(source_path) and filename.endswith(".docx"):
shutil.copy(source_path, dest_path)
if os.path.isdir(source_path):
copy_docx_files(source_path, dest_dir)
# 指定源文件夹和目标文件夹
old_pat =r'D:\test\02办公类\91周计划4份_2024年中4班\06 信息窗+主题知识\04合成新信息窗主题知识(修改补充版)' # 要复制的文件所在目录
new_path = r'D:\test\02办公类\91周计划4份_2024年中4班\06 信息窗+主题知识\05jpg上传' #新路径
# 调用复制函数
copy_docx_files(old_pat, new_path)
#print(----生成PDF和第一页图片-----)
def doc2pdf2png(input_file):
for root, dirs, files in os.walk(input_file):
for file in files:
if re.search('\.(docx|doc)$', file):
filename = os.path.abspath(root + "\\" + file)
print('filename', filename)
word = Dispatch('Word.Application')
doc = word.Documents.Open(filename)
doc.SaveAs(filename.replace(".docx", ".pdf"), FileFormat=wdFormatPDF)
doc.Close()
word.Quit()
for root, dirs, files in os.walk(input_file):
for file in files:
if re.search('\.pdf$', file):
filename = os.path.abspath(root + "\\" + file)
print('filename', filename)
# 打开PDF文件
pdf = fitz.open(filename)
# 逐页读取PDF
for pg in range(0, pdf.pageCount):
page = pdf[pg]
# 设置缩放和旋转系数
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
pm.writePNG(filename.replace('.pdf', '') + str(pg+1) + ".png")
pdf.close()
doc2pdf2png(new_path)
# 删除生成文件PDF 和 生成文件docx
for parent, dirnames, filenames in os.walk(new_path):
for fn in filenames:
if fn.lower().endswith('.pdf'):
os.remove(os.path.join(parent, fn))
if fn.lower().endswith('.docx'):# 删除原始文件docx 正则[pdf|docx]套不上,只能分成两条了
os.remove(os.path.join(parent, fn))
# 删除png中,尾号是2-8的png(Word只要第一页,后面生成的第二页图片不要
for parent, dirnames, filenames in os.walk(new_path):
for fn in filenames:
for k in range(2,9): # png文件名的尾数是2,3,4,5,6,7,8 不确定共有几页,可以把9这个数字写大一点)
if fn.lower().endswith(f'{k}.png'): # 删除尾号为2,3,4,5,6,7,8的png图片 f{k}='{}'.formart(k)
os.remove(os.path.join(parent, fn))
图片结果展示
先出现word和PDF
在出现一张图片
第7步:把png切割成两类图片,便于上传“班级主页”
由于信息窗和主题知识在一页上,但是上传班级主页时,需要拆分开来,所以要用坐标把图片切割。
代码展示
# 参考网址:https://blog.csdn.net/weixin_42182534/article/details/125773141?ops_request_misc=&request_id=&biz_id=102&utm_term=python%E6%88%AA%E5%8F%96%E5%9B%BE%E7%89%87%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-125773141.nonecase&spm=1018.2226.3001.4187
'''
功能:切割图片
'''
import os
import os.path
from PIL import Image
cood=[[30,85,842,1100],[830,85,1684,1100]]
# 左边距,上边距,右边距,下边距
# # # print('----------第2步:新建一个临时文件夹------------')
# # # # # 新建一个”装N份word和PDF“的文件夹
name=['06信息窗上传图片','07主题知识上传图片']
ys=['信息窗','主题知识']
for i in range(len(name)):
imagePath1=r'D:\test\02办公类\91周计划4份_2024年中4班\06 信息窗+主题知识\{}'.format(name[i])
if not os.path.exists(imagePath1): # 判断存放图片的文件夹是否存在
os.makedirs(imagePath1) # 若图片文件夹不存在就创建
else:
pass
# 定义文件所在文件夹
image_dir = r'D:\test\02办公类\91周计划4份_2024年中4班\06 信息窗+主题知识\05jpg上传'
for parent, dir_name, file_names in os.walk(image_dir): # 遍历每一张图片
for filename in file_names:
print(filename)
# 第19周 中4班 信息窗主题知识(2024.6.24——2024.6.28)1.png
pic_name = os.path.join(parent, filename)
image = Image.open(pic_name)
_width, _height = image.size
print(_width, _height)
# 1684 1191
a=cood[i][0]
b=cood[i][1]
c=cood[i][2]
d=cood[i][3]
# 定义裁剪范围(left, upper, right, lower)1024
# # box = image.crop((0,0,123,123))
box = image.crop((a,b,c,d))
# 第19周 中4班 信息窗主题知识(2024.6.24——2024.6.28)1.png
box.save(imagePath1+r'\\{} {} {}.png'.format(filename[:8],ys[i],filename[17:-6]))
# {第19周 中4班}+_+{'信息窗'}+_+{2024.6.24——2024.6.28}.png
print('Done!')
利用坐标切割图片,并保存在指定文件夹里,控制图片名称
(1)信息窗:上传图片
(2)主题知识:上传图片
终于搞完了一套“周计划资料-信息窗主题说明”,耗费好久天,但是与去年相比,代码更周全,减少一些替换EXCEL的动作。更优化了代码。
在去年制作的基础上进一步优化
【办公类-22-01】周计划系列(1)-生成“信息窗”(提取旧docx内容,写入EXCLE模板,再次生成新docx)-CSDN博客文章浏览阅读232次。【办公类-22-01】周计划系列-信息窗的制作(提取旧docx内容,写入EXCLE模板,再次生成新docx)https://blog.csdn.net/reasonsummer/article/details/129843824【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_从docx-tpl怎么:导入docx模板-CSDN博客文章浏览阅读583次。【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)_从docx-tpl怎么:导入docx模板https://blog.csdn.net/reasonsummer/article/details/129902271