Python实现Excel自动分组合并单元格
作者:chaodaibing 发布时间:2021-11-06 03:03:41
标签:python,分组,合并
大家好,我们经常会有这样的需求。比如下图
我们需要把同一个省份的合并起来,如下图的效果
如何实现呢,这是原有的df
直观的操作是这样的:
df.to_excel('test.xlsx',index=False)
from openpyxl import load_workbook
wb=load_workbook('test.xlsx')
ws=wb.active()
ws.merge_cells(start_row=2,end_row=8,start_column=1,end_column=1)
ws.merge_cells(start_row=2,end_row=8,start_column=2,end_column=2)
ws.merge_cells(start_row=9,end_row=14,start_column=1,end_column=1)
ws.merge_cells(start_row=9,end_row=14,start_column=2,end_column=2)
ws.merge_cells(start_row=15,end_row=18,start_column=1,end_column=1)
ws.merge_cells(start_row=15,end_row=18,start_column=2,end_column=2)
wb.save()
只是问题在于我们不能总是人工判断start_row和end_row,如何能使程序自动获取row的起始点呢?其实我们使用一个groupby就发现了方法了!大家看到了吗?
真是柳暗花明又一村啊,完整解决方案已经有了,我封装到了tkinter里面,请看!
#-*- coding:utf-8 -*-
import tkinter as tk #使用Tkinter前需要先导入
from tkinter import filedialog,messagebox,ttk
from openpyxl import load_workbook
from openpyxl.styles import Alignment
import os
import pandas as pd
#建立窗口window
window = tk.Tk()
window.title('Excel合并单元格工具')
w_width=630
w_height=600
scn_width=window.maxsize()[0]
x_point=(scn_width-w_width)//2
window.geometry('%dx%d+%d+%d' %(w_width,w_height,x_point,100))
window.wm_attributes('-topmost',True)
window.tk_focusFollowsMouse()
window.bind("<Escape>",lambda event:window.iconify())
path_tar=tk.StringVar()
sheetvar=tk.StringVar() #目标工作表
#打开目标文件
def getmergefile():
file_path=filedialog.askopenfilename(title=u'选择文件',filetype=[('Excel','.xlsx')])
path_tar.set(file_path)
alldata=pd.read_excel(file_path,None)
ttk.Label(frame1,text="请选择目标工作表:").grid(row=1,column=0,sticky='w')
global sheetvar
chosen_sheet=ttk.Combobox(frame1,width=16,textvariable=sheetvar)
chosen_sheet['values']=list(alldata)
chosen_sheet.grid(row=1,column=1,sticky='w')
chosen_sheet.bind("<<ComboboxSelected>>",lambda event:getmergeseg(event,alldata,sheetvar.get()))
#勾选目标字段
def getmergeseg(event,alldata,sheet):
global frame2,segvars
segvars=[]
try:
frame2.destroy()
except:
pass
frame2=tk.Frame(window,padx=15,pady=6)
frame2.grid(row=1,column=0,sticky='w')
ttk.Label(frame2,text="请勾选分组合并的目标字段(第一个勾选框为分组合并依据,必须事先进行排序:").grid(row=0,column=0,columnspan=4,sticky='w')
data=alldata[sheet]
for index,item in enumerate(data.columns):
segvars.append(tk.StringVar())
ttk.Checkbutton(frame2,text=item,variable=segvars[-1],onvalue=item,offvalue='').grid(row=(index//4+1),column=index%4,sticky='w')
#合并字段单元格
def merging(file,sheet,segvars):
selected=[i.get() for i in segvars if i.get()]
df=pd.read_excel(file,sheet)
wb=load_workbook(file)
ws=wb[sheet]
mergecells(ws,df,selected)
try:
wb.save(file)
messagebox.showinfo('提示',file+'-'+sheet+'指定单元格合并完成')
os.system('start '+os.path.dirname(file))
except Exception as e:
messagebox.showerror('警告',str(e))
#合并单元格函数
def mergecells(ws,df,cols):
col=cols[0]
gdic=df.groupby(col).groups
aligncenter=Alignment(horizontal='center',vertical='center')
for gname in gdic:
indexs=gdic[gname]+2
indexs=indexs.sort_values()
for col in cols: #每一个要合并的字段
colindex=df.columns.tolist().index(col)+1
ws.merge_cells(start_row=indexs[0],end_row=indexs[-1],start_column=colindex,end_column=colindex) #合并
for i in range(1,ws.max_row+1): #实现居中
ws.cell(row=i,column=colindex).alignment=aligncenter
def manual(): #使用说明
info="""
作用是合并单元格,把同样内容的单元格合并到一起,所以必须实现对目标字段进行排序,否则无法实现合并
"""
messagebox.showinfo('提示',info)
frame1=tk.Frame(window,pady=6,padx=15)
frame1.grid(row=0,column=0,sticky='w')
ttk.Button(frame1,text="打开目标文件",command=getmergefile).grid(row=0,column=0,sticky='w')
ttk.Entry(frame1,textvariable=path_tar,width=40).grid(row=0,column=1)
frame3=tk.Frame(window,pady=10,padx=15)
frame3.grid(row=2,column=0,sticky='w')
ttk.Button(frame3,text="点击合并单元格",command=lambda:merging(path_tar.get(),sheetvar.get(),segvars)).grid(row=0,column=0,sticky='w')
ttk.Button(frame3,text="使用说明",command=manual).grid(row=0,column=1)
window.mainloop()
效果如图:
来源:https://blog.csdn.net/chaodaibing/article/details/108320039


猜你喜欢
- 1、读文件import csvcsv_reader = csv.reader(open("data.file", enc
- 一:操作session1:session配置Session 的配置文件存储在config/session.php中,配置参数有:(1):配置
- Python-OpenCV环境的配置看上一篇OpenCV环境的配置本篇主要介绍一下OpenCV的基本使用和相关函数的介绍。以下所有操作都基于
- 实战场景 本篇博客学习字体反爬,涉及的站点是实习 x,目标站点地址直接百度搜索即可。可以看到右侧源码中出现了很多&ldqu
- 关于混淆矩阵的概念,可参考此篇博文混淆矩阵1.混淆矩阵混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真
- React 是 Facebook 里一群牛 X 的码农折腾出的牛X的框架。 实现了一个虚拟 DOM,用 DOM 的方式将需要的组
- 编码问题response = requests.get(URL, params=params, he
- 这篇文章主要介绍了Python文件操作函数用法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 一、文件操作1.打开r+ 打开存在文件 文件不存在 报错file = open("user.txt","r+&
- 前言光流flow特征中包含了一个视频当中运动相关的信息,在视频动作定位当中光流特征使用的比较多,所以记录一下提取光流特征的方法。使用的方法是
- 本文记录了笔者用 Python 爬取淘宝某商品的全过程,并对商品数据进行了挖掘与分析,最终得出结论。项目内容本案例选择>> 商品
- 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组...)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办
- 本文实例讲述了python使用装饰器和线程限制函数执行时间的方法。分享给大家供大家参考。具体分析如下:很多时候函数内部包含了一些不可预知的事
- 前言可扩展标记语言,是一种简单的数据存储语言,XML被设计用来传输和存储数据存储,可用来存放配置文件,例:java配置文件传输,网络传输以这
- JS调试技巧技巧一:格式化压缩代码 技巧二:快速跳转到某个断点的位置右侧的Breakpoints会汇总你在JS文件所有打过的断点,点击跟ch
- 在框架选择上,不少人会觉得swoft才是最强PHP框架,尤其是在常驻内存模式的应用级高性能框架,性能是这一堆页面级框架遥不可及的,但是使用上
- 注:本文所指的YUV均为YUV420中的I420格式(最常见的一种),其他格式不能用以下的代码。位深为8bit时,每个像素占用1字节,对应文
- 本文实例讲述了mysql基于正则实现模糊替换字符串的方法。分享给大家供大家参考,具体如下:例如: abcd(efg)hijk 替换之后是ab
- 最近,Node.js 和 Python 都因其广泛的特性和功能在市场上大受欢迎。在你开发Web应用程序的后端时,这两种技术都是你的首选。众所
- 使用JSON获取前端数据,转成JSON,传递到后端,然后对数据库做修改。前端代码<div style="padding: 1