Python实现Excel自动分组合并单元格


Posted in Python onFebruary 22, 2021

大家好,我们经常会有这样的需求。比如下图

Python实现Excel自动分组合并单元格

我们需要把同一个省份的合并起来,如下图的效果

Python实现Excel自动分组合并单元格

如何实现呢,这是原有的df

Python实现Excel自动分组合并单元格

直观的操作是这样的:

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就发现了方法了!大家看到了吗?

Python实现Excel自动分组合并单元格

真是柳暗花明又一村啊,完整解决方案已经有了,我封装到了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()

效果如图:

Python实现Excel自动分组合并单元格

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之list和str比较
Sep 20 Python
Python如何为图片添加水印
Nov 25 Python
python安装教程 Pycharm安装详细教程
May 02 Python
Python实现爬虫从网络上下载文档的实例代码
Jun 13 Python
Django Celery异步任务队列的实现
Jul 24 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
Python高并发解决方案实现过程详解
Jul 31 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
2021年最新用于图像处理的Python库总结
Jun 15 Python
如何用Python搭建gRPC服务
Jun 30 Python
Python数据处理的三个实用技巧分享
Apr 01 Python
matplotlib绘制正余弦曲线图的实现
Feb 22 #Python
Python使用tkinter制作在线翻译软件
Feb 22 #Python
Python中使用Selenium环境安装的方法步骤
Feb 22 #Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 #Python
python实现计算图形面积
Feb 22 #Python
python实现银行账户系统
Feb 22 #Python
Django实现简单的分页功能
Feb 22 #Python
You might like
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
PHP安装问题
2006/10/09 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
Python如何实现的二分查找算法
2020/05/27 Python
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
水果花束:Fruit Bouquets
2017/12/20 全球购物
校园活动策划书范文
2014/01/10 职场文书
数学教学随笔感言
2014/02/17 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
第二次离婚起诉书
2015/05/18 职场文书
人代会简报
2015/07/21 职场文书
会计实训总结范文
2015/08/03 职场文书
加强党性修养心得体会
2016/01/21 职场文书