python批量匯總工作簿和工作表


1、匯總一個工作簿中多個工作表

基本邏輯:

(1)新建一個列表存儲內容

(2)打開第一張表,統計表有多少行

(3)將表的數據一行一行匯總在一起

(4)將匯總的內容保存到工作表中

import xlrd
# XlsxWriter只能創建新文件。它無法讀取或修改現有文件。
import xlsxwriter
import os

# 打開工作簿
wb = xlrd.open_workbook('D:/test01/年齡表.xlsx')
# 讀取工作簿的sheet名
sheets = wb.sheet_names()

# 統計工作簿匯總表的個數
nsheets = len(sheets)

# 每個工作表有多少行
for nsht in range(nsheets):
    table = wb.sheets()[nsht]
    nrows = table.nrows
    print(nrows)

total = [['姓名', '年齡', '來源']]

# 查看匯總表里面有多少字段
label = table.row_values(0)

item1 = label.index("姓名")
item2 = label.index("年齡")

for nsht in range(nsheets):
    table = wb.sheets()[nsht]
    nrows = table.nrows
    for nr in range(1, nrows):
        item = [table.row_values(nr)[item1], table.row_values(nr)[item2]]
        item.append(sheets[nsht])
        total.append(item)

# 新建一個工作簿
workbook = xlsxwriter.Workbook("D:/test01/年齡匯總test.xlsx")
worksheet = workbook.add_worksheet()

# 新建一個工作表,命名為sheet
for i in range(len(total)):
    for j in range(len(total[i])):
        worksheet.write(i, j, total[i][j])
workbook.close()

 方法二:采用xlwings匯總數據,並且設置條件格式(大於平均值的標注顏色)

數據來源:國家統計局原煤、原油、天然氣產量的月度數據

數據需求:將各月份當期產量數據匯總到一個新的工作簿

import pandas as pd
import xlwings as xw

raw_coal = pd.read_excel(r"統計局數據.xlsx", engine='openpyxl', sheet_name='原煤')
crude_oil = pd.read_excel(r"統計局數據.xlsx", engine='openpyxl', sheet_name='原油')
natural_gas = pd.read_excel(r"統計局數據.xlsx", engine='openpyxl', sheet_name='天然氣')
data = pd.merge(raw_coal, crude_oil, on = '指標')
data = pd.merge(data, natural_gas, on = '指標')
finally_data = data[['指標', '原煤產量當期值(萬噸)', '原油產量當期值(萬噸)', '天然氣產量當期值(億立方米)']]
# print(finally_data)

# 新建文檔匯總數據
wb = xw.Book()
sht = wb.sheets['sheet1']
sht.name = 'finally_data'
columns = list(finally_data.columns)
sht.range('A1').value = columns

finally_data1 = finally_data.values
sht.range('A2').value = finally_data1

describe = finally_data.describe()
avg = list(describe.loc['mean', :])
# 大於均值的數在EXCEL位置
red_原煤 = list(finally_data.index[finally_data['原煤產量當期值(萬噸)']>avg[0]])
red_position1 = ['B' +str(i+2) for i in red_原煤]
red_原油 = list(finally_data.index[finally_data['原油產量當期值(萬噸)']>avg[1]])
red_position2 = ['C' +str(i+2) for i in red_原油]
red_天然氣 = list(finally_data.index[finally_data['天然氣產量當期值(億立方米)']>avg[2]])
red_position3 = ['D' +str(i+2) for i in red_天然氣]
red = red_position1 + red_position2 + red_position3

# 小於均值的數在EXCEL位置
blue_原煤 = list(finally_data.index[finally_data['原煤產量當期值(萬噸)']<avg[0]])
blue_position1 = ['B' +str(i+2) for i in blue_原煤]
blue_原油 = list(finally_data.index[finally_data['原油產量當期值(萬噸)']<avg[1]])
blue_position2 = ['C' +str(i+2) for i in blue_原油]
blue_天然氣 = list(finally_data.index[finally_data['天然氣產量當期值(億立方米)']<avg[2]])
blue_position3 = ['D' +str(i+2) for i in blue_天然氣]
blue = blue_position1 + blue_position2 + blue_position3

# print(red)
# print(blue)

a_range = f'A1:D22'
sht.range(a_range).api.Font.Name='微軟雅黑'
sht.range(a_range).api.Borders(8).LineStyle = 1 # 上邊框
sht.range(a_range).api.Borders(9).LineStyle = 1 # 下邊框
sht.range(a_range).api.Borders(7).LineStyle = 1 # 左邊框
sht.range(a_range).api.Borders(10).LineStyle = 1 # 右邊框
sht.range(a_range).api.Borders(12).LineStyle = 1 # 內橫邊框
sht.range(a_range).api.Borders(11).LineStyle = 1 # 內縱邊框


# 區域內字體顏色成白色,單元格變成黑色
b_range = f'A1:D1'#區域第一行
sht.range(b_range).api.Font.Color = 0xffffff
sht.range(b_range).color=(0, 0, 0)

# 在excel 表格里改變字體顏色
for i in red:
    sht.range(i).api.Font.Color = 0x0000ff
for i in blue:
    sht.range(i).api.Font.Color = 0xFF0000
wb.save('結果數據.xlsx')
wb.close()

  

2、匯總多個工作簿的內容

數據說明:

1)excel文件夾中有兩個文件,2018.xlsx 和2019.xls

2)2019的文件表頭在第二行,2018的表頭在第一行

3)需要的字段不在同一列,並且除了需要的字段可能還有其它不相關的內容

基本步驟:

(1)查看有幾個工作簿

(2)打開第一個工作簿,統計表中內容

(3)將工作簿的內容匯總

(4)將匯總的內容保存到工作表中

import xlrd
import xlsxwriter
import os
# 讀取文件夾中的文件名
filelist = os.listdir('.\excel文件夾')
print(filelist)

# 新建一個列表存儲匯總的數據,定義好列名
# 此處也可以用dataframe來新建和處理
total = [['部門名稱', '招考職位', '職位簡介', '招考人數', '專業', '學歷','來源']]


# 要整理的excel表格 xls、xlsx文件所在文件夾
# 新建一個list存放xlsx文件(包含路徑)
collect_xlsx = []

# 將excel文件選出來
for file in filelist:
    fileExpand = os.path.splitext(file)[1]
#     print(fileExpand)
    if (fileExpand == '.xlsx')|(fileExpand == '.xls'):
        # 絕對路徑和相對路徑
        file_path = 'D:/工作文檔/03-數據分析分享/excel文件夾/' + file
#         file_path =  "./excel文件夾/" + file
        collect_xlsx.append(file_path)
#     elif fileExpand == '.xls':
#         collect_xlsx.append(file)

for file_xlsx in collect_xlsx:
        if file_xlsx == "D:/工作文檔/03-數據分析分享/excel文件夾/2019.xls":
            wb = xlrd.open_workbook(file_xlsx)
            sheets = wb.sheet_names()
            nsheets = len(sheets)

            for nsht in range(nsheets):
                table = wb.sheets()[nsht]
                nrows = table.nrows

                # 提取標簽,2019年的數據從第二行開始提取
                label = table.row_values(1)
                # 將需要的字段通過label提取出來
                item1 = label.index("部門名稱")
                item2 = label.index("招考職位")
                item3 = label.index("職位簡介")
                item4 = label.index("招考人數")
                item5 = label.index("專業")
                item6 = label.index("學歷")

                for nr in range(2, nrows):
                    item = [table.row_values(i)[item1], table.row_values(i)[item2], table.row_values(i)[item3],\
                            table.row_values(i)[item4], table.row_values(i)[item5], table.row_values(i)[item6]]
                    item.append(file_xlsx + sheets[nsht])
                    total.append(item)
                        
        else:      
            wb = xlrd.open_workbook(file_xlsx)
            sheets = wb.sheet_names()
            nsheets = len(sheets)

            for nsht in range(nsheets):
                table = wb.sheets()[nsht]
                nrows = table.nrows

                # 提取標簽,2018年的數據從第一行開始提取,2018的部門名稱叫做招錄機關
                label = table.row_values(0)
                # 將需要的字段通過label提取出來
                item1 = label.index("招錄機關")
                item2 = label.index("招考職位")
                item3 = label.index("職位簡介")
                item4 = label.index("招考人數")
                item5 = label.index("專業")
                item6 = label.index("學歷")

                for nr in range(1, nrows):
                    item = [table.row_values(i)[item1], table.row_values(i)[item2], table.row_values(i)[item3],\
                            table.row_values(i)[item4], table.row_values(i)[item5], table.row_values(i)[item6]]
                    item.append(file_xlsx + sheets[nsht])
                    total.append(item)

# 新建一個工作簿
workbook = xlsxwriter.Workbook("total_test.xlsx")
worksheet = workbook.add_worksheet()

for i in range(len(total)):
    for j in range(len(total[i])):
        worksheet.write(i, j, total[i][j])
workbook.close()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM