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 02 Python
python在命令行下使用google翻译(带语音)
Jan 16 Python
python list元素为tuple时的排序方法
Apr 18 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
Django Rest framework之权限的实现示例
Dec 17 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
python神经网络编程实现手写数字识别
May 27 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 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计算上一个月的今天
2013/05/23 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
jquery等待效果示例
2014/05/01 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
python如何随机生成高强度密码
2020/08/19 Python
python不同版本的_new_不同点总结
2020/12/09 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
部队党性分析材料
2014/02/16 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
英文慰问信
2015/02/14 职场文书
摘录式读书笔记
2015/07/01 职场文书
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
一级电子管军用接收机测评
2022/04/05 无线电