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()