【办公类-22-06】周计划系列(1)“信息窗” (2024年调整版本)

news2024/11/20 13:20:44

作品展示

调用原来的信息窗素材,制作下学期的19周的信息窗基础word

背景需求:

开学了,继续做周计划系列,在原有基础上,进行进一步代码优化

【办公类-22-01】周计划系列(1)-生成“信息窗”(提取旧docx内容,写入EXCLE模板,再次生成新docx)-CSDN博客文章浏览阅读229次。【办公类-22-01】周计划系列-信息窗的制作(提取旧docx内容,写入EXCLE模板,再次生成新docx)https://blog.csdn.net/reasonsummer/article/details/129843824icon-default.png?t=N7T8https://blog.csdn.net/reasonsummer/article/details/129843824

素材准备:

都是“01 信息窗”下的内容

第01步:原有文件的名称 1-9周改成01-09周

原来的信息窗资料

把文件名中的周次改成2位数

文件名格式不统一,有的周后面有空格,有的窗后面有主题名称……需要统一改成——第X周 信息窗

A:先统一格式

B:在对1-9周的数字进行2位数补全

代码展示:

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

如:第9周信息窗.doc   一共10字符,对所有10字符的文件名进行加0处理,如果 第10周信息窗.doc 等于11字符,就不要加0

import os
import time


path =r"D:\test\02办公类\91周计划4份_2024年中4班\01 信息窗\01doc"
print('--把文件名称统一 第X周 信息窗---')

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=newname1+'周 信息窗.doc'
  oldname_path = os.path.join(path,file)
  # 文件新路径
  newname_path = os.path.join(path,newname)
  # 新旧对调
  os.rename(oldname_path, newname_path)

# 延时
time.sleep(2)

print('--把第1周改成第01周 ---')

fileList=os.listdir(path)
print(fileList)

for file in fileList:
  if len(file)==11:    # 第9周信息窗.doc   11是一位数的周次 
    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)==12:     # 第10周信息窗.doc  11是两位数的周次    
    pass
  

  

终端显示

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

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

原来代码用的是绝对路径双反斜杠并且需要手动把doc文件复制一份到docx,现在用相对路径,且直接另存到docx内

import os
from win32com import client as wc
import time
#  注意:目录的格式必须写成双反斜杠
path=r"D:\test\02办公类\91周计划4份_2024年中4班\01 信息窗"
oldpath=path+r'\doc'  # 使用绝对地址(可更改)原文件doc地址
newpath=path+r'\docx'# 使用绝对地址(可更改)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
    new=newpath+'\\'+file[-11:]+'x'
    print(new)
    doc.SaveAs("{}".format(new), 12)    # 12表示docx格式
    doc.Close()

           
 
 

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

每份docx里面会有一些空行回车

删除空行回车符

代码展示

from docx import Document
from openpyxl import load_workbook
import glob

import os

path=r"D:\test\02办公类\91周计划4份_2024年中4班\01 信息窗"
for file in glob.glob(path + r'\docx\*.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

第4步:整理“信息窗”的EXCEL信息,写入 中4班下学期信息窗.xlsx

代码展示:

# https://blog.csdn.net/lau_jw/article/details/114383781

from openpyxl import load_workbook
from docx import Document
import glob

path = r"D:\test\02办公类\91周计划4份_2024年中4班\01 信息窗"
workbook = load_workbook(path + r'\10 改周次过渡模板_信息窗.xlsx')
sheet = workbook.active

number = 0

for file in glob.glob(path + r'\03去掉回车\*.docx'):
    print(file)
    doc = Document(file)
    
    content_lst = []
    
    for paragraph in doc.paragraphs[1:]:
        content = paragraph.text
         # 判断单元格中的文字是否有空格
        if content == '中八班':
            break
        else:
            q = '    ' + content
            content_lst.append(q)
    
    print(content_lst)

    content = '\n'.join(content_lst)
    number += 1

    sheet.cell(row=number+1, column=1).value = number
    sheet.cell(row=number+1, column=2).value = content

# 修改班级名称
workbook.save(path + r'\11 中4班下学期_信息窗.xlsx')

思路解析——提取信息窗中间部分的内容

结果展示

第5步:读取word模板,把EXCEL-信息窗的内容 合成19份信息窗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份\\01 信息窗'+'\\'
path = r"D:\test\02办公类\91周计划4份_2024年中4班\01 信息窗"
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() 




# 遍历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], 
        
       
    }
    tpl = DocxTemplate(path+'\\12 主题知识_竖版双.docx.docx')
    # 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]))


   

运行结果

第6步:把信息窗转为jpg格式,便于上传“班级主页”

代码展示:

'''
作者:毛毛 
性质:转载
原网址 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班\01 信息窗\04合成新信息窗'  # 要复制的文件所在目录
new_path = r'D:\test\02办公类\91周计划4份_2024年中4班\01 信息窗\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))

图片结果展示()

感悟:

虽然花了十几个小时调试优化代码,但是这非常值得。

1、基础信息的批量生成:

批量生成周次、班级、教师、日期等基础信息,可以确保文本格式的规范性(格式字体统一、基础信息无错误),不用每周去输入这些无价值的信息。

2、调用原有信息窗内容。

快速调用原有信息窗的内容,一方面可以“撑满格子”,另一方面“确保字体格式一致(统一小四宋体 20磅行距)”,视觉上美观、规范,教师可以在此基础上 进行内容调整,提高信息窗撰写的效率

3、本学期的墙面上信息窗和主题说明是在一页的,我并不喜欢这种设计,也还是要考虑这种可能性。

4、最好的还是信息窗一份(A4横版或竖版)、主题说明一份(A4竖版)的样式。

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

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

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

相关文章

供应链大数据:穿越经济迷雾的指南针

随着经济形势的变幻莫测,企业运营面临着前所未有的挑战。在这个充满不确定性的时代,供应链大数据如同一盏明亮的指南针,为企业提供精准的方向指引。下面,我们将深入探讨供应链大数据如何帮助企业洞察市场趋势、优化库存管理、降低…

K线实战分析系列之八:十字星——容易识别的特殊形态

K线实战分析系列之八:十字星——容易识别的特殊形态 一、十字启明星和十字黄昏星二、弃婴底部形态和弃婴顶部形态三、总结十字启明星和十字黄昏星形态的要点 一、十字启明星和十字黄昏星 当开盘价与收盘价极为接近的时候,当期的K线就呈现为一根十字线&am…

PyPDF2:项目实战源码分享(PDF裁剪)

目录📑 1. 背景📑2. 源码模块解析📑2.1 读取PDF页数2.2 获取指定页的宽高尺寸2.3 裁剪单页PDF2.4 批量裁剪PDF 总结📑 1. 背景📑 接PyPDF2模块推荐博文中提到的实际需求(将银行网站下载来的多页且单页多张…

设计模式--单例模式--懒汉饿汉

单例模式 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实…

[嵌入式系统-34]:RT-Thread -19- 新手指南:RT-Thread标准版系统架构

目录 一、RT-Thread 简介 二、RT-Thread 概述 三、许可协议 四、RT-Thread 的架构 4.1 内核层: 4.2 组件与服务层: 4.3 RT-Thread 软件包: 一、RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然…

vue-element-admin如何绕开系统的请求的路由,使用静态路由

我开发时候遇到一个这样的问题,服务端权限管理部分还没搞好,所以但是需要将所有菜单列出来 我做了以下的修改 首先是建一个文件存放后期需要动态生成的路由 引入到常量路由中 另外在permissions当中

FPGA之16:1复选器

每个slice 都有一个F8MUX。F8MUX原语: MUXF8 MUXF8_inst( .0(0),Il Output of MUX to general routing .I0(10),//Input(tie to MUXF7L/LO out) .I1&#xf…

This dependency was not found解决方法

问题如上(前端代码),我是引用js文件出的问题,无法找到api/userManage模块。 解决:没感觉哪有问题,把后面加了个/,就解决了,代表src目录,应该是目录和目录之间应该有/作为分割:

vue3+js 实现记住密码功能

常见的几种实现方式 1 基于spring security 的remember me 功能 ​​​​​​​ localStorage 除非主动清除localStorage 里的信息 ,不然永远存在,关闭浏览器之后下次启动仍然存在 存放数据大小一般为5M 不与服务器进行交互通信 cookies 可以…

C++ //练习 8.4 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个独立的元素存于vector中。

C Primer(第5版) 练习 8.4 练习 8.4 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个独立的元素存于vector中。 环境:Linux Ubuntu(云服务器&#xff09…

【Java程序设计】【C00314】基于Springboot的足球俱乐部管理系统(有论文)

基于Springboot的足球俱乐部管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的足球俱乐部管理系统的设计与实现,本系统有管理员以及用户二种角色权限 管理员权限操作的功能包括管理公告&#x…

C语言实现简单选择排序

简单选择排序 简单选择排序的平均复杂度为 O(n2),但效率通常比相同平均复杂度的直接插入排序还要差。但由于选择排序是 内部排序,因此在内存严格受限的情况下还是可以用的。选择排序的原理很简单,如下图所示:持续从未处理元素中找到最小值并加…

使用命令行创建文件夹和文件

创建文件夹 md 文件夹名字 创建文件 echo >文件名字.后缀然后回车即可 注意点:echo >文件名字.后缀 的 >后面不可以加空格,不然会报错\

16. BI - 推荐系统之 ALS 实现

本文为 「茶桁的 AI 秘籍 - BI 篇 第 16 篇」 文章目录 对 MovieLens 进行电影推荐 Hi,你好。我是茶桁。 前面两节课的内容中,我们从矩阵分解到 ALS 原理,依次给大家讲解了推荐系统中的一个核心概念。 矩阵分解中拆矩阵的背后其实是聚类。就说 k 等于几…

YOLOv8重磅升级!新增旋转目标检测功能

YOLOv8重磅升级!新增旋转目标检测功能,基于DOTA数据集,支持15个类别目标航拍图像检测,模型&代码均已开源~ 新版亮点 YOLOv8-OBB:YOLOv8中OBB(Oriented Bounding Box)模型的引入标志着物体检测的重要一步&#xff…

重点媒体如何投稿?考核稿件投稿指南

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 机构组织,国企央企都需要定期将相关新闻投递到央媒,官媒,或者地方重点媒体中,那么如何进行投稿了,今天就与大家分享下。 央媒投…

kafka生产者2

1.数据可靠 • 0:生产者发送过来的数据,不需要等数据落盘应答。 风险:leader挂了之后,follower还没有收到消息。。。。 • 1:生产者发送过来的数据,Leader收到数据后应答。 风险:leader应答…

C++ //练习 8.2 测试函数,调用参数为cin。

C Primer(第5版) 练习 8.2 练习 8.2 测试函数,调用参数为cin。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块见练习8.1 /**************************************************************…

密码算法简单整理

密码组成 国外的密码算法: DES、3DES、AES、SHA1、SHA2、SHA3、DSA、RSA、RC4等 高危密码算法: MD5、DES、RSA1024以下、SSH1.0、SSL3.0以下、SHA1等 密码算法通常可分为三大类: 对称密码算法 非对称密码算法 密码杂凑算法 1.对称密码算法&am…

MacOs 围炉夜话

文章目录 一、安装 Mac 一、安装 Mac macOS是一套由苹果开发的运行于Macintosh系列电脑上的操作系统。macOS是首个在商用领域成功的图形用户界面操作系统。 VM虚拟机怎么安装mac os?(全教程) 虚拟机:VMware Workstation 17 pro W…