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



推荐阅读
  • VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解
    目录一、代码背景二、主要工具三、函数解析1、FindWindow:2、FindWindowEx:3、SendMessage: ... [详细]
  • JComponentJLabel的setBorder前言用例2205262241前言setBorder(Border边框)实现自JComponentjava.awt.Insets ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 优化后的摘要:默认情况下,PopupWindow在点击外部区域时会自动关闭。为了实现点击外部区域时不自动关闭的功能,可以通过自定义设置来调整PopupWindow的行为,确保其在外部点击时仍保持显示状态。这需要对PopupWindow的属性进行适当的修改和配置,以满足特定的交互需求。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • 深入解析 Android 选择器与形状绘制技术
    本文深入探讨了 Android 中选择器(Selector)与形状绘制(Shape Drawing)技术的应用与实现。重点分析了 `Selector` 的 `item` 元素,其中包括 `android:drawable` 属性的使用方法及其在不同状态下的表现。此外,还详细介绍了如何通过 XML 定义复杂的形状和渐变效果,以提升 UI 设计的灵活性和美观性。 ... [详细]
  • 在 PySimpleGUI 中实现异步功能的详细指南 ... [详细]
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社区 版权所有