【办公类-22-08】周计划系列(4)“育儿知识(家园小报)“ (2024年调整版本)

作品展示

背景需求:

制作“育儿知识(家园小报)”,查询发现去年就没有做

因为“家园小报”基本没有段落文字,都是“文本框文字、艺术字“,很难用python提取文字。

由于只有6篇,因此去年采用的就是手动贴文字到excel表格中,再用word模板批量的方法

今年尝试用python读取word文本框文字,还是显示为空,

所以和去年一样,手动复制word,制作excel内容.

本学年墙面贴的是“育儿知识”A4竖版

将两份代码合并

主要步骤:

1、doc更改,统一文件名长度

2、doc转docx

3、docx去掉回车符(空行)发现内部都是文本框,清除回车后整个文本框都删光了

4、手动提取word内容导入EXCEL

5、在word模板里,将EXCEL内容填入,保存多个docx

6、把docx转成png

6、把1张png切割成2张png(班级主页)

素材准备:

都是“03 育儿知识 ”下的内容

第01步:修改文件名 

把文件名改成”2024年02月 家园小报.doc“

代码展示:

微调部分——统计文件名的长度:

import os
import timepath =r"D:\test\02办公类\91周计划4份_2024年中4班\03 育儿知识\01doc"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='2024年'+newname1+'月 家园小报.doc'oldname_path = os.path.join(path,file)# 文件新路径newname_path = os.path.join(path,newname)# 新旧对调os.rename(oldname_path, newname_path)#  2023年2周 家园小报.doc 16字符# 延时
time.sleep(2)fileList=os.listdir(path)for file in fileList:   if len(file)==16:    #2023年2周 家园小报.doc 16字符   16是一位数的周次 print(file)   split_str = file.split('年')newname1 = split_str[0]  # _的第0部分=序号 print(newname1)newname2= split_str[1]  # _的第0部分=序号 print(newname2)newname=newname1+'年0'+newname2oldname_path = os.path.join(path,file)# 文件新路径newname_path = os.path.join(path,newname)# 新旧对调os.rename(oldname_path, newname_path)if len(file)==17:     # 2023年12周 家园小报.doc 16字符  17是两位数的周次    pass

终端显示

第2步:原有文件格式从doc变成docx

代码展示——doc文件下的19个doc转到docx文件下的19个docx

import os
from win32com import client as wc
import time
#  注意:目录的格式必须写成双反斜杠
path=r"D:\test\02办公类\91周计划4份_2024年中4班\03 育儿知识"
oldpath=path+r'\01doc'  # 使用绝对地址(可更改)原文件doc地址
newpath=path+r'\02docx'# 使用绝对地址(可更改)docx地址# 提取所有doc内的19周doc周计划的路径
files=[]
for file in os.listdir(oldpath):# 找出文件中以.doc结尾并且不以~$开头的文件(~$是为了排除临时文件)if file.endswith('.doc') and not file.startswith('~$'): files.append(oldpath+'\\'+file)print(files)# 打开doc文件下的doc文件,另存到docx文件下的docx文件
for file in files:word = wc.Dispatch("Word.Application")print("已处理文件:"+file)
# #     # 打开文件doc = word.Documents.Open(file)
#     # # 将文件另存为到docx文件夹,另存为.docx#   # 这里根据文件名称长度,进行数字确定# 2023年06周 家园小报.doc 一共17字符new=newpath+'\\'+file[-17:]+'x'print(new)doc.SaveAs("{}".format(new), 12)    # 12表示docx格式doc.Close()

第3步:删除docx里面的回车符

删除回车符,就把原来的“家园小报”里面所有的文本框都删掉了,

这里先跳过。

第4步:整理“主题知识”的EXCEL信息,手动写入 中4班下学期“主题知识”.xlsx

打开每一个word

选取标题和内容(每页上有2套)

同样方法复制所有文本框里的内容。

EXCEL里面有特殊格式 空格,顿号、可以用程序批量删除,修改

代码展示:

# https://blog.csdn.net/lau_jw/article/details/114383781from docx import Document
from openpyxl import load_workbook
import glob
import re#  将模板 Excel 读取进程序:
path = r"D:\test\02办公类\91周计划4份_2024年中4班\03 育儿知识"
workbook = load_workbook(path + r'\10 改周次过渡模板_育儿知识.xlsx')
sheet = workbook.active# 手动贴入信息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()# number = 0#  # 提取四个加粗标题所在的行数    # 参考https://www.shouxicto.com/article/96876.html# for file in glob.glob(path + r'\03去掉回车\*.docx'):
#     print(file)#     doc= Document(file)#     #获取每个文档的行数  
#     # print("段落数:"+str(len(doc.paragraphs)))#段落数为13,每个回车隔离一段
#     d=len(doc.paragraphs)#         # 保存所有段落文字的列表
#         # 保存所有段落文字的列表
#     paragraphs = []#     # # 遍历文档中的段落,并将文字添加到列表中
#     # for paragraph in doc.paragraphs:
#     #     paragraphs.append(paragraph.text)#     # # 遍历文档中的内联形状,提取文本框文字并添加到列表中
#     # for shape in doc.inline_shapes:
#     #     if shape.text_frame:
#     #         paragraphs.append(shape.text_frame.text)
#     # print(paragraphs)#     # 提取word文本框中文本#     children = file.element.body.iter()
#     child_iters = []
#     for child in children:
#         # 通过类型判断目录
#         if child.tag.endswith('textbox'):
#             for ci in child.iter():
#                 if ci.tag.endswith('main}r'):
#                     child_iters.append(ci)
#     textbox = [ci.text for ci in child_iters]
#     print(textbox)# #     number += 1
# #     # sheet.append([number, content1,content2,content3,content4])  # number是序号,一共遍历提取了几分Word的内容,content是育儿知识中间部分的内容# #     sheet.cell(row=number+1, column=1).value = number
# #     sheet.cell(row=number+1, column=2).value = content1
# #     sheet.cell(row=number+1, column=3).value = content2
# #     sheet.cell(row=number+1, column=4).value = content3
# #     sheet.cell(row=number+1, column=5).value = content4# # workbook.save(path + r'\11 中4班下学期_育儿知识.xlsx')
# # workbook.close()

结果展示

第5步:读取word模板,把EXCEL-育儿知识 的内容 合成6份 Docx

代码展示

# 一、导入相关模块,设定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# 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:passlist = pd.read_excel(path+'\\11 中4班下学期_信息窗主题知识.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() # 主题知识
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]))

运行结果

打开手动清除不要的内容、调整首行缩进、控制字数多少与版面样式,不需要手码日期了(*^_^*)

第6步:把育儿知识”转为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 shutildef 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班\03 育儿知识\04合成新育儿知识'  # 要复制的文件所在目录
new_path = r'D:\test\02办公类\91周计划4份_2024年中4班\03 育儿知识\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)# 逐页读取PDFfor 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、最后出现一张图片

说明:由于每次选用的word原素材格式、内容、结构都不同,所以最好把代码分成6个,逐一调整路径、内容选择范围等。这是个很细致的活儿。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【线程池项目(四)】项目的死锁问题分析和资源回收机制的改善

在上一篇 【线程池项目(三)】线程池CACHED模式的实现中我们大概说了说cached模式的基本实现,对于多线程编程,我们需要考虑的问题也较于单线程更多、更复杂,经常存在线程同步、资源竞争等复杂的并发控制问题&#xff0c…

【Java程序设计】【C00276】基于Springboot的就业信息管理系统(有论文)

基于Springboot的就业信息管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的就业信息管理系统 本系统分为前台功能模块、管理员功能模块、学生功能模块、企业功能模块以及导师功能模块。 前台功能模块&…

微服务知识02

1、九大高并发解决方案 2、系统架构图​​​​​​​ 3、分布式事务 本地事务、分布式事务 操作不同服务器的数据库(垂直分库) 4、分布式事务解决方案(没有seata之前) (1)XA协议(强一致性&a…

PixPin:一键搞定截图、长截图、贴图、GIF

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是PixPin?①PixPin②核心功…

readproc.h

Ubuntu22.04系统中 编译自己写的程序的时候,报错,显示找不到readproc.h文件,通过安装libprocps-dev解决 sudo apt install libprocps-dev

项目解决方案:街道社区视频监控接入、汇聚和联网设计方案

目 录 一、客户需求 二、网络拓扑图 三、方案描述 四、系统配置 1、服务器配置 2、带宽配置 五、方案优势 1. 平台可堆叠使用 2. 支持主流接入协议 4. 多种终端显示 5. 客户端功能强大 6. 一机一档 一、客户需求 1,一个街道有十个社…

消息中间件篇之RabbitMQ-高可用机制

一、怎么保证高可用性 在生产环境下,使用集群来保证高可用性,一般我们采用普通集群、镜像集群、仲裁队列。 二、普通集群 普通集群,或者叫标准集群(classic cluster),具备下列特征: 1. 会在集…

蓝桥杯DP算法——区间DP(C++)

根据题意要求的是将石子合并的最小权值,我们可以根据DP思想使用二维数组f[i,j]来存放所有从第i堆石子到第j堆石子合并成一堆石子的合并方式。 然后由第二个图所示,我们可以将i到j区间分成两个区间,因为将i到j合并成一个区间的前一步一定是合…

SpringBoot自动装配的原理

废话不多说,直接上干货 SpringBoot 是如何实现自动装配的? 以我这个2.6.13的版本为例 第一步,我们先从SpringBootApplication这个入口注解看起 在springBootApplication这个注解当中有三个关键性的注解,大概可以看作是&#xff1a…

Java面试:Spring Cloud Alibaba

文章目录 引言I Spring Cloud Alibaba1.1 配置文件加载的优先级(由高到低)1.2 注册中心1.3 rpcII 高并发场景:缓存穿透/缓存失效/雪崩如何解决2.1 缓存穿透2.2 缓存击穿(失效)2.3 缓存雪崩引言 微服务涉及的中间件分布式事务事务的传播方式事务的隔离级别缓存穿透/缓存失效…

Matlab/simulink基于vsg的风光储调频系统建模仿真(持续更新)

​ 1.Matlab/simulink基于vsg的风光储调频系统建模仿真(持续更新)

C/C++暴力/枚举/穷举题目持续更新(刷蓝桥杯基础题的进!)

目录 前言 一、百钱买百鸡 二、百元兑钞 三、门牌号码(蓝桥杯真题) 四、相乘(蓝桥杯真题) 五、卡片拼数字(蓝桥杯真题) 六、货物摆放(蓝桥杯真题) 七、最短路径(蓝…

图解目标检测 之 【YOLOv9】 算法 最全原理详解

YOLOv9与SOTA模型对比 什么是 YOLOv9?YOLOv9是YOLO系列中的最新产品,是一种实时目标检测模型。它通过先进的深度学习技术和架构设计,包括通用 ELAN (GELAN) 和可编程梯度信息 (PGI),展现出更好的性能。 YOLO 系列通过引入计算机视…

Java/Python/Go不同开发语言基础数据结构和相关操作总结-GC篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结 1. 常见gc方式1.1 gc判断对象是否存活1.2 引用计数法1.2 标记-清除算法1.3 复制算法1.4 标记-压缩算法1.5 分代收集算法 2. java的gc方式以及垃圾回收器2.1 gc方式2.1 gc回收器2.1.1 Serial收集器2.1.2 ParNew收集器2.1.…

Socket、UDP、TCP协议和简单实现基于UDP的客户端服务端

目录 Socket TCP和UDP区别 UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字节流,全双工 无连接和有连接 可靠传输和不可靠传输 面向数据报和面向字节流…

学习或从事鸿蒙开发工作,有学历要求吗?

目前安卓有2,000万的开发者。本科及以上学历占比为35%;iOS有2,400万开发者,本科及以上学历占比为40% 绝大多数的前端开发者都是大专及以下学历,在2023年华为开发者大会上余承东透露华为的开发者目前有200万,但鸿蒙开发者统计的数据…

C#,数组数据波形排序(Sort in Wave Form)的朴素算法与源代码

1 波形排序 所谓“波形排序”就是一大一小。 将n个身高互不相同的人排成一行 ,对于每个人 ,要求他要么比相邻的人均高 ,要么比相邻的人均矮 ,问共有多少种排法 ,这一问题称为波形排列问题。 2 源程序 using System; using System.Collections; using System.Collections.Gen…

[嵌入式系统-33]:RT-Thread -18- 新手指南:三种不同的版本、三阶段学习路径

目录 前言:学习路径:入门学习-》进阶段学习》应用开发 一、RT-Thread版本 1.1 标准版 1.2 Nano 1.3 Smart版本 1.4 初学者制定学习路线 1.5 RT-Thread在线文档中心目录结构 1.6 学习和使用RT-Thread的三种场景 二、入门学习阶段:内…

信息系统项目管理师论文分享(质量管理)

水一篇文章。我发现身边考高项的朋友很多都是论文没过,我想着那就把我的论文分享出来,希望能有帮助。 质量管理 摘要 2020年5月,我作为项目经理参加了“某市某医联体的互联网诊疗(互联网医院和远程医疗)平台”的建设…

编程的基础:理解时间和空间复杂度

编程的基础:理解时间和空间复杂度 时间复杂度空间复杂度示例常数时间复杂度 O(1)线性时间复杂度 O(n)线性对数时间复杂度 O(n log n)二次时间复杂度 O(n^2)指数时间复杂度 O(2^n) 空间复杂度示例常数空间复杂度 O(1)线性空间复杂度 O(n)线性对数空间复杂度 O(log n)…