【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理)

news2025/6/6 5:19:40

背景需求:

1-4月电子屏表格,都是用这个代码将EXCEL数据整理成分类成3个WORD表格。

【办公类-48-04】20250118每月电子屏台账汇总成docx-4(提取EXCLE里面1月份的内容,自制月份文件夹)-CSDN博客文章浏览阅读1.2k次,点赞29次,收藏9次。【办公类-48-04】20250118每月电子屏台账汇总成docx-4(提取EXCLE里面1月份的内容,自制月份文件夹) https://blog.csdn.net/reasonsummer/article/details/145230274?spm=1011.2415.3001.5331

存在问题:

每月都要把下载EXCEL名称复制到代码内,有点麻烦。

我希望只要把EXCEL放到文件夹下,程序就能自动转移到2025年5月文件夹内。并识别它做三个WORD表格

deepseek的答案

20250603,获取5月的所有EXCEL,导出文本EXCEL

放到一级文件夹下

然后用代码慢慢生成

'''
电子屏台账2025年5月,自动提取当月内容(在XX之间的内容),制作当月文件夹
把EXCEL放在一级文件夹下,自动读取它并转移到2025年5月文件夹
自动识别2025年5月文件夹内的EXCEL,开始制作三个园区台账WORD,并打包rar
作者:星火讯飞、deepseek、阿夏
时间:20240603
'''

print('----1、读取EXCEL内容并合并成关键列表------')

import os
import shutil

import pandas as pd
path= r'C:\Users\jg2yXRZ\OneDrive\桌面\电子屏每月2024'

year=2025
# int(input('几年(2025?\n'))
month=int(input('几月?(4)\n'))

garden=['总园', '一分园','二分园']


folder_path = path+fr"\{year}年{month:02}月"
os.makedirs(folder_path,exist_ok=True)

folder_name=folder_path+fr'\(以此为准){year}年{month:02}月电子屏台账(三个园区)'
os.makedirs(folder_name,exist_ok=True)

# 把EXCLe复制到2025年1月文件夹
file_name = '279855026_20240901Jg2y各园部重点部位电子屏、播控系统_956f958e-4232-47d7-a6bb-2c086e4ade44.xlsx'


# 把问卷星下载的xlsx转移到2025年1月文件夹内
# 定义源文件和目标文件夹路径
src_file = path+fr'\{file_name}'
dst_folder = folder_path
dst_file = os.path.join(dst_folder, f'{file_name}') 
# 移动文件到目标文件夹
shutil.move(src_file, dst_file)



# 279855026_按文本_20240901Jg2y各园部重点部位电子屏、播控系统_83_83.xlsx'
file_path = os.path.join(folder_path, file_name)
print(file_path)

# 按行读取
df = pd.read_excel(file_path)
filtered_rows = df.iloc[:, 6:22].values.tolist()  # G列到W列的数据,按行转换为列表
# print(rows)

# 提取符合的日期

print('----1、初始化一个空列表来存储符合条件的行(数字是01的月份)------')
# 
rows = []

# 遍历每一行
for row in filtered_rows:
    # 获取第9个元素(索引从0开始,所以是14)
    cell_value = str(row[9])
    # print(cell_value)
    
    # 检查第5-6个字符是否为“01”
    if cell_value[5:7] == f"{month:02}":
        rows.append(row)

# # 打印符合条件的行
print(rows)

for x in range(len(garden)):
    all_data=[]
    for y in range(len(rows)):
        if rows[y][0][2:]==garden[x]:
            # print(rows[y])
            for row in rows[y][1:]:
                # print(row)
                
                if row=='(跳过)':
                    pass
                else:    
                    all_data.append(row)

    # print(all_data)
    # print(len(all_data))
                # 462


    print('----1、读取EXCEL内容并合并成关键列表------')

    import pandas as pd

    # # 每行有几个内容
    h=7
    # print(h)
    # # 拆分成7个一组
    nested_lists = [all_data[i:i+h] for i in range(0, len(all_data), h)]
    # print(nested_lists)
    # print(len(nested_lists))
#     # #  26




    # 如果条数不满20条,只有一页
    if len(nested_lists) <=20:
        print(f"{len(nested_lists)} 在范围 0-20 内")
        kong = 20 - len(nested_lists)
        print(kong)
        Y = 1
    # 判断多页情况下,最后一页是否能够凑满20行,凑不满,补空
    else: 
        for z in range(20, 220, 20):
            if z < len(nested_lists) <= z + 20:
                # 出现过正好40条,只有两页,但出现了第3空页,少了小于等于z+2-
                print(f"{len(nested_lists)} 在范围 {z}-{z+20} 内")
                # 补多少的空格
                kong = z + 20 - len(nested_lists)
                print(kong)
                # 有几页
                Y = int((z + 20) / 20)

      


    # 一个列表里面有7个空
    w = [''] * h
    # 需要14个这种7空的嵌套列表
    v = [w] * kong
    # print(v)

    # 把实际的填写内容+补充的空格,凑满20的倍数页
    nested_lists=nested_lists+v
    # print(nested_lists)
    # print(len(nested_lists))
    #  80  


    # 拆分合并每个格子的内容
    new=[]
    for n in range(len(nested_lists)):    # 66行
        # 如果读取的第一个内容为空
        if nested_lists[n][1]=='':
            for g in range(h):
                new.append('')
        else:
            # 添加序号不用加0
            new.append(n+1)
            # 电子屏ID '总园 校门口电子屏 402XXXXXXXX TY2021XXXXXX'    
            split_list = nested_lists[n][1].split(' ')
            # print(split_list)
            # 将空格切开变成列表
            new.append(split_list[2])
            # 资产编号	
            new.append(split_list[3])   
            # 时间	(日期+时间
            new.append(nested_lists[n][2][:4]+'年'+nested_lists[n][2][5:7]+'月'+ \
                nested_lists[n][2][-2:]+'日'+str(nested_lists[n][3])+':'+str('%02d'%nested_lists[n][4]))
            # 操作内容	
            new.append(nested_lists[n][5])
            # 进出人员	(负责人)
            new.append(nested_lists[n][0])
            # 审核领导(园所管理主任)
            new.append(nested_lists[n][6])
    print(new)
    print(len(new))
    # 560 /7/20=4页

    print('----2、读取docx模板的数量------')
    # 读取word的行列数
    from docx import Document
    doc_name = '电子屏台账模板.docx'
    doc_path = os.path.join(path, doc_name)

    # 打开文档
    doc = Document(doc_path)

    # 获取第一个表格
    table = doc.tables[0]

    # 获取表格的行数和列数
    num_rows = len(table.rows)
    num_cols = len(table.columns)

    # print("行数:", num_rows)
    # # 22
    # print("列数:", num_cols)
    # 7

    # 每页格子的坐标
    bg=[]
    for a in range(2,22):
        for b in range(7):
            bg.append('{}{}'.format('%02d'%a,'%02d'%b))
    # print(bg)
    # print(len(bg))
    # 140

    # 拆分成4页每页20个个一组
    c=int(len(new)/Y)
    content_lists = [new[i:i+c] for i in range(0, len(new), c)]
    # print(content_lists)
    # print(len(content_lists))
    # 15
    # 4  拆20行内容一组,一共4个嵌套列表

    # 列表new内容写入docx模板,第一页写入20行*7的内容
    import os,time
    from docx import Document
    from docx.shared import Pt, RGBColor
    from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
    from docx.oxml.ns import qn
    from docx2pdf import convert
    from PyPDF2 import PdfMerger

    # 多少份(必须双数)
    ziti = '宋体'
    size = 14

    imagePath = folder_path+r'\零时Word'

    if not os.path.exists(imagePath):
        os.makedirs(imagePath)


    for n in range(len(content_lists)):
        doc = Document(doc_path)
        # for b in range(0):
        table = doc.tables[0]
        for t in range(len(bg)):
            pp, qq, k = int(bg[t][0:2]), int(bg[t][2:4]), content_lists[n][t]

            run = table.cell(pp, qq).paragraphs[0].add_run(str(k))
            run.font.name = ziti
            run.font.size = Pt(size)
            run.bold = False
            run.font.color.rgb = RGBColor(0, 0, 0)
            r = run._element
            r.rPr.rFonts.set(qn('w:eastAsia'), ziti)
            table.cell(pp, qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

        
        doc.save(imagePath+fr'\{n:02d}.docx')

        time.sleep(2)



    print('-----3、创建一个带页码的docx,合并word模板------')

    from docx import Document
    from docx.enum.section import WD_SECTION_START
    import os
    from docx.shared import Cm

    # # 创建一个带页码的空Document对象,并把页眉页脚边距改小
    source_dir = imagePath  # 文件夹路径
    combined_doc = Document(path+r'\页码.docx')

    # 读取“整理”里面的docx的内容
    docx_files = []

    for file_name in os.listdir(source_dir):
        if file_name.endswith(".docx"):
            docx_files.append(os.path.join(source_dir, file_name))

    for file in docx_files:
        doc = Document(file)
        for element in doc.element.body:
            combined_doc.element.body.append(element)    

    output_file = folder_name + fr'\{year}年{month:02}月({garden[x]})电子屏台账.docx' # 输出文件路径
    output_file1 = folder_name + fr'\{year}年{month:02}月({garden[x]})电子屏台账2.docx' # 输出文件路径

    combined_doc.save(output_file)
    time.sleep(2)

    print('-----4、把“合并docx"的第一段回车删除。(页码模板自带)---')
    doc = Document(output_file)
    # 删除第1个段落(都只有一个回车)
    for i in [0]:
        dell_paragraph = doc.paragraphs[i]
        doc._element.body.remove(dell_paragraph._element)
        # 保存文档
    doc.save(output_file)

    # time.sleep(2)

    print('-----5、替换园区---')
    import win32com.client as win32

    # 创建Word应用程序对象
    word_app = win32.gencache.EnsureDispatch("Word.Application")

    # 打开Word文档
    doc = word_app.Documents.Open(output_file)

    # 创建Find对象
    find_object = doc.Content.Find

    # 设置查找和替换参数
    find_object.Text = "园区"
    find_object.Replacement.Text = garden[x]
    find_object.Forward = True
    find_object.Wrap = 1
    find_object.Format = False
    find_object.MatchCase = False
    find_object.MatchWholeWord = False
    find_object.MatchWildcards = False
    find_object.MatchSoundsLike = False
    find_object.MatchAllWordForms = False

    # 执行查找和替换
    find_object.Execute(Replace=2)

    # 保存文档
    doc.SaveAs(output_file)

    # 关闭文档和应用程序
    doc.Close()
    word_app.Quit()

    time.sleep(2)

    # 删除word临时文件夹
    import shutil
    shutil.rmtree(imagePath)


    

# 定义要打包的文件夹名称
shutil.make_archive(folder_name, 'zip', folder_name)


excel转移到2025年05月文件夹内。

最后效果

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

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

相关文章

基于 ZYNQ UltraScale+ OV5640的高速图像传输系统设计,支持国产替代

引 言 随着电子信息技术的不断进步&#xff0c;人工智能、医 疗器械、机器视觉等领域都在高速发展 [1] &#xff0c;工业相机 是机器视觉系统中的一部分 [2] &#xff0c;对工业相机而言&#xff0c;传 输图像的速率、传输过程的抗干扰能力是其关键&#xff0c; 工业相…

demo_win10配置WSL、DockerDesktop环境,本地部署Dify,ngrok公网测试

win10配置WSL、DockerDesktop环境&#xff0c;本地部署Dify&#xff0c;ngrok分享测试 一、配置WSL 1.1 开启Hyper-V 安装WSL2首先要保证操作系统可以开启hyper-v功能&#xff0c;默认支持开启hyper-v的版本为&#xff1a;Windows11企业版、专业版或教育版,而家庭版是不支持…

TablePlus:一个跨平台的数据库管理工具

TablePlus 是一款现代化的跨平台&#xff08;Window、Linux、macOS、iOS&#xff09;数据库管理工具&#xff0c;提供直观的界面和强大的功能&#xff0c;可以帮助用户轻松管理和操作数据库。 TablePlus 免费版可以永久使用&#xff0c;但是只能同时打开 2 个连接窗口&#xff…

SQL Indexes(索引)

目录 Indexes Using Clustered Indexes Using Nonclustered Indexes Declaring Indexes Using Indexes Finding Rows Without Indexes Finding Rows in a Heap with a Nonclustered Index Finding Rows in a Clustered Index Finding Rows in a Clustered Index with …

Axure 基础入门

目录 认识产品经理 项目团队* 基本概述 认识产品经理 A公司产品经理 B公司产品经理 C公司产品经理 D公司产品经理 产品经理工作范围 产品经理工作流程* 产品经理的职责 产品经理的分类 产品经理能力要求 产品工具 产品体验报告 原型设计介绍 原型设计概述 为…

结构型设计模式之Decorator(装饰器)

结构型设计模式之Decorator&#xff08;装饰器&#xff09; 前言&#xff1a; 本案例通过李四举例&#xff0c;不改变源代码的情况下 对“才艺”进行增强。 摘要&#xff1a; 摘要&#xff1a; 装饰器模式是一种结构型设计模式&#xff0c;允许动态地为对象添加功能而不改变其…

HCIP-Datacom Core Technology V1.0_3 OSPF基础

动态路由协议简介 静态路由相比较动态路由有什么优点呢。 静态路由协议&#xff0c;当网络发生故障或者网络拓扑发生变更&#xff0c;它需要管理员手工配置去干预静态路由配置&#xff0c;但是动态路由协议&#xff0c;它能够及时自己感应网络拓扑变化&#xff0c;不路由选择…

工作自动化——工作自动提炼--智能编程——仙盟创梦IDE

工作自动化中的自动提炼、自动比对代码生成日志&#xff0c;为软件开发与项目管理带来诸多好处。 自动提炼能从复杂代码中精准提取关键信息&#xff0c;节省人工梳理时间&#xff0c;开发人员可快速把握核心逻辑&#xff0c;加速项目熟悉进程。自动比对代码则及时发现版本间差异…

大语言模型评测体系全解析(上篇):基础框架与综合评测平台

文章目录 一、评测体系的历史演进与技术底座&#xff08;一&#xff09;发展历程&#xff1a;从单任务到全维度评测1. 2018年前&#xff1a;单数据集时代的萌芽2. 2019-2023年&#xff1a;多任务基准的爆发式增长3. 2024年至今&#xff1a;动态化、场景化、多模态体系成型关键节…

生产环境MYSQL常见锁表场景

前言 锁表是我们在生产环境十分常见的问题之一&#xff0c;解决问题前需要先了解锁表产生的原因以找到解决方案&#xff0c;并制定方案以预防锁表&#xff0c;本文接下来会分别模拟元数据锁表&#xff08;MDL锁&#xff09;、行锁升级为表锁、死锁、**显示锁表 **四种锁表情形…

结构性设计模式之Composite(组合)

结构性设计模式之Composite&#xff08;组合&#xff09; 摘要&#xff1a; Composite&#xff08;组合&#xff09;模式通过树形结构表示"部分-整体"层次关系&#xff0c;使得用户能够统一处理单个对象和组合对象。该模式包含Component&#xff08;组件接口&#x…

Java面试八股--04-MySQL

致谢&#xff1a;感谢整理&#xff01;2025年 Java 面试八股文&#xff08;20w字&#xff09;_java面试八股文-CSDN博客 目录 1、Select语句完整的执行顺序 2、MySQL事务 3、MyISAM和InnoDB的区别 4、悲观锁和乐观锁怎么实现 5、聚簇索引与非聚簇索引区别 6、什么情况下my…

设计模式——访问者设计模式(行为型)

摘要 访问者设计模式是一种行为型设计模式&#xff0c;它将数据结构与作用于结构上的操作解耦&#xff0c;允许在不修改数据结构的前提下增加新的操作行为。该模式包含关键角色如元素接口、具体元素类、访问者接口和具体访问者类。通过访问者模式&#xff0c;可以在不改变对象…

实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题。主要涉及线性回归、回归的显著性、回归系数的置信区间。 vial <- seq(1, 10, 1) Viscosity <- c(160,171,175,182,184,181,188,19…

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 下

上部分链接&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09; 之 【高级查询和连接】 上 题目&#xff1a;1164. 指定日期的产品价格 题解&#xff1a; select product_id,10 price from Products group by product_id having min(change_date) > 201…

机器学习——SVM

1.什么是SVM 支持向量机&#xff08;support vector machines&#xff0c;SVM&#xff09;是一种二分类模型&#xff0c;它将实例的特征向量映射为空间中的一些点&#xff0c;SVM 的目的就是想要画出一条线&#xff0c;以 “最好地” 区分这两类点&#xff0c;以至如果以后有了…

【音视频】FFmpeg 硬件(NVDIA)编码H264

FFmpeg 与x264的关系 ffmpeg软编码是使⽤x264开源项⽬&#xff0c;也就是说ffmpeg软编码H264最终是调⽤了x264开源项⽬&#xff0c;所以我们要先理解ffmpeg和x264的调⽤关系&#xff0c;这⾥我们主要关注x264_init。对于x264的参数都在 ffmpeg\libavcodec \libx264.c x264\co…

贪心算法应用:超图匹配问题详解

贪心算法应用&#xff1a;超图匹配问题详解 贪心算法在超图匹配问题中有着广泛的应用。下面我将从基础概念到具体实现&#xff0c;全面详细地讲解超图匹配问题及其贪心算法解决方案。 一、超图匹配问题基础 1. 超图基本概念 **超图&#xff08;Hypergraph&#xff09;**是普…

【Web应用】若依框架:基础篇13 源码阅读-前端代码分析

文章目录 ⭐前言⭐一、课程讲解过程⭐二、自己动手实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数据库、操作系统、大数据、人工智能、工控、网…

[java八股文][JavaSpring面试篇]SpringCloud

了解SpringCloud吗&#xff0c;说一下他和SpringBoot的区别 Spring Boot是用于构建单个Spring应用的框架&#xff0c;而Spring Cloud则是用于构建分布式系统中的微服务架构的工具&#xff0c;Spring Cloud提供了服务注册与发现、负载均衡、断路器、网关等功能。 两者可以结合…