当前位置: 代码网 > it编程>前端脚本>Python > 基于Python+PyQt5+Pandas编写的带图形界面的Excel合并工具

基于Python+PyQt5+Pandas编写的带图形界面的Excel合并工具

2026年01月12日 Python 我要评论
引言在日常办公或数据处理中,经常会遇到多个 excel 文件需要合并的场景。手工复制不仅效率低,而且容易出错。本文将手把手教你使用 python + pyqt5 + pandas 编写一个带图形界面的

引言

在日常办公或数据处理中,经常会遇到多个 excel 文件需要合并的场景。手工复制不仅效率低,而且容易出错。

本文将手把手教你使用 python + pyqt5 + pandas 编写一个带图形界面的 excel 合并工具,支持:

  • 选择文件夹
  • 自动读取多个 .xlsx 文件
  • 不同列自动对齐合并
  • 一键生成合并后的 excel 文件
  • 自带程序图标(base64 内嵌)

一、效果预览

功能说明:

  • 选择包含多个 .xlsx 文件的文件夹
  • 自动显示文件列表
  • 点击「合并 excel 文件」
  • 在当前目录生成 合并.xlsx

二、环境准备

1、python 版本

推荐:

python 3.8+

2、安装依赖

pip install pyqt5 pandas openpyxl

说明:

库名用途
pyqt5gui 图形界面
pandasexcel 数据处理
openpyxl读取 / 写入 xlsx

三、功能设计说明

1、合并逻辑说明

  • 逐个读取 excel 文件
  • 自动收集 所有出现过的列
  • 不同文件中缺失的列自动补 nan
  • 最终按列名对齐合并

示意:

文件
a.xlsx姓名、年龄
b.xlsx姓名、性别
合并结果姓名、年龄、性别

2、gui 组件说明

组件功能
qlabel提示文本
qpushbutton选择文件夹 / 合并
qfiledialog目录选择
qtablewidget文件列表
qmessagebox完成 / 错误提示

四、完整源码(可直接运行)

代码内嵌 base64 图标,首次运行会自动生成 icon.png

import sys
import os
import pandas as pd
import base64
from pyqt5.qtwidgets import (
    qapplication, qwidget, qmessagebox, qpushbutton,
    qfiledialog, qvboxlayout, qlabel, qtablewidget, qtablewidgetitem
)
from pyqt5.qtgui import qicon, qpixmap

base64 图标处理

base64_icon = "data:image/png;base64,......(略)"
icon_data = base64_icon.split(',')[1]
icon_bytes = base64.b64decode(icon_data)

主窗口类

class excelmergerapp(qwidget):
    def __init__(self):
        super().__init__()
        self.initui()

初始化 ui

def initui(self):
    self.setwindowtitle('xlsx多个文件合并')
    self.setgeometry(100, 100, 800, 500)

    if os.path.exists('icon.png'):
        self.setwindowicon(qicon('icon.png'))
    else:
        pixmap = qpixmap()
        pixmap.loadfromdata(icon_bytes)
        self.setwindowicon(qicon(pixmap))
        pixmap.save('icon.png', 'png')

    self.info_label = qlabel('选择包含要合并的excel文件的文件夹:')
    self.select_folder_button = qpushbutton('选择文件夹')
    self.merge_button = qpushbutton('合并excel文件')
    self.folder_label = qlabel('')

    self.file_table = qtablewidget()
    self.file_table.setcolumncount(1)
    self.file_table.sethorizontalheaderlabels(['文件列表'])

    layout = qvboxlayout()
    layout.addwidget(self.info_label)
    layout.addwidget(self.select_folder_button)
    layout.addwidget(self.folder_label)
    layout.addwidget(self.file_table)
    layout.addwidget(self.merge_button)

    self.setlayout(layout)

    self.select_folder_button.clicked.connect(self.get_folder)
    self.merge_button.clicked.connect(self.merge_excel_files)

选择文件夹 & 显示文件列表

def get_folder(self):
    folder = qfiledialog.getexistingdirectory(self, "选择包含excel文件的文件夹")
    if folder:
        self.folder_path = folder
        self.folder_label.settext(f'选择的文件夹: {folder}')
        self.populate_file_table()
def populate_file_table(self):
    files = [f for f in os.listdir(self.folder_path) if f.endswith('.xlsx')]
    files.sort()
    self.file_table.setrowcount(len(files))
    for i, f in enumerate(files):
        self.file_table.setitem(i, 0, qtablewidgetitem(f))

excel 合并核心逻辑

def merge_excel_files(self):
    if not hasattr(self, 'folder_path'):
        qmessagebox.critical(self, '错误', '请先选择文件夹')
        return

    merged_df = pd.dataframe()

    for row in range(self.file_table.rowcount()):
        file_name = self.file_table.item(row, 0).text()
        file_path = os.path.join(self.folder_path, file_name)
        df = pd.read_excel(file_path)

        for col in df.columns:
            if col not in merged_df.columns:
                merged_df[col] = none

        merged_df = pd.concat([merged_df, df], ignore_index=true)

    output_path = os.path.join(self.folder_path, '合并.xlsx')
    merged_df.to_excel(output_path, index=false)

    qmessagebox.information(self, '完成', f'合并完成,文件保存到:\n{output_path}')

程序入口

if __name__ == '__main__':
    app = qapplication(sys.argv)
    window = excelmergerapp()
    window.show()
    sys.exit(app.exec_())

完整代码

import sys
import os
import pandas as pd
from pyqt5.qtwidgets import qapplication, qwidget,qmessagebox, qpushbutton, qfiledialog, qvboxlayout, qlabel, qtablewidget, qtablewidgetitem
from pyqt5.qtcore import qt,qbytearray
from pyqt5.qtgui import qicon, qpixmap
import base64
base64_icon = "data:image/png;base64,ivborw0kggoaaaansuheugaaamgaaadicayaaactwk6eaaaaaxnsr0iars4c6qaaghpjrefuef7txquyxewvpuf29asi0aaritojk751e4bwuafbadkqfguurfgbirklorgioshduwhbf0qeuuqwdvkfwvwubxdvbikkyglrfujctj/qgweiicjb2cfmuu/z7wzd2ukymenhfdttofv984vmqs75z1/351bvrtqfocvybgygbl44pj6+myiulb9m3pmzd0de5wka/mxj5uci4rza3yd+bwavqifzdwbp1x+y+slefhrs359gxecrcaharq6vy+whyinqgxmmoplqhgnbebsyew9m3gsr9waapqfgfntwm249zsxlrbwu0yrhoor53ud4+pjqymjii01b0wabgfcbnpkwfaqfijfllwfmgwbggqc8uektsvd/haduzuy7efeualidib5lgkrw/alazui5qqgwojflhvwthiiin6udpqn3amb+eqbcb61d1qhxxbaccmqkaovf4ojqtfopipguahhpboy7yfghzr6ujpzb3ydkdgovsk0v+vr6tsvn829i5mmb4duakhonmxjdikov65n5h4swlbp55cqvlcq8o+potgsefd9fhogiirfuvpic7areyf0jac4dgetn85xlvgre932dimcdwdeasdjxry9bdv/gzncw85fk5fk92yleptpzjzbcoxc453mnasdy9qmbfryq8zywdl9orf3pbim+4wwydons7o0bn8oq6qmashs2dgzmca5gxavz+fzva9as2rizr1tnd6xajdhpa4apasdjalbtqix3qhnmftjzviuz+ete9ndodlpjbnlx17dtpp8/lznfr5puxb7zv4piqtxqrz325b5jbgkmmqmanwca0wfgu8qedxu0myenapb5adifip7wcdr0heb83z8sac5cxl5o6jssx8dmi4h4ihh9louxzfogawmdfzvk5wsacfjwo6jd8d/azcdzax/manyzfiisti2pj5/ozgfpcmr5r+8zadivt7d3rra/zgdoieeqhmjm3wia3/lhqwfuyoczbwhgegvtb7jes2yestdee+xxr1+/ahe/ncwcfetwdfzy29t7zlbejpkqsg2ucf0s2fk7w/r0zxigby2xyw+4hrdzapevkkt8tu1oqut8kr7ggxgsan5nrdc03it5ms4krizutz755ew1r+hjm6mek2lg4u7u7jnc3blipeb0sjxus+mmn9/ncrmjbgchh51bvapineb0soxai5iyhsni8i7xhlxocct3/xmr8vojdyk6cpgbtxcrbfdxorgiedtgxa4ajzjbiojim4gvephswua0gaquknr3jwsr8c1pk6h+3weaea/t6ek5nu3vjakkzi899njo2njyjqag6xs0kanbmndthg0bjhwdhzxtkqmu1aqi6tkrlcrpaedlqusutrpcwj2vsuw1iymjko418zkkqhzfx4sivwaak3je6jcldnyfz+exr1279ugkwscuen/3d0teuwfgudlbqr9mm2cr1er+w8pdjyyzraic6evrm9/v1xubaoyazjdqq2myuc+xy+03odgo30wskykjpja58ffm/ipeilmnhckait6wz+cptmprslicyrlj/quw0rmjo06dspsbg4jotqaqxu01eyh4vv9drhxh3mgo/vnfwdej6l1xrxy7qhzfpx8rjdoifmugugay+txr7acjnbqfsvgfegtbicwsczc1kanxmxasev0al/hybgkmkssejidrbd7iikxtzoobzuadrbwx3g0sy8nblbz7wjc8l4w7+jlvswo2mgyer1aru8bxjsrygsxbtqxrdht0dgdyk7lw1zaymdmdtxprgvgvbeuuej2uz9ytwimebukytecqknq8i/ppjuppprwaaaorz0cie4jooxlofnxrcaorzkcieyjooxrpn62tiaorzucieugqbcuy+wmjeqculifpgudez5zkpu+2s1pbaikucgd4nvfrdofoe2ugygyyev9vkpx+ux27bqmkdv/faj341e4xansygsh1d3fv1s7o37yeoku6mxatmo6kabnt6sxwjbuskcaixsbmcjiw16pzbacmjmbafqbequs/b8vxywixxojdl7xivnsoawkz8hsi2rmvny0jxbhzdabc1ypdbammpmsapdw9ulnftqtebpnl5mfe3llzz1pfguirgxuaugj29t2mbel7/lmi+jkua43t9soa2fezrsrjcaq2zykizzwdocmbggnebaajadc3gseo170fah7lzhdya/+ljjuigqoy+vqaejxj+bve4ww87xnekqghot832qqpgfi+f3eh3rh4owa4lojwteew7/sfq8qvjrkq9dxmabg/wcqvtmsuzcmc2wwxxxyehx+xcvzwyzoi+jfsqstz5bsqxhhzr3cmjx9dolxsthh4jp/p+41mawxyimaykwag9iwsmffrbmz+nbvw0p42vywx9wda7k010squmidxk3yoexancas/v39jtvotn2lq5tqieeipvlq5fyy+7y9hxftaaatt3gmgl8v1da4ozjgiakggqrbcwswnkc49kp5f1i446jezy24hgp1cjvfxncvaq1tqzhrif3//vgq1kgmdt2/kvtuvwx5wbrmcmeyuajcbd7vkn4gnxsbgdlq3bt3ydkhmkjagce5n5vmzykdk4pd4gydyv5adm8qfwt6cavmrlzvkl7qlen/312x0q/mgmaxfxy6xi5s31i4vj+qt1jemlinib1kgxpi3amd3m0jhrmy+rjxvquli1cnhgxwszob8xumunp52igwmuqkadpnzh1m1rbxvtnzkvsdii340jjrov4z9miio2baybqqkucgs9jxptpxmoe9xjviaie0ceqmx5gcacjrd8squ9hki8/l877y+hg7z4tfgykauj7fvpzelsyqjucgupc+7fwc6e4tihsxfwnledo5uzqytycma8okkelbrh5kpt9b+pf0722pvjjfcw3p1xfwep2v3qsja3lbafn8/qhylbbqwg/qehuhryuwy3gavszhgfauatorfubp1hyfxedfws/htvkf8378meu90bfk0ogidvtxmhecawnkz4eihtsfarut00s1ntcuqnmy8dga7tocv9taxi0mt4sxehy45eisitjolu5vamjk8ung49gh1dpathllbccqy8yua+ijlmscw55czhy3nunkzo8w2bqayeyw1drp7nkd6g9ypip2oellh5ipi+ahyj1cn5i72fdkwvhprbpndbsaqjuuwvcsxy8nhqvfltnsc2gw9cohcuxpnzt2nxtvafisgdpt/6tkz/mi5gpcz4iwiok377tytidhmgwdwvqc7ucjfskfbm+mgzou0bqofquh5nudjcoy3uugqm7/pwiunzyfklgk5eqbe7ydwi4nopxzepzbazmd3/emq8cowm8fz7doikk26uwrkkqb4bpzem7vd25ub+cbdznfo/egzmmbid4clo7fclsxhiwjbvglxfx83rjs9ri6vu4livtw0dcgdxphfaodctutmccowv1wud202xpj9/wre3jq4zqg0jsiqoobdictiqg3xuoxzmxejm6zmm/nx1tpvbyyqy8y3aoafm7iuy2vm/qs19rmxuldtjjbgjlkwan7ucbybcrkr/dowapemg7s4bpjqitirpr3qkligggo+aabnxgw/bbt/ikkjqz0mvrfq6///24khojtmubsytodqox0ggia4kzkvs8f71f43bngwd3r09jkjgrslxx3cmgzrssmyglobxecqiyadidizmb/sejzm3ttau2pcimay9wdan1wckfnvp9qf7xhghrmba8yymrafg4gpyewg4vgluulfjwti+/6xefhkykxhy+gnrcqflrv0oaoontacob9sf4nimuedhouhk4jofy5hujgrm1asfl8dhugvijbbtjlmvtlae0hdia/jxl1tq9ea2jdl5fxgegxh61atjcmamayko/wkftboa5sifmfvb+/222233bt5srs0gee1w4loeryg1wb6dbhjnd7otesixwjxiazdtentntuczr7gwvtov/eprtyymmz8aac+1lrrzfoxc4bbelyemv2fdn+nio8ulurocjmzlsu+l9qep1kx3df1aotkdenq4oozkkn4k1sovwuauv/wr64trpiezqarl4rhuc8i7g8am53yc5yje9d3/xmr8vooa1v4ykaadjwjbxazb8p4uisyoaxmyoczlxgbfm/v44/aw8paygxclqkrc2z0ktxlnld3tjlwuxhi/wdas52ep6cugrqzqms7rcawaaop4ldxyocrdkwvgugoob5xesouzsbfbsoikd8bwitsbkgulqfxgrgvgtwjam9zfahiugzszoaxecgzalbdiiduttlgkgnpikdklppcvxeqlmugrqaeeoe8aqdzuwshrpubvxn4swjkuqdy0vweikszsjgbh0qgdwjab4og1luy4code8u8jhkbxewoujsbfbmy+fcow01s7af17tqdd+pmraf7r8glzmbprcd/dgbvtrmiulcgxgtgkjlrebkinugioswkdktjgkrdfygch4iftboi+lygxgqaet8tqyzn069miu87zcwhvepdxv33dg4oypvxdze+vr7tkpxkrlk8mawn/lywyahwf1etvid+j3/w/33yn/pmzdv073ub9x9n5k126/+9/fbbb/w7yfxr9etpoxpmtnsdys7kevwm/pl8flp9lf5dzocwv5o/t24zyddmfmvtjn7x1dw1ly+6/8n16r6k/lryar7mi6jcksazpj26uwpbd5cmroqncigi/qthpyydik8w83ustt9kx716jziby8yeapbnaji4g8pvivdjop84dgdwep53yndqkkrh1djbdbhjrgean7oakud5u7ieehq8z3vz0ndqh1wluxg1zoamebu6um4fgfe2biw+lnkjtj159sma8ol4xlvmgrhpkjvkf7twwltlgyh+/v4l1wq17cdwr4lop7pabgmayxrnvjhkwu4bujcxmbaewtxmfhqsxls3+ksiwla/qofripj+1m1f35kzf22tzcrqr/trzy6lvu8fjyjxobb1pur0ul0gh0lesxwd+dkiossxtaonbgykhcibnuf9ogbtlztexa+usqwv1wvyeclklvpofeq8olqq/dgzqaokngzcfegyhq8ul8u31qwyiylkwslncjmfz62vyx21ddgdlgqkuqnsmdiysn7tjngy8waalhkllxdxk6vsybwlrv2hp6nwggooaiabxamkmuestusezyabbefwpfxf2ygqokl3ptnixuh7/vmiehrmbpoxfxurtvxlvukgvu8fh4hxnmml7rphgl6ixc7fhbcftz8ua77vr0pendnf8f/ezq9wqvs6fdobfivfnjamjq2ps2unee3qeidfei0dqrcsyoaprwu1bwu7etgazqqif3h0flou97bd324acilgkgb+gwpohieibxvmm32pnszcaqdvdqwwi+iv1wr19hk5lglstxqaa8ayywbavik9x8k5jojemqvagib4bzn/1zhadtiydh1atvr91fdw8b8dxaiwgmda0s/ndetvjslzij9rnnud9px17dtv1fvwazg6uevuum3qwjqlof3gwmz3w2tjpx7tudggn88vxlt27synbluz0bgjd5epunyrii0wbobz+fz+kx+oql0yy2toci0a5kk2hzg9+4ho98m2phlivwfa7k7xmnsyggxm/ay1kmuzlul7/tsructhbghmc6y1z0wrkcaidmhmm5ynqoffygazp9zv1bx/4odgcksgjxnlwjtjai0z72+t/c20apf5itfgdlbpquu4nhh37p4ldmnxlsvlulyqsiioajg4iluld1meshlw039c/teb7t5zrvyphb4evicuejikdnl7fnlae0pdajhglawa1xerp3adyobqivpzxeiyji7a8ooaa+3tdqlekhljza/uxnerqhztzecbrbtbb+gaol6faotnor8loil3sm/zzhcqbcfla6c5p1o7aww8mhfu3kx33hopxl0xecnam6ngwdle9m9tkbfngsxevhih7u7uxxxes468c2ejwxoj6ow4yjxgvaeafpixzyasvco9iymjsjc1vzk2a4gxrg6xygewlz3dwnuikplht00c10ng0oxr9wmi2uyzpq1ahn1tmth+3yklietlpzlsloiszfgcwsebiojgbzexrucwlvvwnto6kh+q9a7dyb6nda0x8+7w2vuiqpfxcfyriaqsy7wlguijiahok0/wurgqdljn4fgiuiokfbkxh1dwhil61nrczji5sl+/f161wpujznwosfubqtnwirg1fyiv6+kqltalfi1avhllykpbaphgxpilagcrr4ypd7ucaiwbr3k5xlhzu1umo8q6ocqwzv6qtvy25k5bznydsotcobdy8zw9pdqtm9n594ui6kotwdxgyhufcm1blsuu+66mcqghguhd3/edy9+b5r5kgxs1dmoxl8vle5vb0qlvdolxugyvsquvjctesed6+/sxvqtvvcsmevazued+rhxzo0u+vu+7ml+5fab/0t3d/zi1a9y83ujjhgvsm4t8cqa+0ohhrzmjbjyw82ntjcuhbgzewkluznxr0exendpis4no3jmrpvujkyeui8ufyrjkxerxtbplobv1vjhz3yg4xmxrefefafaegh4aofjuos1ggdoiflpsqsysnlsz1qxvaeog0iyigk8xc8mkbbsi1lmgemdgtci6vxk/tqukdq8caubpm460rjkqjgpmpdh//vzdv61and4mjqyfiszdzopbtnbad/yxmnv580zyaekgkg3pgcm3z+7wibotowykzmcmbo3n4mhvidix2zezf9vsrl9zgfpfgwitgac8zysmdq39uru7lqtenbljdnm3fda1tzimnerel7bqsc2b9pb2bj9nzpw1injxkgbtpwzeymc9rprs2xrvqo+2bcjogya4kjl/2soabacmxmqah2g4t7sxmlutknqq1gwiefpmgapzzaavbr5arb9vpehknpeiphbyuhik7dmuig2vdetawo1edob0jwub9rgjqgotdjmwk7td5zfqxospazew8hi1wt11ehg4kmvnixoibfoofa73po8/ywhatsoddthazmuttbc2vlmbspekppymuraawjqm0wberaimtmfa+ur0zpqurs4qny9e2t1qq1egepgunp6e/wy6y96ovxq9yawi85fmu0drr8daes/zdhsagor8qf8sath5sardriyazoczd7pw/rthbk1uje0ggsh3/bmq8tnn4ngqykbtdcdikavskbyk67ekpdbc0jspm+pyrdwoa8y8wlp7eqp1w6kxu0bqv7p9dwde2gpabammtmuam19jrx1n3owkircorwxjguboofgfd7+o/ekzuimidgeaatxejsiqcaj2vfc2nep2llh7typty3lu+pj4gsmjixuscdmxgdremj+xy92bijitq4sy0cwdqyuvyghnzcvp1sgw9rmvidivjac7cwawtgte288qbh5k5r2ttx9kmurebslbdqwm9fuqlz/locqkg1vfmwxaasayihpnoojubfitiwtse5g8pomg1v+mglh7zpw5r129evvf0kcdmkak2d322om5y2njcunja9iixn26zqaz31ytvo9iaki+frupckqayrlwqw899b1mptrt7lj0ctnwnredl8rs7nrxps6qgjj0ff8lkpy+4u5qd24yepm29vbddeuge/h93z8jes/rxfutdmfm20n2kq8s0wwurokuqgoioqwrjd2+zbjxmnsyeikzj4ryngau1dkneamqwcz2hgeok3f96h5fl7tv4458pv/mtwvxpuwavccfmmny/nlmbvtgvtdivzybggbm/qk1vtlzxl6vqhxenrviprjf92xidq0apl+valwnsww8aqbhe9fnzilmyms4dsvu93xi5fkj1bs2vfl8/ggxh1rbruh8g6qoulzl/gk9i7gpb9g1yoyif/b09hw86uqkcqwagyfmgnidhiixs1rguehru9ezidc8acdx1trfrg89pouze4hqsxtp0u6ngzd+agbkctcdhz1qoqignggaz/t29l6qlbfg5jgzkzb6aivcifa87woa+lsioljnrmwam0uwzq9yax+m2hri5jitkendrunkbasal0ymoxu0hqnlmsss0q1zp6kjbckd0nfxn7+rq0v2cp0mam/jesdkfl8mp+sazbl64g8zjwez2b0jkhpuxwjxatn/mpnfr/otxb7rcgbc6xneoxfkn0wsiikcdzxajglftqucbwdvbobcmir3sg/5en5tv1fxwyodg8odggfhcqtewbxjvr8ggbn06bxpi/xtaliaifzhatuxyx0vkdrfxpjnytp8by6yxlf+yaqc9qbweavsuxhkzosrribub+esechkkoigoaoatmhma9ohbxa1/r0afgnsbozf1q1bnzal4ozzkzb6bxckhalnecfipjnzzt+bor6bwb9n5quz+rvlclmu1puvzvylzhkpg2p2rmr3mppbawdrrhwaab4dgouz+yfz58+/zdwqveozlidnyatapngcane/hwkafw8au3f4qykt7j8bwi1etlldy206pbxidjqndaxi/q7lzhywjghjetpuzh5bxfuz+szeviwi5k2hzrsmqecafdrqqvmplttuexe5acxu0kts1ww16rfyk8vlftgp3yviiluf0iazxpgxhwhy73neglxdmfksc8tp0pn+y8z3i+kq/mh/53k5ochbwxvthjirm6tayuz+yre4iojbxcizy5tmz0nazcw7i2jfm65rqynjaiap/moi+aazt4ihvcqtbcaw1m2cgf8dkv/jh6dyaveaaaaasuvork5cyii="
icon_data = base64_icon.split(',')[1]
icon_bytes = base64.b64decode(icon_data)
class excelmergerapp(qwidget):
    def __init__(self):
        super().__init__()
        self.initui()

    def initui(self):
        self.setwindowtitle('xlsx多个文件合并')
        self.setgeometry(100, 100, 800, 500)
        if os.path.exists('icon.png'):
            icon = qicon('icon.png')
            self.setwindowicon(icon)
        else:
             # 将字节数据转换为 qpixmap
            pixmap = qpixmap()
            pixmap.loadfromdata(icon_bytes)

            # 创建 qicon 并将其设置为窗口图标
            icon = qicon(pixmap)
            self.setwindowicon(icon)
            pixmap.save('icon.png', 'png')
        

        self.info_label = qlabel('选择包含要合并的excel文件的文件夹:')
        self.select_folder_button = qpushbutton('选择文件夹')
        self.merge_button = qpushbutton('合并excel文件')

        self.folder_label = qlabel('')
        
        self.file_table = qtablewidget()
        self.file_table.setcolumncount(1)
        self.file_table.sethorizontalheaderlabels(['文件列表'])

        layout = qvboxlayout()
        layout.addwidget(self.info_label)
        layout.addwidget(self.select_folder_button)
        layout.addwidget(self.folder_label)
        layout.addwidget(self.file_table)
        layout.addwidget(self.merge_button)
        layout.addstretch()  
        self.setlayout(layout)

        self.select_folder_button.clicked.connect(self.get_folder)
        self.merge_button.clicked.connect(self.merge_excel_files)

    def get_folder(self):
        folder = qfiledialog.getexistingdirectory(self, "选择包含excel文件的文件夹")
        if folder:
            self.folder_path = folder
            self.folder_label.settext(f'选择的文件夹: {folder}')
            self.populate_file_table()

    def populate_file_table(self):
        file_names = [file for file in os.listdir(self.folder_path) if file.endswith(".xlsx")]
        file_names.sort()  # sort the file names
        self.file_table.setrowcount(len(file_names))
        for i, file_name in enumerate(file_names):
            item = qtablewidgetitem(file_name)
            self.file_table.setitem(i, 0, item)

    def merge_excel_files(self):
        if hasattr(self, 'folder_path'):
            # 添加您在上面的代码中执行的excel文件合并操作
            unique_columns = pd.dataframe()
            for row in range(self.file_table.rowcount()):
                file_name = self.file_table.item(row, 0).text()
                file_path = os.path.join(self.folder_path, file_name)
                df = pd.read_excel(file_path)
                file_columns = df.columns
                for column in file_columns:
                    if column not in unique_columns.columns:
                        unique_columns[column] = none
                unique_columns = pd.concat([unique_columns, df[file_columns]], ignore_index=true)

            # 保存合并后的数据到output.xlsx文件,包括列名
            output_file = "合并.xlsx"
            output_file_path = os.path.join(self.folder_path, output_file)
            unique_columns.to_excel(output_file_path, index=false)
            msg = qmessagebox()
            icon = qicon("icon.png")
            msg.setwindowicon(icon)
            msg.seticon(qmessagebox.information)
            msg.settext(f'合并完成,结果保存到 {output_file_path}')
            msg.setwindowtitle('合并完成')
            msg.exec_()
        else:
            msg = qmessagebox()
            icon = qicon("icon.png")
            msg.setwindowicon(icon)
            msg.seticon(qmessagebox.critical)
            msg.settext('请选择文件夹以合并excel文件')
            msg.setwindowtitle('错误')
            msg.exec()

if __name__ == '__main__':
    app = qapplication(sys.argv)
    ex = excelmergerapp()
    ex.show()
    sys.exit(app.exec_())

到此这篇关于基于python+pyqt5+pandas编写的带图形界面的excel合并工具的文章就介绍到这了,更多相关python pyqt5 excel合并工具内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com