pandas+pywin32操作excel办公自动化
import pandas as pd
import re
import win32com.client as win32
from win32com.client import constants
import os
import os.path as osp
#读取表格
path=os.getcwd()
fp=osp.join(path,'fuck_demo.xlsx')
df=pd.read_excel(fp,header=1,usecols=['序号','光缆段落名(A端-B端)'],nrows=72)#别忘了nrows
df.set_index('序号',inplace=True)#设置索引
#筛选数据
df_1=df[~df['光缆段落名(A端-B端)'].str.contains('JT01')]
df_2=df[df['光缆段落名(A端-B端)'].str.contains('JT01')]
#操作引用df_2数据
reg=re.compile(r'(?<=\()(.*?)(?=\))')
pf=df_2.copy()
pf['提取A-B端']=pf['光缆段落名(A端-B端)'].str.extract(reg,expand=False)
pf['光缆芯数']=pf['光缆段落名(A端-B端)'].str.extract(r'(?:.*)(-\d+)',expand=False)
pf=pf.iloc[::-1]#倒序,关键
pf['光缆芯数'] = pf['光缆芯数'].replace('-', '', regex=True)#替换
#处理数据
ls=[]
for idx,row in pf.iterrows():
strs_2=row['光缆段落名(A端-B端)']
strs_3=row['提取A-B端']
strs_4=row['光缆芯数']
if strs_3 in strs_2:
ls.append([idx,strs_3,strs_4])
lg=[]#存放当前项与前一项相等,且与后一项不等
lf=[]#存放前后两项不等的
for i in range(len(ls)):
if ls[i][1]==ls[i-1][1] and ls[i][1]!=ls[i+1][1]:
lt=ls[i-1:i+2]
l1=[]#存放数字
l2=[]#存放A-B端
l3=[]#存放光缆芯数
for j in range(len(lt)):
l1.append(lt[j][0])
l2.append(lt[j][1])
l3.append(lt[j][-1])
new_l1=[min(l1),max(l1)]#取最小最大
new_l1=map(str,new_l1)#列表元素映射为字符串
new_l2=list(set(l2))+list(set(l3))
res_1='-'.join(new_l1)#序号拼接
res_2='-'.join(new_l2)#AB端光缆芯数拼接
res_3=list((res_1,res_2))#转为列表
lg.append(res_3)
else:
l1=ls[i][0]#存放数字
l2=ls[i][1]#存放A-B端
l3=ls[i][-1]#存放光缆芯数
res_4=list((l1,l2,l3))
lf.append(res_4)
xh=[]#序号
ab=[]#ab端
xs=[]#芯数
for k in range(len(lf)):
l1=lf[k][0]#存放数字
l2=lf[k][1]#存放A-B端
l3=lf[k][-1]#存放光缆芯数
xh.append(l1)
ab.append(l2)
xs.append(l3)
#重新两两分组
xh=[xh[x:x+2] for x in range(0,len(xh),2)]
ab=[ab[x:x+2] for x in range(0,len(ab),2)]
xs=[xs[x:x+2] for x in range(0,len(xs),2)]
lm=[]
for n in range(len(xh)):
l1=list((min(xh[n]),max(xh[n])))
new_l1=map(str,l1)
l2=list(set(xs[n]))
l3=ab[n]+l2
res_1='-'.join(new_l1)
res_2='-'.join(l3)
lm.append([res_1,res_2])
finall_list=lg+lm
#去重
finall_ls=[]
for l in finall_list:
if l not in finall_ls:
finall_ls.append(l)
#根据结果列表重新创建DataFrame
df_3=pd.DataFrame(data=finall_ls,columns=['序号','光缆段落名(A端-B端)'])
df_3.set_index('序号',drop=True,inplace=True)#设置序号列为索引
#把没有JT的光缆段落和经过处理的有JT的段落进行拼接
cf=pd.concat([df_1,df_3],axis=0)
'''
重新替换索引也行,不替换也行。反正行号是在序号的基础上+2
'''
#pywin32读取excel表格
#运行excel程序
try:
excel_app = win32.gencache.EnsureDispatch('Excel.Application')
except:
try:
win32.gencache.EnsureDispatch('et.Application')
except:
win32.gencache.EnsureDispatch('ket.Application')
finally:
excel_app.Visible = True
excel_app.DisplayAlerts = False
#读取表格所需列
workbook = excel_app.Workbooks.Open(fp)
worksheet = workbook.Worksheets('清单')
worksheet.Columns(3).Insert()
worksheet.Columns(4).Insert()
worksheet.Cells(2, 3).Value = '图纸编号'#设置列名
worksheet.Cells(2, 4).Value = '段落名称'#设置列名.
#操作表格
for idx,row in cf.iterrows():
dl=row['光缆段落名(A端-B端)']
bh=idx
if '-' in str(bh):
sb=bh.split('-')
start_row=int(min(sb))+2#开始行号
end_row=int(max(sb))+2#结束行号
range1_to_merge=worksheet.Range(worksheet.Cells(start_row, 3), worksheet.Cells(end_row, 3))#要合并的单元格的“图纸编号”
range2_to_merge=worksheet.Range(worksheet.Cells(start_row, 4), worksheet.Cells(end_row, 4))#要合并单元格的“段落名称”
range3_to_color=worksheet.Range(worksheet.Cells(start_row, 5), worksheet.Cells(end_row, 5))#要设置颜色的“光缆段落名(A端-B端)”
range4_to_color=worksheet.Range(worksheet.Cells(start_row, 17), worksheet.Cells(end_row, 17))#要设置颜色的“委托单号+需求人”
range2_to_merge.WrapText = True#自动换行
range3_to_color.Interior.Color =7396243 # 浅红色填充色804040
range4_to_color.Interior.Color =7396243
#range3_to_merge.Font.Color = 25500 # 深红色文本
range1_to_merge.Value=bh#图纸编号
range2_to_merge.Value=dl#光缆段落
range1_to_merge.Merge()
range2_to_merge.Merge()
range2_to_merge.Rows.RowHeight=36
range2_to_merge.Columns.ColumnWidth = 34
else:
worksheet.Cells(idx+2,3).Value = idx
worksheet.Cells(idx+2,4).Value = dl
worksheet.Cells(idx+2,4).WrapText = True#自动换行
#结束操作保存表格
workbook.Save()
workbook.Close(SaveChanges=False)
excel_app.Quit()
相关文章:
pandas+pywin32操作excel办公自动化
import pandas as pd import re import win32com.client as win32 from win32com.client import constants import os import os.path as osp #读取表格 pathos.getcwd() fposp.join(path,fuck_demo.xlsx) dfpd.read_excel(fp,header1,usecols[序号,光缆段落名(A端…...
防火墙(ensp USG6000v)---安全策略 + 用户认证综合实验
一. 题目 1) 拓扑 2)要求 1. DMZ区内的服务器,办公区仅能在办公时间内(9:00 -- 18: 00)可以访问,生产区的设备全天可以访问 2.生产区不允许访问互联网,办公区和游客区允许访问互联网 3.办公区设备10.0.2.10不充许…...
Java使用POI导出后数字类型为常规类型,不能计算
今日日常撸码,甲方提出来excel导出后,数字类型那一列是常规类型,并不是数字,无法进行计算,如下图: 这里和导出的字段类型有关,我用的是POI进行excel的导出,需要在实体类上标注出需要…...
项目进度管理(5-1)常见的缓冲区监控方法
缓冲区监控是一种项目管理技术,主要用于关键链项目管理系统(Critical Chain Project Management, CCPM)中。它的核心理念是识别和管理项目中的不确定性和依赖性,以提高项目完成的可靠性。 缓冲区监控方法主要是针对项目进度计划执…...
构造函数语意学(The Semantics of Constructors)
1、“Default Constructor” 的构造操作 下面4种情况编译器会生成默认构造函数: 成员类对象带有默认构造函数父类带有默认构造函数带有虚表的类带有虚基类的类 1.1、 成员类对象带有默认构造函数 如果一个类没有任何构造函数,但它的一个成员对象带有…...
香橙派5plus上跑云手机方案二 waydroid
前言 上篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)说了怎么跑带GPU加速的redroid方案,这篇说下怎么在香橙派下使用Waydroid。 温馨提示 虽然能运行,但是体验下来只能用软件加速,无法使用GPU加速,所有会很卡。而且…...
600Kg大载重起飞重量多旋翼无人机技术详解
600Kg大载重起飞重量的多旋翼无人机是一种高性能的无人驾驶旋翼飞行器,具有出色的载重能力和稳定的飞行特性。该无人机采用先进的飞行控制系统和高效的动力系统,能够满足各种复杂任务的需求,广泛应用于物资运输、应急救援、森林防火等领域。 …...
LlamaFactory可视化微调大模型 - 参数详解
LlamaFactory 前言 LLaMA Factory 是一个用于微调大型语言模型的强大工具,特别是针对 LLaMA 系列模型。 可以适应不同的模型架构和大小。 支持多种微调技术,如全参数微调、LoRA( Low-Rank Adaptation )、QLoRA( Quantized LoRA )等。 还给我们提供了简单实用的命令行…...
最新 Kubernetes 集群部署 + flannel 网络插件(保姆级教程,最新 K8S 版本)
资源列表 操作系统配置主机名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…...
C语言笔记31 •单链表经典算法OJ题-3.反转链表•
反转链表 1.问题 给你单链表的头节点 head,请你反转链表,并返回反转后的链表。 2.代码实现: //3.反转链表 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int …...
网桥与以太网交换机:功能与区别解析
在传统的共享式局域网中,所有站点共享一个公共的传输媒体。随着局域网规模的扩大、网络中站点数目的不断增加,这样的网络通信负载加重,网络效率急剧下降。随着技术的发展、交换技术的成熟和成本的降低,具有更高性能的交换式局域网…...
动态引用的艺术:在Postman中实现自动化的终极指南
🌀 动态引用的艺术:在Postman中实现自动化的终极指南 在API开发和测试中,Postman是一个强大的工具,它提供的动态引用功能可以帮助我们实现自动化和更高效的测试流程。本文将深入探讨如何在Postman中使用动态引用,通过…...
Qt:15.布局管理器(QVBoxLayout-垂直布局、QHBoxLayout-水平布局、QGridLayout-网格布局、拉伸系数,控制控件显示的大小)
目录 一、QVBoxLayout-垂直布局: 1.1QVBoxLayout介绍: 1.2 属性介绍: 1.3细节理解: 二、QHBoxLayout-水平布局: 三、QGridLayout-网格布局: 3.1QGridLayout介绍: 3.2常用方法:…...
图论---无向图中国邮路的实现
开始编程前分析设计思路和程序的整体的框架,以及作为数学问题的性质: 程序流程图: 数学原理: 本质上是找到一条欧拉回路,考虑图中的边权重、顶点的度数以及如何通过添加最少的额外边来构造欧拉回路,涉及到欧…...
Rockchip RK3588 - Rockchip Linux SDK脚本分析
---------------------------------------------------------------------------------------------------------------------------- 开发板 :ArmSoM-Sige7开发板eMMC :64GBLPDDR4 :8GB 显示屏 :15.6英寸HDMI接口显示屏u-boot &a…...
【C++中resize和reserve的区别】
1. resize的用法 改变当前容器内含有元素的数量(size())比如: vector<int> vct;int num vct.size();//之前的元素个数为num vct.resize(len);//现在的元素个数为len如果num < len ,那么容器vct新增len - num个元素&am…...
计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设
本论文的主要研究内容如下: 了解基于Spark的TapTap游戏数据分析系统的基本架构,掌握系统的开发方法,包括系统开发基本流程、开发环境的搭建、测试与运行等。 主要功能如下: (1)用户管理模块:…...
Python面试题:如何在 Python 中进行正则表达式操作?
在 Python 中,正则表达式操作可以通过 re 模块来实现。以下是一些常用的正则表达式操作和示例: 1. 导入模块 import re2. 常见操作和示例 a. 匹配 使用 re.match() 来检查字符串的开头是否匹配某个模式。 pattern r\d # 匹配一个或多个数字 strin…...
C#面:简述什么是中间件(Middleware)?
中间件是组装到应⽤程序管道中以处理请求和响应的软件。 每个组件: 选择是否将请求传递给管道中的下⼀个组件。 可以在调⽤管道中的下⼀个组件之前和之后执⾏⼯作。 请求委托(Request delegates)⽤于构建请求管道,处理每个HTTP请…...
AWS Glue 与 Amazon Redshift 的安全通信配置
1. 引言 在 AWS 环境中,确保服务间的安全通信至关重要。本文将探讨 AWS Glue 与 Amazon Redshift 之间的安全通信配置,特别是为什么需要特定的安全组设置,以及如何正确实施这些配置。 2. 背景 AWS Glue:全托管的 ETL(提取、转换、加载)服务Amazon Redshift:快速、完全…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
