濮阳杆衣贸易有限公司

主頁 > 知識庫 > Python實現(xiàn)Excel自動分組合并單元格

Python實現(xiàn)Excel自動分組合并單元格

熱門標(biāo)簽:400電話辦理費用收費 申請辦個400電話號碼 鎮(zhèn)江人工外呼系統(tǒng)供應(yīng)商 外呼系統(tǒng)前面有錄音播放嗎 騰訊地圖標(biāo)注有什么版本 高德地圖標(biāo)注字母 千呼ai電話機器人免費 深圳網(wǎng)絡(luò)外呼系統(tǒng)代理商 柳州正規(guī)電銷機器人收費

大家好,我們經(jīng)常會有這樣的需求。比如下圖

我們需要把同一個省份的合并起來,如下圖的效果

如何實現(xiàn)呢,這是原有的df

直觀的操作是這樣的:

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就發(fā)現(xiàn)了方法了!大家看到了嗎?

真是柳暗花明又一村啊,完整解決方案已經(jīng)有了,我封裝到了tkinter里面,請看!

#-*- coding:utf-8 -*-
import tkinter as tk #使用Tkinter前需要先導(dǎo)入
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()  #目標(biāo)工作表
#打開目標(biāo)文件
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="請選擇目標(biāo)工作表:").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()))
#勾選目標(biāo)字段
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="請勾選分組合并的目標(biāo)字段(第一個勾選框為分組合并依據(jù),必須事先進行排序:").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))
#合并單元格函數(shù)
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): #實現(xiàn)居中
  ws.cell(row=i,column=colindex).alignment=aligncenter

def manual(): #使用說明
 info="""
 作用是合并單元格,把同樣內(nèi)容的單元格合并到一起,所以必須實現(xiàn)對目標(biāo)字段進行排序,否則無法實現(xiàn)合并
 """
 messagebox.showinfo('提示',info)

frame1=tk.Frame(window,pady=6,padx=15)
frame1.grid(row=0,column=0,sticky='w')
ttk.Button(frame1,text="打開目標(biāo)文件",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()

效果如圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • python 刪除空值且合并excel的操作
  • python 合并多個excel中同名的sheet
  • python excel多行合并的方法
  • 利用Python pandas對Excel進行合并的方法示例
  • python合并多個excel文件的示例
  • 使用 Python 合并多個格式一致的 Excel 文件(推薦)
  • Python pandas實現(xiàn)excel工作表合并功能詳解
  • python操作openpyxl導(dǎo)出Excel 設(shè)置單元格格式及合并處理代碼實例
  • 使用python將多個excel文件合并到同一個文件的方法
  • Python實現(xiàn)合并excel表格的方法分析
  • python 實現(xiàn)讀取一個excel多個sheet表并合并的方法
  • 使用Python橫向合并excel文件的實例
  • 如何用python合并多個excel文件

標(biāo)簽:大慶 哈爾濱 烏蘭察布 平頂山 合肥 海南 郴州 烏蘭察布

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python實現(xiàn)Excel自動分組合并單元格》,本文關(guān)鍵詞  Python,實現(xiàn),Excel,自動,分組,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python實現(xiàn)Excel自動分組合并單元格》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python實現(xiàn)Excel自動分組合并單元格的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    定远县| 龙岩市| 勃利县| 宝清县| 嫩江县| 新干县| 德钦县| 湾仔区| 临夏县| 永登县| 井冈山市| 彰武县| 奈曼旗| 建瓯市| 克什克腾旗| 宁明县| 延吉市| 信丰县| 中牟县| 铁力市| 若尔盖县| 商丘市| 平罗县| 博兴县| 大英县| 北川| 和林格尔县| 民丰县| 莲花县| 东平县| 定安县| 马关县| 茶陵县| 江源县| 金山区| 防城港市| 兖州市| 叶城县| 桐乡市| 广汉市| 尉犁县|