【办公类-48-01】20240404每月电子屏台账汇总成docx(问卷星xlsx导入docx,每页20条)

news2024/10/12 22:33:47

作品展示——docx台账汇总,每页20条

5c1d88a859c6466dad25265b58c4c0c9.png

背景需求:

近期上级要求“一屏一码”,幼儿园每个电子屏使用后都要进行开机、关机的记录。安全主任分配工作后,每个园区的每个电子屏都有专人负责登记。

46c90bcde9474bab8b01f1867c87a381.png

为了便于每月末的台账提交(只要电子版),我设计了一个问卷星的提交系统。

18e3872b87d34d41951c3a2d67bfbdfd.png

9509abeb1fbe4ec1b28d3e02dbd21552.png

2b58ca4dc65f481cbe1d06490e949b93.png

09459bbb93164eed86fd6c94c5b46f41.png

538a68de980a44d4886eea81042f5e1b.png

从3月1日开始到3月29日,总部的三位老师都是通过问卷星填写电子屏使用台账。

-----------------------------------------------------------------------------------------------------------------------

今天是4月4日,安全主任要求各园区提交电子版台账。

于是我开始用Python设计一款自动从EXCLE里调取数据,填写word模板的代码

1、制作docx模板

3b7bed03dc534c0182ad8bfc73e5aea7.png

模板是XLSX格式,并不便于A4打印,因此我把内容复制到docx,制作word模板。

2e5742f10932489ab04bb180f2b02d00.png

6c2ea9c8f8394edbb98a82b990368b64.png

2、从问卷星下载xls

2d629caf30834acba82ce5ec4a525864.png

fb8e3e63660c4c98b477beea1ebef6b0.png

下载一份xlsx

cc4bf783c7b349358e9748c0cb34bd26.png

有许多的内容

c88982370c484c3eaa8451ada97b3557.png

删除不是3月的内容

ce988c2793294d21954152a1d7f47f85.png

 

内容分析:

1、需要G:W列的内容。但不需要“跳过”的内容

1041bef8a3604e838bcaaf87294db7d6.png

 

5fc7c685496e4168a05acd7fb9f8ca21.png

2、读取的所有内容,拆分7个一组(一行7个内容)

54b939d335584d26a98f11c6138693d3.png

3、判断一共有几个7元素组,答案是66个,它在60-80的范围内,因此80-66=14,还缺14个空格子组成的7组:

5faf5d7897e4406aa42a373d59ce068c.png

4、把提取出来的内容进行拆分或合并

(1)如果格子里面有空,就添加7个空

(2)其他情况下,需要拆分(黄色拆分)和合并(蓝色部分)

5a24d13e44af425e8c2054ff68eb3b9b.png

5、把80*7个修订过的元素集合,再次拆分成4份(一页20行*7个元素)

739dd99039e64ebea1126c1c7f2be483.png

6、读取一个有页码的横版模板,作为Word合并时的模板

693f7e1fbd244527a77a392ed79494d8.png

bd51218a11e141779f5bd9c75e43cf25.png

7、为Word合并后第一行会有空行(页码模板自带),需要删除

5f59cf018d31489cb4d8e077e4cd6076.png

整体代码

'''
电子屏台账2024年3月,docx,每页20条
作者:AI对话大师
时间:2024年4月3日
'''

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

month=int(input('几月?\n'))

import os
import pandas as pd

folder_path = r'C:\Users\jg2yXRZ\OneDrive\桌面\电子屏每月'
file_name = '256967506_按文本_Jg2y各园部重点部位电子屏、播控系统_71_71.xlsx'
file_path = os.path.join(folder_path, file_name)

# 按列读取
# df = pd.read_excel(file_path)
# columns = df.columns[6:23]  # G列到W列的列索引范围

# all_data = []
# for column in columns:
#     column_data = df[column].tolist()
#     all_data.extend(column_data)

# print(all_data)

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

all_data = []
for row in rows:
    row_data = [cell for cell in row if not pd.isnull(cell)and cell != '(跳过)']
   
    all_data.extend(row_data)

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


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

import pandas as pd

df = pd.read_excel(file_path)
num_rows = df.shape[0]
print("行数:", num_rows)
#66

# 每行有几个内容
h=int(len(all_data)/num_rows)
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))
# #  66

# 判断是否能够凑满20行,凑不满,补空
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)

# 一个列表里面有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(folder_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)/4)
content_lists = [new[i:i+c] for i in range(0, len(new), c)]
print(content_lists)
print(len(content_lists))
# 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(folder_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}月(总园)电子屏台账.docx' # 输出文件路径

combined_doc.save(output_file)

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

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

终端运行:

0b104bb365ee412295cf51eebe1e6163.png

20*4页(实际66个)

b7cf3ab26a434337ba19b590328ad30e.png

把零食Word里面的四分内容合并在一个docx内,删除”零食文件夹“0691c0ebac694af38b89ce3a49c65199.png

作品展示

第1页

5c1d88a859c6466dad25265b58c4c0c9.png

第2页

bba4c1222501436ca3f356a71e81b81f.png

第4页

a3126e994eca49da8f6e729cdcb7ac98.png

合并样式展示

bef6a2081beb41249646cbf6330accb5.png

感悟:

1、以后每月末,下载问卷星的xlsx,删除非当月的内容,用代码生成当月的“电子屏台账”

2、目前代码只包含“总园台账”,分园电子屏数量比总园少,因而负责人自己手动填写电子台账,没有扫码登记在问卷星里。后续继续探索三个园区,三个台账的制作方法

 

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

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

相关文章

使用Java拓展本地开源大模型的网络搜索问答能力

背景 开源大模型通常不具备最新语料的问答能力。因此需要外部插件的拓展&#xff0c;目前主流的langChain框架已经集成了网络搜索的能力。但是作为一个倔强的Java程序员&#xff0c;还是想要用Java去实现。 注册SerpAPI Serpapi 提供了多种搜索引擎的搜索API接口。 访问 Ser…

华为服务器RAID配置教程 服务器硬盘故障处理帮助 浪潮RAID配置教程 磁盘阵列配置通用教程

前言&#xff08;本文档持续更新&#xff09; 本文主要记录服务器配置RAID&#xff08;磁盘阵列&#xff09;过程中存在的细节问题及官方文档无法解决的问题的解决方案 配置环境 华为 RH2288 v3服务器配置RAID组 如何快速配置 1.找到服务器品牌的阵列卡型号&#xff0c;找不到…

使用vuepress搭建个人的博客(一):基础构建

前言 vuepress是一个构建静态资源网站的库 地址:VuePress 一般来说,这个框架非常适合构建个人技术博客,你只需要把自己写好的markdown文档准备好,完成对应的配置就可以了 搭建 初始化和引入 创建文件夹press-blog npm初始化 npm init 引入包 npm install -D vuepress…

【大数据存储】实验六:Hive

Hive的安装和基本操作实验 一、实验目的 了解Hive的安装和基本操作 二、实验原理 Hive定义了一套自己的SQL&#xff0c;简称HQL&#xff0c;它与关系型数据库的SQL略有不同&#xff0c;但支持了绝大多数的语句如DDL、DML以及常见的聚合函数、连接查询、条件查询。 DDL操作…

跨境金融区块链服务平台

跨境金融服务是因企业及个人跨境经营、交易、投资、往来等活动而产生的资金使用、调拨、配置等需求&#xff0c;而提供的金融服务。近年来&#xff0c;随着我国经济的快速稳步增长和全球化经济一体化的不断深入发展&#xff0c;跨境金融业务增长迅速&#xff0c;监管也开始转化…

某虚假交友APP(信息窃取)逆向分析

应用初探 在群里水群的时候 群u发了一个交友APP 于是拿来分析一下 可以看到应用打开后又一个登录的界面 需要用户输入手机号与验证码进行登录 #在线云沙箱分析 将APK放入某安信云沙箱中分析 提示应用请求了过多的敏感权限 逆向分析 直接拖入Jadx分析 好在程序没有加固 也没…

HomePlug AV

目录 HomePlug AV的基本概念基本术语网络概念网络实例 HomePlug AV物理层&#xff08;PHY&#xff09;HomePlug AV OFDM收发器架构PHY的调制模式FC调制和ROBO调制物理层的特点OFDM频域/时域转换开窗/槽式OFDM信号和噪声PHY发送控制——信道自适应PHY帧格式&#xff08;Symbol&a…

yolov9文献阅读记录

本文记录了yolov9文献的阅读过程&#xff0c;对主要内容进行摘选翻译&#xff0c;帮助理解原理和应用&#xff0c;包括摘要、主要贡献、网络结构、主要模块&#xff0c;问题描述和试验对比等内容。 文献摘要前言摘选主要贡献相关工作可逆性结构辅助监督 问题描述信息瓶颈原理可…

虹科Pico汽车示波器 | 免拆诊断案例 | 2019款别克GL8豪华商务车前照灯水平调节故障

一、故障现象 一辆2019款别克GL8豪华商务车&#xff0c;搭载LTG发动机&#xff0c;累计行驶里程约为10.7万km。车主反映&#xff0c;车辆行驶过程中组合仪表提示前照灯水平调节故障。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上提示“前照灯水平…

Hadoop和zookeeper集群相关执行脚本(未完,持续更新中~)

1、Hadoop集群查看状态 搭建Hadoop数据集群时&#xff0c;按以下路径操作即可生成脚本 [test_1analysis01 bin]$ pwd /home/test_1/hadoop/bin [test_01analysis01 bin]$ vim jpsall #!/bin/bash for host in analysis01 analysis02 analysis03 do echo $host s…

Linux驱动学习:从Linux主机nfs共享文件到uboot

第一步&#xff1a;在Linux主机上开启NFS服务&#xff0c;使用如下命令安装NFS服务&#xff1a; sudo apt-get install nfs-kernel-server rpcbind 第二步&#xff1a;创建一个文件夹用于共享&#xff0c;直接以nfs命名就行&#xff1a; 第三步&#xff1a;打开nfs服务配置文…

《超预测》预见未来的艺术和科学 - 三余书屋 3ysw.net

超预测&#xff1a;预见未来的艺术和科学 大家好&#xff0c;本次解读的书籍是《超预测》。我将花费大约20分钟的时间为您梳理书中的核心内容&#xff0c;探讨一般人如何超越专家学者成为超级预测家&#xff0c;并探索他们所采用的思维方式和预测方法。在开始之前&#xff0c;…

阻止EDR注入dll

文章目录 前记blockdllsACG结论测试代码reference 前记 许多EDR产品常见的操作是将他们的DLL注入到其想监测的进程中&#xff0c;寻找前辈们的防注入思路发现大概有以下两种&#xff0c;分别是&#xff1a; 1、PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINAR…

掌握机器学习新星:使用Python和Scikit-Learn进行图像识别

正文&#xff1a; 随着智能手机和社交媒体的普及&#xff0c;图像数据的生成速度比以往任何时候都快。为了自动化处理这些数据&#xff0c;我们需要强大的图像识别系统。机器学习提供了一种有效的方法来识别和分类图像中的对象。Scikit-Learn是一个流行的Python库&#xff0c;它…

OpenCASCADE源码分析:总论

OpenCASCADE是20世纪90年代由法国Matra Datavision公司开发的三维曲面/实体造型引擎&#xff0c;目前&#xff0c;国内许多CAE软件将其用作几何模块的开发。 本文拟从系统设计的角度&#xff0c;对OpenCASCADE架构(核心组件、关键流程等)进行概要性总结。 注1&#xff1a;限于…

Xshell Mobaxterm等终端工具连接不上服务器,显示 SSH服务器拒绝密码。请再试一次。解决办法

问题解决办法&#xff1a; &#xff08;1&#xff09;需要查看配置SSH密钥时&#xff0c;输入的password密码和当前users_name cd /home/: 查看当前系统下的用户名 注意上图中的登录名是服务器端linux下自己设置的user_name用户名&#xff1a; 所以需要将fl改为&#xff1a…

UE4_自定义反射和折射和法线图

UE4 自定义反射和折射和法线图 2020-05-22 09:36 将ReflectionVector和反射图像进行ViewAlignedReflection,输出的textrue和相机位置CameraPosition的onePlus进行Dot点乘之后乘以一个float系数反射度&#xff0c;输出给固有色&#xff0c;就有反射效果了。球型反射。 折射&…

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG&#xff0c;选择xwr68xx还是xwr64xx&#xff0c;及需要注意的问题 文章目录 demo工程out_of_box文件调试bin文件名称需要注意的问题附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导…

AJAX —— 学习(二)

目录 一、利用 JSON 字符串 返回数据 &#xff08;一&#xff09;基础代码 &#xff08;二&#xff09;原理及实现 二、nodmon 工具 自动重启服务 &#xff08;一&#xff09;用途 &#xff08;二&#xff09;下载 &#xff08;三&#xff09;使用 三、IE 缓存问题 &a…

git中对子模块的本地修改、提交和推送远程仓库

场景 当前的某个项目&#xff0c;其使用了另一个项目&#xff0c;我在本地需要对子项目进行修改&#xff0c;并将这些修改提交到github中的子项目和父项目。其实在github中&#xff0c;子项目都是特定的指向子项目的某次提交&#xff0c;因此对于父项目的修改&#xff0c;其实…