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的Django框架中用流响应生成CSV文件的教程
May 02 Python
详解Python中time()方法的使用的教程
May 22 Python
python函数形参用法实例分析
Aug 04 Python
查看django版本的方法分享
May 14 Python
Win10环境python3.7安装dlib模块趟过的坑
Aug 01 Python
django基于restframework的CBV封装详解
Aug 08 Python
对python while循环和双重循环的实例详解
Aug 23 Python
django重新生成数据库中的某张表方法
Aug 28 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
Python中seaborn库之countplot的数据可视化使用
Jun 11 Python
python模块与C和C++动态库相互调用实现过程示例
Nov 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
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
js 省地市级联选择
2010/02/07 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
H5移动端适配 Flexible方案
2016/10/24 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
python获取Pandas列名的几种方法
2019/08/07 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
一些Unix笔试题和面试题
2013/01/22 面试题
班长岗位职责
2013/11/10 职场文书
农行心得体会
2014/09/02 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python
Golang 并发编程 SingleFlight模式
2022/04/26 Golang