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快速查找算法应用实例
Sep 26 Python
使用Python下的XSLT API进行web开发的简单教程
Apr 15 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
python爬虫超时的处理的实例
Dec 19 Python
python实现飞机大战游戏
Oct 26 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
python集合删除多种方法详解
Feb 10 Python
python程序如何进行保存
Jul 03 Python
Django serializer优化类视图的实现示例
Jul 16 Python
python opencv实现图像配准与比较
Feb 09 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
php.ini中文版
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
AJAX的使用方法详解
2017/04/29 PHP
PHP实现微信退款功能
2018/10/02 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
react写一个select组件的实现代码
2019/04/03 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
python多任务及返回值的处理方法
2019/01/22 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
为什么python比较流行
2020/06/19 Python
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
服装电子商务创业计划书
2014/01/30 职场文书
平安建设工作方案
2014/06/02 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
2015年科普工作总结
2015/07/23 职场文书
canvas 中如何实现物体的框选
2022/08/05 Javascript