热门标签 | 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;也希望大家多多支持站圈网。



推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
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社区 版权所有