【办公类-48-03】20240930每月电子屏台账汇总成docx-3(三园区合并EXCLE,批量生成3份word)

news2024/11/19 2:49:05

背景需求:

前期电子屏汇总是“总园”用“”问卷星”、“一分园”用“腾讯文档”,二分园“用“手写word””

【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20条)【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20条)-CSDN博客文章浏览阅读537次,点赞8次,收藏4次。【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20条)_电子屏台账https://blog.csdn.net/reasonsummer/article/details/137453629【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20条)

【办公类-48-01】20240404每月电子屏台账汇总成docx-1(问卷星xlsx导入docx,每页20条)_led管理台账-CSDN博客文章浏览阅读466次,点赞8次,收藏8次。【办公类-48-01】20240404每月电子屏台账汇总成docx-1(问卷星xlsx导入docx,每页20条)_led管理台账https://blog.csdn.net/reasonsummer/article/details/137357133

本学期我让三个园区负责人都统一用一个“问卷星”

今天是9月最后一天,我要用代码做汇总了。

因为三个园区合并了,所以重新复制一个文件夹

问卷星下载EXCEL放在2024年09月里

三个园区的内容都在一个表里

代码展示

'''
电子屏台账2024年9月,docx,每页20条(三个园区汇总)
作者:AI对话大师
时间:2024年9月30日
问卷星下载时文本Excel
'''

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

month=int(input('几月?\n'))
garden=['总园','一分园','二分园']

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

folder_path = path+fr'\2024年{month:02d}月'
file_name = '279855026_按文本_XXXXXXXXX重点部位电子屏、播控系统_83_83.xlsx'
file_path = os.path.join(folder_path, file_name)

# 按行读取
df = pd.read_excel(file_path)
rows = df.iloc[:, 6:22].values.tolist()  # G列到W列的数据,按行转换为列表
# 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)} 在范围 20-40 内")
        kong = 40 - len(nested_lists)
        print(kong)
        Y = 1
    # 判断多页情况下,最后一页是否能够凑满20行,凑不满,补空
    else: 
        for z in range(20, 220, 20):
            if z <= len(nested_lists) < z + 20:
                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_path + fr'\2024年{month}月({garden[x]})电子屏台账.docx' # 输出文件路径
    output_file1 = folder_path + fr'\2024年{month}月({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)





运行输入:输入月份

总园26条,2页 

一分园41条,3页

二分园15条,1页

第一次遇到上报数量不满20条的情况,代码产生过报错

IndexError: list index out of range

后来为不足1页的情况添补了可能性。

最后顺利都运行出来了。

今天花了1小时调整原来的“电子屏台账生成代码”,就可以每月最后一天都快速批量生成三个园区的电子屏了。

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

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

相关文章

C语言 | Leetcode C语言题解之题451题根据字符出现频率排序

题目&#xff1a; 题解&#xff1a; #define HASH_FIND_CHAR(head, findint, out) HASH_FIND(hh, head, findint, sizeof(char), out) #define HASH_ADD_CHAR(head, intfield, add) HASH_ADD(hh, head, intfield, sizeof(char), add)struct HashTable {char key;int val;UT_ha…

基于小程序+Vue + Spring Boot的进销存库存出库入库统计分析管理系统

目录 一、项目背景及需求分析 1. 项目背景 2. 需求分析 二、系统架构设计 1. 技术选型 2. 模块划分 三、数据库设计数据库表结构 四、前端实现 五、后端实现 1. RESTful API设计 2. 数据库操作 六、安全性和性能优化 1. 安全性 2. 性能优化 七、测试与部署 1. …

Unity之寻找子物体的8种方式

废话不多说&#xff0c;举个例子&#xff1a; 当前的transform是Cube1物体&#xff0c;所以。。。。 寻找子物体的方式有以下几个&#xff1a; 1.transform.Find("go2/go3") 好处&#xff1a;可以快速通过路径定位对应的子物体&#xff0c;甚至是子子子物体。 2.t…

UG NX二次开发(C++)-建模-采用NXOpen获取拉伸特征的信息

文章目录 1、前言2、创建一个特征3 采用NXOpen来实现拉伸特征信息的获取1、前言 UG NX二次开发过程中,大部分初学者喜欢用UFun函数来实现UG NX二次开发的功能,因为相较于NXOpen,UFun函数简单易懂;但是有时UFun函数如果初始值设置不好,出现的错误也比较难排查。比如对于拉…

L4 KNN 算法

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 KNN 算法用于约会数据集分类 在这周中&#xff0c;学习如何使用 K 近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;算法对一个约会数据集进行分类。KN…

SpringGateway(网关)微服务

一.启动nacos 1.查看linux的nacos是否启动 docker ps2.查看是否安装了nacos 前面是你的版本&#xff0c;后面的names是你自己的&#xff0c;我们下面要启动的就是这里的名字。 docker ps -a3.启动nacos并查看是否启动成功 二.创建网关项目 1.创建idea的maven项目 2.向pom.x…

路由器WAN口和LAN口的区别

一.路由器WAN口和LAN口的区别简单来说&#xff1a;LAN口输出&#xff08;内网&#xff09;&#xff0c;WAN口输入&#xff08;互联网&#xff09;&#xff0c;接线方法"光猫网口"——>"路由器WAN口"&#xff0c;"路由器LAN口"——>"打…

SD-WebUI forge支持flux模型。算力互联forge镜像使用教程

SD-WebUI Forge运行截图&#xff1a; 以下为教程&#xff1a; 启动SD 首先要选择使用我的镜像创建容器实例 1.进入Jupyter 2.双击打开左边main.ipynb&#xff0c;打开脚本 3.选中运行的代码&#xff0c;点击上面的运行符号 4.出现7860端口开放&#xff0c;说明运行成功了 …

C++入门基础知识95——【关于C++ 自增自减运算符】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 自增自减运算符的相关内容&#xff01…

Difference of Convex Relaxation (DC)

问题背景 minimize ⁡ m ∥ m ∥ 2 s u b j e c t t o ∥ m H h k e ∥ 2 ≥ 1 , ∀ k . \begin{aligned}&\underset{m}{\operatorname*{minimize}}\quad\|\boldsymbol{m}\|^2\\&\mathrm{subject~to}\quad\|\boldsymbol{m}^\mathsf{H}\boldsymbol{h}_k^e\|^2\geq1,\for…

Java | Leetcode Java题解之第450题删除二叉搜索树中的节点

题目&#xff1a; 题解&#xff1a; class Solution {public TreeNode deleteNode(TreeNode root, int key) {TreeNode cur root, curParent null;while (cur ! null && cur.val ! key) {curParent cur;if (cur.val > key) {cur cur.left;} else {cur cur.rig…

问题解决实录 | bash 中 tmux 颜色显示不全

点我进入博客 如下图&#xff0c;tmux 中颜色显示不全: echo $TERM输出的是 screen 但在 bash 里面输出的是 xterm-256 color 在 bash 里面输入&#xff1a; touch ~/.tmux.conf vim ~/.tmux.conf set -g default-terminal "xterm-256color"使之生效 source …

【学习笔记】手写 Tomcat 八

目录 一、NIO 1. 创建 Tomcat NIO 类 2. 启动 Tomcat 3. 测试 二、解析请求信息 三、响应数据 创建响应类 修改调用的响应类 四、完整代码 五、测试 六、总结 七、获取全部用户的功能 POJO 生成 POJO 1. 在 Dao 层定义接口 2. 获取用户数据 3. 在 Service 层定…

仪器数码管数字识别系统源码分享

仪器数码管数字识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

21.2 k8s中etcd的tls双向认证原理解析

本节重点介绍 : tls单向认证原理tls双向认证原理 在k8s中etcd监控的应用以ca.crt client.crt client.key创建的secret并挂载到prometheus中prometheus配置证书信息打到采集etcd的目的 tls单向认证 在单向SSL身份认证过程中&#xff0c;客户端需要验证服务端证书&#xff0c;…

文心一言 VS 讯飞星火 VS chatgpt (359)-- 算法导论24.3 1题

一、在图 24-2上运行Dijkstra算法&#xff0c;第一次使用结点 s s s作为源结点&#xff0c;第二次使用结点 z z z作为源结点。以类似于图 24-6 的风格&#xff0c;给出每次while循环后的 d d d值和 π π π值&#xff0c;以及集合 S S S中的所有结点。如果要写代码&#xff0c…

鸿蒙开发知识点速记全解

入门 1、API涵盖应用框架、系统、媒体、图形、应用服务、AI六大领域。 应用框架相关Kit开放能力&#xff1a;Ability Kit&#xff08;程序框架服务&#xff09;、ArkUI&#xff08;方舟UI框架&#xff09;等。系统相关Kit开放能力&#xff1a;Universal Keystore Kit&#xf…

C++入门基础 (超详解)

文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …

如何通过Dockfile更改docker中ubuntu的apt源

首先明确我们有一个宿主机和一个docker环境&#xff0c;接下来的步骤是基于他们两个完成的 1.在宿主机上创建Dockerfile 随便将后面创建的Dockerfile放在一个位置,我这里选择的是 /Desktop 使用vim前默认你已经安装好了vim 2.在输入命令“vim Dockerfile”之后&#xff0c;…

昇思MindSpore进阶教程--报错分析

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 概述 本章节用于介绍MindSpore为神经网络…