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

news2025/1/20 12:11:29

作品展示

背景需求:

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

因为“家园小报”基本没有段落文字,都是“文本框文字、艺术字“,很难用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 time


path =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'+newname2
    oldname_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/114383781

from 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:
    pass



list = 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 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班\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)
                # 逐页读取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、最后出现一张图片

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

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

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

相关文章

【C语言】详解计算机二级c语言程序题

文章目录 前言资料相关程序题 一(字符串)程序题 二(数组)程序题 三(基础)程序题 四(结构体)程序题 五(结构体)程序题 六(基础) 前言 …

【广度优先搜索】【网格】【割点】1263. 推箱子

作者推荐 视频算法专题 涉及知识点 广度优先搜索 网格 割点 并集查找 LeetCode:1263. 推箱子 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示,其中每个元素可以是墙、地板或…

C# 使用onnxruntime部署夜间雾霾图像的可见度增强

目录 介绍 模型信息 效果 项目 代码 下载 C# Onnx 使用onnxruntime部署夜间雾霾图像的可见度增强 介绍 github地址:GitHub - jinyeying/nighttime_dehaze: [ACMMM2023] "Enhancing Visibility in Nighttime Haze Images Using Guided APSF and Gradien…

如何实现负载均衡呢?

如何实现负载均衡呢? 一、问题解析 常见的实现方案有三种!  基于 DNS 实现负载均衡  基于硬件实现负载均衡  基于软件实现负载均衡 先来说一下基于 DNS 实现负载均衡的方式,它的实现方式比较简单,只需要在 DNS 服务器上…

apidoc接口文档的自动更新与发布

文章目录 一、概述二、环境准备三、接口文档生成1. 下载源码2. 初始化3.执行 四、文档发布五,配置定时运行六,docker运行七,优化方向 一、概述 最近忙于某开源项目的接口文档整理,采用了apidoc来整理生成接口文档。 apidoc是一个…

Java基于SpringBoot的口腔医院管理平台,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

仿12306校招项目业务三(用户注册)

用户表结构 原本的表结构如下 由于用户量大,采用分库分表: 分库分表设计 根据系统设计的假设,12306 的注册用户规模约为 10 亿,每年新增用户约 1000 万。在用户数据分库或分表之前,我们需要先考虑拆分成多少个库或表…

我们和openAi的差距,只差向神祈祷了?

这两天看到了两张挺有意思的图片,关于openAi研究人员和qianWen的研究人员的日常生活作息表。蛮有意思,看到后有很多感想,特地分享出来。(声明:对比没有恶意,也没有好坏之分。他们本都是站在金字塔最顶尖的人…

StarRocks——滴滴OLAP的技术实践与发展方向

原文大佬的这篇StarRocks实践文章整体写的很深入,介绍了StarRocks数仓架构设计、物化视图加速实时看板、全局字典精确去重等内容,这里直接摘抄下来用作学习和知识沉淀。 目录 一、背景介绍 1.1 滴滴OLAP的发展历程 1.2 OLAP引擎存在的痛点 1.2.1 运维…

AI人工智能芯片制作研究与开发技术资料(三百多份文档)【机×密】

收藏多年的精品,不可多得的东西。对芯片开发研究有兴趣同学,赶快下载看看吧。文件大小3G多。 AI人工智能芯片制作研究与开发技术资料(三百多份文档)【机密】 下载地址: 链接:https://pan.baidu.com/s/14Duh…

【网络安全】SQL注入_sql注入攻击实例(网安人必学系列)

1.1 .Sql注入攻击原理 SQL注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,它也是目前被利用得最多的漏洞。要学会如何防御SQL注入,首先我们要学习它的原理。 针对SQL注入的攻击行为可描述为通过在用户可控参数中注入SQL语法,破…

容器镜像详解

1. 镜像组成 一个标准的OCI容器镜像由index, manifest, config, image layers这几个部分组成。 以docker镜像为例,下载的镜像文件保存在/var/lib/docker/目录下面 image/overlay2子目录下面保存着镜像相关的一些元数据 在下面的介绍主要以nginx:latest镜像为例子…

Django定时任务之django_apscheduler使用

Django定时任务之django_apscheduler使用 今天在写一个任务需求时需要用到定时任务来做一部分数据处理与优化,于是在了解完现有方法,结合自己需求决定使用django_apscheduler,记录一下过程,有几篇值得参考的文章放在结尾&#xf…

超详细!彻底说明白Redis持久化

本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 文章目录 Redis持久化方式RDBfork 函数与写时复制RDB 相关配置 AOFAOF 文件解读AOF 的写入与同步AOF 重写AOF重写的实现AOF 重写面临的问题AOF重写缓存区 AOF相关配置AOF …

【深入了解设计模式】适配器设计模式

适配器设计模式 适配器设计模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口,从而使得原本由于接口不兼容而不能一起工作的类能够一起工作。适配器模式通常用于以下场景: 现有接口与需求不匹配:当需要…

Escalate_Linux(4)-利用SUDO实现提权

利用SUDO实现提权 利用用户的sudo授权获得root的shell cat /etc/passwd cat /etc/sudoers 命令没有权限 echo "cat /etc/sudoers" >/tmp/ls chmod 755 /tmp/ls export PATH/tmp:$PATH /home/user5/script 想办法更改user1的口令 echo echo "user1:xiao…

【C语言基础】:操作符详解(一)

文章目录 操作符详解1. 操作符的分类2. 二进制和进制转换2.1 什么是二进制、八进制、十进制、十六进制2.1.1 二进制和进制转换2.1.2 二进制转十进制2.2.3 二进制转八进制2.2.4 二进制转十六进制 3. 源码、反码、补码4. 移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&…

协议的概念+本质+作用+最终表现形式,网络问题(技术+应用+解决的协议+存在原因),主机的对称性

目录 协议 概念 示例 -- 摩斯密码 本质 作用 网络问题 引入 技术问题 应用问题 主机的对称性 问题对应的协议 问题出现的原因 理解协议(代码层面) 举例 -- 快递单 协议的最终表现形式 协议被双方主机认知的基础 协议 概念 协议是在计算机通信和数据传输中规定通…

Seata Server 服务搭建

概述 Seata 分布式事务需要 Seata Seaver 支持,Seata Server在 架构中扮演着 事务管理器的角色。Seata 服务需要往 Nacos 注册中心注册、以及读取配置文件,因此 Seata 启动前需要部署 Nacos 环境。 安装包下载 下载地址: https://download.csdn.net/dow…

【Redis学习笔记03】Java客户端

1. 初识Jedis Jedis的官网地址&#xff1a;https://github.com/redis/jedis 1.1 快速入门 使用步骤&#xff1a; 注意&#xff1a;如果是云服务器用户使用redis需要先配置防火墙&#xff01; 引入maven依赖 <dependencies><!-- 引入Jedis依赖 --><dependency&g…