Python使用Pandas与xlwings保留格式汇总Excel数据
本文介绍如何利用Python的Pandas库进行数据清洗与比对,结合xlwings操作Excel文件以保留原有格式。通过对比项目行数差异并动态插入行,实现多部门Excel内容的自动化汇总,同时确保排版格式不被破坏。
Python Excel汇总核心思路
利用Python汇总各部门Excel文件的核心思路如下:
1. 调用pandas库读取汇总表(变量b3df)及单个部门的明细表(变量dedf)。 2. 对pandas数据框中的空值进行填充,确保“项目名称”和“主管部门”两列无缺失数据。 3. 通过xlwings库打开汇总表(变量b3ws)和部门明细表(变量dews)。 4. 基于pandas数据(b3df与dedf)对比两个表格中项目的行数差异。若行数不一致,则在汇总表(b3ws)中插入相应行,使汇总表的行数与部门明细表(dews)保持一致。 5. 将部门明细表(dews)的内容复制到汇总表(b3ws)中。 6. 保存文件并退出程序。
原始汇总表格结构如下:

完成A、B、C、D四个部门数据汇总后的最终表格效果:

代码实现细节
具体实现代码见下方:
import pandas as pd
import xlwings as xw
def insertRow(zgfj,deFile,b3df,b3ws):
'''
'''
print('正在汇总:' + zgfj)
dedf = pd.read_excel(deFile,header=3)
dedf[['项目名称','主管部门']] = dedf[['项目名称','主管部门']].fillna(axis=0,method='ffill')
dewb = app.books.open(deFile)
dews = dewb.sheets[0]
#对比两个表的不同
df1 = pd.pivot_table(dedf[dedf['主管部门']==zgfj],values='责任单位',index='项目名称',aggfunc=[len])
df2 = pd.pivot_table(b3df[b3df['主管部门']==zgfj],values='责任单位',index='项目名称',aggfunc=[len])
df12 = df1 - df2
if df12.shape[0]:
diff = df12[df12[('len','责任单位')] != 0]
#两个表不同则修改excel表,使相同项目的行数相同
#if diff.shape[0]:
for xmmc in list(diff.index):
for r in range(1,b3ws.used_range.shape[0]+1):
if b3ws.range(r,2).value == xmmc:
if diff.loc[xmmc][0] > 0:
print(str(r+1) + ':' + str(int(r+diff.loc[xmmc][0])))
b3ws.api.rows(str(r+1) + ':' + str(int(r+diff.loc[xmmc][0]))).insert #插入部门多出的行
break
else:
b3ws.api.rows(str(r+1) + ':' + str(int(r-diff.loc[xmmc][0]))).delete #删除多余的行
break
#复制部门内容到汇总表
for xmmc in list(df2.index):
for r in range(1,b3ws.used_range.shape[0]+1):
if b3ws.range(r,2).value == xmmc:
#项目名称在部门excel表的行号
rfj = dedf[dedf['项目名称'] == xmmc].index[0] + 5
#需要插入的行数
rows = df1.loc[xmmc][0]
#复制部门excel表格项目名称所在行到汇总表
dews.api.rows(str(rfj) + ':' + str(rfj+rows-1)).Copy(b3ws.api.rows(str(r) + ':' + str(r+rows-1)))
break #因为项目名称唯一,复制后可跳出进行下一项目
if __name__ == '__main__':
#汇总表格文件
b3File = '汇总文件.xls'
#各部门表格文件所在位置
fjFile = {'B部门':'B部门.xls',\
'A部门':'A部门.xls',\
'C部门':'C部门.xls',\
'D部门':'D部门.xls'}
app = xw.App(visible=False,add_book=False)
app.display_alerts = False
app.screen_updating = False
b3wb = app.books.open(b3File)
b3ws = b3wb.sheets[0]
b3df = pd.read_excel(b3File,header=3)
for zgfj,file in fjFile.items():
b3df[['项目名称','主管部门']] = b3df[['项目名称','主管部门']].fillna(axis=0,method='ffill') #填充合并单元格内容
#print(b3df.shape[0])
insertRow(zgfj,file,b3df,b3ws)
b3wb.save('汇总后文件.xls')
app.quit()
app.kill()
总结
以上就是关于Python在保留格式的前提下汇总各部门Excel内容的实现思路。如需了解更多相关Python处理Excel的内容,欢迎查阅本站往期文章或继续浏览后续教程,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













