python保留格式汇总各部门excel内容

使用pthon汇总各部门的excel内容,主要思路:
1.使用pandas读入汇总表(b3df)和其中一个部门的表格内容(dedf)
2.填充pandas空值,使’项目名称’,'主管部门’列没有空值
3.使用xlwings打开汇总表(b3ws)和部门表(dews)
4.用b3df、dedf对比两个表中项目的行数是否一样,不一样则在汇总表(b3ws)插入行,使汇总表和部门表格(dews)一致
5.复制部门表格(dews)内容到汇总表(b3ws)
6.保存退出
汇总表格如下:
python保留格式汇总各部门excel内容_第1张图片
汇总A、B、C、D部门后的表格如下:
python保留格式汇总各部门excel内容_第2张图片
具体代码如下:

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)