热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python合并单元格居中_Python实现Excel自动分组合并单元格

大家好,我们经常会有这样的需求。比如下图我们需要把同一个省份的合并起来,如下图的效果如何实现呢,这是原有的df直观的操作是这样的:df.t

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

2021222114848248.jpg

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

2021222114902708.jpg

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

2021222114915639.jpg

直观的操作是这样的:

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

2021222114930433.jpg

真是柳暗花明又一村啊,完整解决方案已经有了,我封装到了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("",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("<>",lambda event:getmergeseg(event,alldata,sheetvar.get()))

#勾选目标字段

def getmergeseg(event,alldata,sheet):

global frame2,segvars

segvars&#61;[]

try:

frame2.destroy()

except:

pass

frame2&#61;tk.Frame(window,padx&#61;15,pady&#61;6)

frame2.grid(row&#61;1,column&#61;0,sticky&#61;&#39;w&#39;)

ttk.Label(frame2,text&#61;"请勾选分组合并的目标字段(第一个勾选框为分组合并依据&#xff0c;必须事先进行排序:").grid(row&#61;0,column&#61;0,columnspan&#61;4,sticky&#61;&#39;w&#39;)

data&#61;alldata[sheet]

for index,item in enumerate(data.columns):

segvars.append(tk.StringVar())

ttk.Checkbutton(frame2,text&#61;item,variable&#61;segvars[-1],onvalue&#61;item,offvalue&#61;&#39;&#39;).grid(row&#61;(index//4&#43;1),column&#61;index%4,sticky&#61;&#39;w&#39;)

#合并字段单元格

def merging(file,sheet,segvars):

selected&#61;[i.get() for i in segvars if i.get()]

df&#61;pd.read_excel(file,sheet)

wb&#61;load_workbook(file)

ws&#61;wb[sheet]

mergecells(ws,df,selected)

try:

wb.save(file)

messagebox.showinfo(&#39;提示&#39;,file&#43;&#39;-&#39;&#43;sheet&#43;&#39;指定单元格合并完成&#39;)

os.system(&#39;start &#39;&#43;os.path.dirname(file))

except Exception as e:

messagebox.showerror(&#39;警告&#39;,str(e))

#合并单元格函数

def mergecells(ws,df,cols):

col&#61;cols[0]

gdic&#61;df.groupby(col).groups

aligncenter&#61;Alignment(horizontal&#61;&#39;center&#39;,vertical&#61;&#39;center&#39;)

for gname in gdic:

indexs&#61;gdic[gname]&#43;2

indexs&#61;indexs.sort_values()

for col in cols: #每一个要合并的字段

colindex&#61;df.columns.tolist().index(col)&#43;1

ws.merge_cells(start_row&#61;indexs[0],end_row&#61;indexs[-1],start_column&#61;colindex,end_column&#61;colindex) #合并

for i in range(1,ws.max_row&#43;1): #实现居中

ws.cell(row&#61;i,column&#61;colindex).alignment&#61;aligncenter

def manual(): #使用说明

info&#61;"""

作用是合并单元格&#xff0c;把同样内容的单元格合并到一起&#xff0c;所以必须实现对目标字段进行排序&#xff0c;否则无法实现合并

"""

messagebox.showinfo(&#39;提示&#39;,info)

frame1&#61;tk.Frame(window,pady&#61;6,padx&#61;15)

frame1.grid(row&#61;0,column&#61;0,sticky&#61;&#39;w&#39;)

ttk.Button(frame1,text&#61;"打开目标文件",command&#61;getmergefile).grid(row&#61;0,column&#61;0,sticky&#61;&#39;w&#39;)

ttk.Entry(frame1,textvariable&#61;path_tar,width&#61;40).grid(row&#61;0,column&#61;1)

frame3&#61;tk.Frame(window,pady&#61;10,padx&#61;15)

frame3.grid(row&#61;2,column&#61;0,sticky&#61;&#39;w&#39;)

ttk.Button(frame3,text&#61;"点击合并单元格",command&#61;lambda:merging(path_tar.get(),sheetvar.get(),segvars)).grid(row&#61;0,column&#61;0,sticky&#61;&#39;w&#39;)

ttk.Button(frame3,text&#61;"使用说明",command&#61;manual).grid(row&#61;0,column&#61;1)

window.mainloop()

效果如图&#xff1a;

2021222114946824.jpg

以上就是本文的全部内容&#xff0c;希望对大家的学习有所帮助&#xff0c;也希望大家多多支持站圈网。



推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文总结了解决python文件读写乱码问题的方法。其中包括错误的打开方式和正确的打开方式,并提供了相应的代码示例。建议在进行写入操作后先将文件关闭,然后再打开,最后再读取文件。若文件编码是utf-8,则需要在读取文件时添加decode('utf-8')。这样操作可以避免在打开记事本时出现乱码问题。 ... [详细]
  • 本文详细介绍了Python open()函数的用法,包括文件操作的流程和具体的打开模式。通过该函数,可以打开文件并进行读取、写入等操作。同时,还介绍了文件路径的两种形式和不同的打开模式。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • Android获取app应用程序大小的方法
    Android获取app应用程序大小的方法-Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。 ... [详细]
author-avatar
李亞男大宝贝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有