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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
Python中让MySQL查询结果返回字典类型的方法
Aug 22 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
Python中的默认参数实例分析
Jan 29 Python
Flask框架web开发之零基础入门
Dec 10 Python
在pycharm中设置显示行数的方法
Jan 16 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
关于python 跨域处理方式详解
Mar 28 Python
python求前n个阶乘的和实例
Apr 02 Python
python 遍历磁盘目录的三种方法
Apr 02 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
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
python中二维阵列的变换实例
2014/10/09 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
python更新列表的方法
2015/07/28 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
python with (as)语句实例详解
2020/02/04 Python
pytorch masked_fill报错的解决
2020/02/18 Python
python中Mako库实例用法
2020/12/31 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
Html5页面二次分享的实现
2018/07/30 HTML / CSS
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
计算机应用专业毕业生求职信
2014/06/03 职场文书
房产授权委托书范本
2014/09/22 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
加薪通知
2015/04/25 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
校园安全学习心得体会
2016/01/18 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
Python中的 Set 与 dict
2022/03/13 Python
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server
mysql函数之截取字符串的实现
2022/08/14 MySQL