python之如何合并excel的多個(gè)sheet
簡介
因?yàn)椋刻於紩械拇罅縠xcel報(bào)表匯總處理任務(wù),所以寫了一個(gè)腳本來處理。
就是找出每一個(gè)excel中特定的sheet,把這些sheet的特定列讀取出來合并到一個(gè)sheet中。
因?yàn)槊恳粋€(gè)sheet的數(shù)據(jù)都不太一樣,所以稍微麻煩一點(diǎn),下面使用openpyxl方式和pandas兩種方式來處理。
openpyxl方式
使用openpyxl方式要自己實(shí)現(xiàn)合并邏輯,要麻煩一些。
值得注意的是,在excel中可能有公式,讀取excel的時(shí)候可以使用下面的方式:
load_workbook(data_file_path, data_only=True)
使用data_only=True,就可以得到公式計(jì)算之后的值,而不是公式本身,因?yàn)楣奖旧砗喜⒃诹硪粋€(gè)sheet中,公式可能就無效,甚至不對了。
下面給一個(gè)示例代碼,僅供參考:
"""
pip install openpyxl
"""
from openpyxl import load_workbook
from openpyxl import Workbook
import os
import re
# 模板文件
TEMPLATE_FILE = r'H:\合并\合并模板.xlsx'
# 合并結(jié)果文件
RESULT_FILE = r'H:\合并\結(jié)果.xlsx'
# 數(shù)據(jù)文件目錄
DATA_ROOT_DIR = r"H:\合并"
# 文件名稱正則
DATA_FILE_REG = r"(.*?)-合同導(dǎo)入臺賬\d{8}.xlsx"
# 獲取要處理的文件
def get_deal_file_map():
file_sn_map = {}
fs = os.listdir(DATA_ROOT_DIR)
for f in fs:
match = re.match(DATA_FILE_REG, f)
if match:
city = match.group(1)
sn = 2
if city == '成都':
sn = 4
elif city == '杭州':
sn = 3
file_sn_map[os.path.join(DATA_ROOT_DIR, f)] = sn
return file_sn_map
# 規(guī)范化列名
def get_normal_column_name(origin_col_name):
if origin_col_name:
start = origin_col_name.find("(")
if start == -1:
return origin_col_name.strip()
else:
return origin_col_name[0:start].strip()
# 獲取列名與列坐標(biāo)的映射
def get_col_name_coordinate_map(sheet_row):
name_coor_map = {}
for cell in sheet_row:
# name_coor_map[get_normal_column_name(cell.value)] = cell.column_letter
name_coor_map[get_normal_column_name(cell.value)] = cell.column
return name_coor_map
# 獲取模板文件的列名與列坐標(biāo)映射
def get_template_name_coordinate_map(template_file_path):
template_wbook = load_workbook(template_file_path)
table = template_wbook[template_wbook.sheetnames[0]]
row = table[1:1]
return get_col_name_coordinate_map(row)
def deal_data_content():
"""
合并文件內(nèi)容
"""
dfile_sn_map = get_deal_file_map()
save_book = Workbook()
wsheet = save_book.active
wsheet.title = 'merge-data'
tmp_col_coor_map = get_template_name_coordinate_map(TEMPLATE_FILE)
wsheet.append(list(tmp_col_coor_map.keys()))
line = 2
for data_file_path in dfile_sn_map.keys():
sheet_num = dfile_sn_map[data_file_path]
wbook = load_workbook(data_file_path, data_only=True)
names = wbook.sheetnames
for i in range(0, sheet_num):
table = wbook[names[i]]
row = table[1:1]
data_col_coor_map = get_col_name_coordinate_map(row)
use_col = data_col_coor_map.keys() & tmp_col_coor_map.keys()
for row in table.iter_rows(min_row=2, values_only=True):
rcol_index = data_col_coor_map['城市']
city = row[rcol_index - 1]
if (city is None) or len(city.strip()) == 0:
continue
for col_name in use_col:
rcol_index = data_col_coor_map[col_name]
wcol_index = tmp_col_coor_map[col_name]
wsheet.cell(line, wcol_index, row[rcol_index - 1])
line += 1
save_book.save(RESULT_FILE)
if __name__ == '__main__':
deal_data_content()
pandas方式
相比于直接使用openpyxl的方式,使用pandas就方便多了,直接使用concat方法就可以了。
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None,verify_integrity=False,copy=True)
參數(shù)含義
| 參數(shù) | 含義 |
|---|---|
| objs | kist,Series、DataFrame、Panel |
| axis | 默認(rèn)為0,按行連接 |
| join | inner、outer,默認(rèn)為"outer" |
| keys | list,最外層構(gòu)建層次索引,如果為多索引,使用元組 |
| levels | list,用于構(gòu)建MultiIndex的特定級別 |
| names | list,結(jié)果層次索引中的級別的名稱 |
| copy | boolean,默認(rèn)True。如果為False,請勿不必要地復(fù)制數(shù)據(jù) |
| join_axes | 將要廢棄,推薦在結(jié)果集上使用reindex |
| ignore_index | boolean,默認(rèn)False。如果為True,忽略索引 |
| verify_integrity | boolean,默認(rèn)False。檢查新連接的軸是否包含重復(fù)項(xiàng) |
下面直接看示例:
# coding:utf-8 import pandas as pd # 讀取指定文件的指定sheet df1 = pd.read_excel(r'H:\merge\cd-contract-charge-1-20200807.xlsx', header=0, sheet_name=0) df2 = pd.read_excel(r'H:\merge\cd-contract-charge-2-20200807.xlsx', header=0, sheet_name=1) df3 = pd.read_excel(r'H:\merge\cd-contract-charge-3-20200807.xlsx', header=0, sheet_name=2) df4 = pd.read_excel(r'H:\merge\hz-contract-charge-1-20200807.xlsx', header=0, sheet_name=0) df5 = pd.read_excel(r'H:\merge\hz-contract-charge-2-20200807.xlsx', header=0, sheet_name=1) # 按行拼接 data = pd.concat([df1, df2, df3, df4, df5], sort=False, ignore_index=True) # 選擇需要的列 header = ['日期', '合同號', '城市', '姓名', 'charge'] data = data.loc[:, header] # 將結(jié)果寫到值得excel文件 data.to_excel(r'H:\merge\result.xlsx', index=False)
主要是讀取excel文件,關(guān)于pandas文件讀寫,可以參考:pandas讀寫文件
除了使用concat方法,還可以使用append方法,append方式是一個(gè)特殊的concat方法,就是concat的參數(shù)axis=0的情況,也是concat方法的axis的默認(rèn)值。
既然使用了pandas,當(dāng)然也可以順便完成一些數(shù)據(jù)過濾、填充、轉(zhuǎn)換之類的操作。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python基于select實(shí)現(xiàn)的socket服務(wù)器
這篇文章主要介紹了Python基于select實(shí)現(xiàn)的socket服務(wù)器,實(shí)例分析了Python基于select與socket模塊實(shí)現(xiàn)socket通信的相關(guān)技巧,需要的朋友可以參考下2016-04-04
Django 路由層URLconf的實(shí)現(xiàn)
這篇文章主要介紹了Django 路由層URLconf的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
python爬蟲實(shí)戰(zhàn)之最簡單的網(wǎng)頁爬蟲教程
在我們?nèi)粘I暇W(wǎng)瀏覽網(wǎng)頁的時(shí)候,經(jīng)常會看到一些好看的圖片,我們就希望把這些圖片保存下載,或者用戶用來做桌面壁紙,或者用來做設(shè)計(jì)的素材。下面這篇文章就來給大家介紹了關(guān)于利用python實(shí)現(xiàn)最簡單的網(wǎng)頁爬蟲的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08
opencv python 圖片讀取與顯示圖片窗口未響應(yīng)問題的解決
這篇文章主要介紹了opencv python 圖片讀取與顯示圖片窗口未響應(yīng)問題的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python中海象運(yùn)算符:=的實(shí)現(xiàn)
海象運(yùn)算符(:=)是Python3.8引入的新特性,用于在表達(dá)式中同時(shí)完成賦值和返回值操作,本文就來介紹一下Python中海象運(yùn)算符:=的實(shí)現(xiàn),感興趣的可以了解一下2025-02-02
用Python畫一個(gè)LinkinPark的logo代碼實(shí)例
這篇文章主要介紹了用Python畫一個(gè)LinkinPark的logo代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
python實(shí)現(xiàn)從ftp服務(wù)器下載文件的方法
這篇文章主要介紹了python實(shí)現(xiàn)從ftp服務(wù)器下載文件的方法,涉及Python操作FTP的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04

