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

背景需求:

前期电子屏汇总是"总园"用""问卷星"、"一分园"用"腾讯文档",二分园"用"手写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月里

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

代码展示

python 复制代码
'''
电子屏台账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小时调整原来的"电子屏台账生成代码",就可以每月最后一天都快速批量生成三个园区的电子屏了。

相关推荐
用户83562907805117 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805117 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生1 天前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师1 天前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码1 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf1 天前
FastAPI 如何连接 MySQL
后端·python
apocelipes2 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780512 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python