Python将excel模板复制到新的excel中,然后插入新数据导出

news2024/11/18 17:20:19
import copy
import datetime
import numpy
import time
import openpyxl
import pymssql
import requests
import json
from requests_toolbelt import MultipartEncoder
from urllib import parse
import os  # 要想使用路径相关功能需要导入 os 模块
from apscheduler.schedulers.blocking import BlockingScheduler
import pytz


timezone = pytz.timezone('Asia/Shanghai')
scheduler = BlockingScheduler()
def read_db_config():
    BASE_DIR = os.path.abspath(__file__)
    a = BASE_DIR.split("\\")[:-2]
    fat = '/'.join(a)
    with open(fat+'/config.json') as file:
        config = json.load(file)
    return config


class downLoadPOutAluminumTasks2():
    def __init__(self) -> object:
        self.sheet_name = '任务表' + time.strftime("%Y-%m-%d")
        self.filename = '任务表' + time.strftime("%Y-%m-%d") + '.xlsx'
        self.out_path = 'd:/data/任务表'+ '.xlsx'
        self.file_path1 = 'D:/data/模板.xlsx'
        # 下面有说明
        self.url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
        self.file_path = self.out_path
        pass

    def selectData(self):
        config = read_db_config()
        with pymssql.connect(**config) as connect:
            with connect.cursor() as cursor:
                sql = """
                       SELECT
                        row_number() over(order by t_id asc,ABS(MAX ( plan_out_aluminum_weight ) -SUM ( real_out_aluminum_weight )) desc) as id,
                        t_id,
                        p_apartment,
                            no,
                            MAX ( plan_weight ) AS plan_weight,
                            SUM ( real_weight ) AS real_weight,
                            MAX ( plan_weight ) -SUM ( real_weight ) AS diff_weight,
                            case WHEN ABS(MAX ( plan_weight ) -SUM ( real_weight )) >=5 then convert(nvarchar(20), '一级')
                             WHEN ABS(MAX ( plan_weight ) -SUM ( real_weight )) >=3 then convert(nvarchar(20), '二级')
                            WHEN ABS(MAX ( plan_weight ) -SUM ( real_weight )) >=1 then convert(nvarchar(20), '三级')
                            else '' end as dj,
                            ''
                        FROM
                            tableName1 t1
                            LEFT JOIN (SELECT t_id,p_apartment,p_max,p_min FROM tableName12WHERE p_apartment like '%123%') t2 on t1.slot_no BETWEEN t2.p_min and t2.p_max 
                        WHERE
                         operation_time =cast( DATEADD(day, -1, GETDATE()) as date)
                        GROUP BY
                        t_id,
                        p_apartment,
                            no
                    """
                # 处理数据
                cursor.execute(sql)
                # 搜取所有结果
                results = cursor.fetchall()
                if len(results) == 0:
                    return
                results1 = numpy.delete(results,1, axis=1)
                # 打开模板excel
                wb1 = openpyxl.load_workbook(self.file_path1)
                sheets1 = wb1.get_sheet_names()  # 获取sheet页
                sheets1.remove(sheets1[2])
                for i in sheets1:
                    wb1.remove(wb1[i])
                wb1.save(self.out_path)  # 保存数据
                wb1.close()
                wb2 = openpyxl.load_workbook(self.out_path)
                sheets2 = wb2.get_sheet_names()
                sheet2 = wb2.get_sheet_by_name(sheets2[0])
                sheet2['C3']=datetime.datetime.now()
                sheet2['G3'] = self.getYesterday()
                # 获取并写入数据段信息
                for row in range(5, len(results1) + 5):
                    for col in range(0, len(results1[0])):
                        sheet2[row][col].value= results1[row - 5][col]
                        sheet2[row][col].font = copy.copy(sheet2[5][col].font)
                        sheet2[row][col].border = copy.copy(sheet2[5][col].border)
                        sheet2[row][col].alignment = copy.copy(sheet2[5][col].alignment)
                wb2.save(self.out_path)  # 保存数据
                wb2.close()
                print(f"{datetime.datetime.now()}====>下载成功!")
                self.QYWXSendGroupFile(self.file_path, self.url)

    # 获取每列所占用的最大列宽
    def get_max_col(self, max_list):
        line_list = []
        # i表示行,j代表列
        for j in range(len(max_list[0])):
            line_num = []
            for i in range(len(max_list)):
                line_num.append(max_list[i][j])  # 将每列的宽度存入line_num
            line_list.append(max(line_num))  # 将每列最大宽度存入line_list
        return line_list
    def QYWXSendGroupFile(self, filepath, url):
        """
        发送微信群组机器人文件
        :param filepath: 文件路径
        :param url: 群组机器人WebHook
        :return:
        """
        # url为群组机器人WebHook,配置项
        headers = {
            "content-type": "application/json"
        }
        # 发送文件需要先上传文件获取media_id
        media_id = self.UploadFile(filepath, url)
        msg = {"msgtype": "file", "file": {"media_id": media_id}}
        # 发送请求
        try:
            result = requests.post(url, headers=headers, json=msg)
            return True
        except Exception as e:
            print("企业微信机器人发送文件失败,详细信息:" + str(e))
            return False

    def UploadFile(self, filepath, webHookUrl):
        """
        企业微信机器人上传文件,发送文件前需要先上传--要求文件大小在5B~20M之间
        :param filepath: 文件路径
        :param webHookUrl: 群组机器人WebHook
        :return: media_id
        """
        # url为群组机器人WebHook,配置项
        url = webHookUrl
        params = parse.parse_qs(parse.urlparse(webHookUrl).query)
        webHookKey = params['key'][0]
        upload_url = f'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={webHookKey}&type=file'
        headers = {"Accept": "application/json, text/plain, */*", "Accept-Encoding": "gzip, deflate",
                   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36"}
        filename = os.path.basename(filepath)
        try:
            multipart = MultipartEncoder(
                fields={'filename': filename, 'filelength': '', 'name': 'media',
                        'media': (filename, open(filepath, 'rb'), 'application/octet-stream')},
                boundary='-------------------------acebdf13572468')
            headers['Content-Type'] = multipart.content_type
            resp = requests.post(upload_url, headers=headers, data=multipart)
            json_res = resp.json()
            if json_res.get('media_id'):
                # print(f"企业微信机器人上传文件成功,file:{filepath}")
                return json_res.get('media_id')
        except Exception as e:
            # print(f"企业微信机器人上传文件失败,file: {filepath}, 详情:{e}")
            print("企业微信机器人上传文件失败,详细信息:" + str(e))
            return ""
    def getYesterday(self):
        today = datetime.date.today()
        oneday = datetime.timedelta(days=1)
        yesterday = today - oneday
        return yesterday
    def run(self):
        # 判断文件是否存在
        if (os.path.exists(self.out_path)):
            # 存在,则删除文件
            os.remove(self.out_path)
        self.selectData()


if __name__ == "__main__":
    env = downLoadPOutAluminumTasks2()
    env.run()

@scheduler.scheduled_job('cron', year="*", month="*", day="*", hour="*", minute="*", second="10")
def request_update_status():
    env = downLoadPOutAluminumTasks2()
    env.run()


scheduler.start()

模板
在这里插入图片描述
结果
在这里插入图片描述

企业微信机器人api获取方式和config.json配置文件具体见

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

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

相关文章

NXP iMX8M Plus Qt5 双屏显示

By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用,可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 Toradex 的 Linux BSP 上实现在两个屏幕上显示独立的 Qt 应用。 硬件介绍 Verdin iMX8M Plu…

2024年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B卷

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B卷 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B卷A 模块基础设施设置/安全加固(200 分)A-1:登录安全加固(Windows…

【漏洞复现】智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC

漏洞描述 智跃人力资源管理系统是基于B/S网页端广域网平台,一套考勤系统即可对全国各地多个分公司进行统一管控,成本更低。信息共享更快。跨平台,跨电子设备。智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在SQL注入漏洞,攻击者可通过该漏洞获取数据库中的信…

『 Linux 』环境变量

文章目录 🚀什么是环境变量🚀🚀查看环境变量🚀🕹️和环境变量有关的命令🕹️ 🚀PATH环境变量🚀🕹️设置PATH环境变量🕹️ 🚀HOME环境变量&#x1…

手敲单链表,简单了解其运行逻辑

1. 链表 1.1 结构组成 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 链表的结构如下图所示,是由很多个节点相互通过引用来连接而成的;每一个节点由两部分组成,分别数据域&…

【LeetCode每日一题合集】2023.11.20-2023.11.26 (二叉树中的伪回文路径)

文章目录 53. 最大子数组和解法1——DP解法2——分治(维护区间、类似线段树的思想) 2216. 美化数组的最少删除数(贪心)2304. 网格中的最小路径代价1410. HTML 实体解析器(模拟)2824. 统计和小于目标的下标对…

iOS Class Guard 成功了,但无法区分差异

​ 我正在开发一个静态库,并使用 Polidea 的 iOS Class Guard 来混淆我的静态库。我按照步骤在项目的根路径中下载 obfuscate_project,更改其中所需的名称,最后在终端中运行 bash obfuscate_project。我收到一条消息,说我的构建成…

【漏洞复现】大华智慧园区综合管理平台deleteFtp接口远程命令执行

漏洞描述 大华智慧园区综合管理平台deleteFtp接口存在远程命令执行,攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益…

CMMI认证含金量高吗

一、CMMI认证含金量解答 CMMI,即能力成熟度模型集成,是由美国卡内基梅隆大学软件工程研究所开发的一种评估企业软件开发过程成熟度的模型。CMMI认证的含金量究竟高不高呢?答案是肯定的。CMMI认证被誉为软件开发行业的“金牌标准”&#xff0…

spring cloud gateway源码分析,一个请求进来的默认处理流程

1.前言 spring cloud gateway的基本组成和作用就不细赘述,此篇适合对此有一定了解的人阅读。 spring cloud gateway版本: Hoxton.SR1 spring cloud gateway的配置使用yml配置: server:port: 9527y#根据微服务名称进行动态路由的配置 spring:applicati…

zookeeper心跳检测 (实操课程)

本系列是zookeeper相关的实操课程,课程测试环环相扣,请按照顺序阅读来学习和测试zookeeper。 阅读本文之前,请先阅读----​​​​​​zookeeper 单机伪集群搭建简单记录(实操课程系列)zookeeper 客户端常用命令简单记录…

人工智能-优化算法之学习率调度器

学习率调度器 到目前为止,我们主要关注如何更新权重向量的优化算法,而不是它们的更新速率。 然而,调整学习率通常与实际算法同样重要,有如下几方面需要考虑: 首先,学习率的大小很重要。如果它太大&#xf…

知识管理平台Confluence:win10安装confluence

文章目录 介绍主要功能 安装教程安装java运行平台JRE安装数据库Postgresql在Postgresql创建confluence使用的数据库创建数据库用户创建数据库 安装confluence注册confluence启动confluence 参考链接 介绍 Confluence 是由澳大利亚软件公司 Atlassian 开发的企业协作平台。它提…

flutter开发实战-ValueListenableBuilder实现局部刷新功能

flutter开发实战-ValueListenableBuilder实现局部刷新功能 在创建的新工程中,点击按钮更新counter后,通过setState可以出发本类的build方法进行更新。当我们只需要更新一小部分控件的时候,通过setState就不太合适了,这就需要进行…

canvas基础:渲染文本

canvas实例应用100 专栏提供canvas的基础知识,高级动画,相关应用扩展等信息。 canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

java设计模式学习之【桥接模式】

文章目录 引言桥接模式简介定义与用途:实现方式 使用场景优势与劣势桥接模式在Spring中的应用绘图示例代码地址 引言 想象你正在开发一个图形界面应用程序,需要支持多种不同的窗口操作系统。如果每个系统都需要写一套代码,那将是多么繁琐&am…

scrapy爬虫中间件和下载中间件的使用

一、关于中间件 之前文章说过,scrapy有两种中间件:爬虫中间件和下载中间件,他们的作用时间和位置都不一样,具体区别如下: 爬虫中间件(Spider Middleware) 作用: 爬虫中间件主要负…

SQL Server 2016(基本概念和命令)

1、文件类型。 【1】主数据文件:数据库的启动信息。扩展名为".mdf"。 【2】次要(辅助)数据文件:主数据之外的数据都是次要数据文件。扩展名为".ndf"。 【3】事务日志文件:包含恢复数据库的所有事务…

深入理解前端路由:构建现代 Web 应用的基石(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

2024年天津天狮学院专升本专业课报名缴费流程

天津天狮学院高职升本缴费流程 一、登录缴费系统 二、填写个人信息,进行缴费 1.在姓名处填写“姓名”,学号处填写“身份证号”,如下图所示: 此处填写身份证号 2.单击查询按钮,显示报考专业及缴费列表,…