最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python之如何合并excel的多個(gè)sheet

 更新時(shí)間:2025年09月02日 11:00:20   作者:trayvontang  
文章介紹使用openpyxl和pandas處理Excel報(bào)表,前者需手動(dòng)合并邏輯,后者通過concat/append簡(jiǎn)化操作,強(qiáng)調(diào)data_only參數(shù)避免公式干擾,并可實(shí)現(xiàn)數(shù)據(jù)過濾、轉(zhuǎn)換等功能

簡(jiǎn)介

因?yàn)?,每天都?huì)有的大量excel報(bào)表匯總處理任務(wù),所以寫了一個(gè)腳本來(lái)處理。

就是找出每一個(gè)excel中特定的sheet,把這些sheet的特定列讀取出來(lái)合并到一個(gè)sheet中。

因?yàn)槊恳粋€(gè)sheet的數(shù)據(jù)都不太一樣,所以稍微麻煩一點(diǎn),下面使用openpyxl方式和pandas兩種方式來(lái)處理。

openpyxl方式

使用openpyxl方式要自己實(shí)現(xiàn)合并邏輯,要麻煩一些。

值得注意的是,在excel中可能有公式,讀取excel的時(shí)候可以使用下面的方式:

load_workbook(data_file_path, data_only=True)

使用data_only=True,就可以得到公式計(jì)算之后的值,而不是公式本身,因?yàn)楣奖旧砗喜⒃诹硪粋€(gè)sheet中,公式可能就無(wú)效,甚至不對(duì)了。

下面給一個(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)入臺(tái)賬\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ù)含義
objskist,Series、DataFrame、Panel
axis默認(rèn)為0,按行連接
joininner、outer,默認(rèn)為"outer"
keyslist,最外層構(gòu)建層次索引,如果為多索引,使用元組
levelslist,用于構(gòu)建MultiIndex的特定級(jí)別
nameslist,結(jié)果層次索引中的級(jí)別的名稱
copyboolean,默認(rèn)True。如果為False,請(qǐng)勿不必要地復(fù)制數(shù)據(jù)
join_axes將要廢棄,推薦在結(jié)果集上使用reindex
ignore_indexboolean,默認(rèn)False。如果為True,忽略索引
verify_integrityboolean,默認(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 = ['日期', '合同號(hào)', '城市', '姓名', '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實(shí)現(xiàn)快速多線程ping的方法

    Python實(shí)現(xiàn)快速多線程ping的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)快速多線程ping的方法,實(shí)例分析了Python多線程及ICMP數(shù)據(jù)包的發(fā)送技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Python利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作

    Python利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作

    Appium 是一個(gè)開源、跨平臺(tái)的自動(dòng)化測(cè)試工具,用于測(cè)試原生和輕量移動(dòng)應(yīng)用,支持 iOS, Android 和 FirefoxOS 平臺(tái)。本文將利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作,感興趣的可以了解一下
    2022-07-07
  • 關(guān)于Pandas的Series創(chuàng)建方式和常用屬性

    關(guān)于Pandas的Series創(chuàng)建方式和常用屬性

    這篇文章主要介紹了關(guān)于Pandas的Series創(chuàng)建方式和常用屬性,Series 數(shù)據(jù)結(jié)構(gòu)是用于儲(chǔ)存一個(gè)序列的一維數(shù)組,DataFrame 數(shù)據(jù)結(jié)構(gòu)是用于存儲(chǔ)復(fù)雜數(shù)據(jù)的二維數(shù)據(jù)結(jié)構(gòu),本文來(lái)詳細(xì)說(shuō)明一下
    2023-07-07
  • python實(shí)現(xiàn)rsa加密實(shí)例詳解

    python實(shí)現(xiàn)rsa加密實(shí)例詳解

    這篇文章主要介紹了python實(shí)現(xiàn)rsa加密實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • PyQt5簡(jiǎn)單讀取以及顯示圖片的應(yīng)用實(shí)例

    PyQt5簡(jiǎn)單讀取以及顯示圖片的應(yīng)用實(shí)例

    我們?cè)谶M(jìn)行圖像處理時(shí),經(jīng)常會(huì)用到讀取圖片并顯示出來(lái)這樣的操作,下面這篇文章主要給大家介紹了關(guān)于PyQt5簡(jiǎn)單讀取以及顯示圖片應(yīng)用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 在python 中實(shí)現(xiàn)運(yùn)行多條shell命令

    在python 中實(shí)現(xiàn)運(yùn)行多條shell命令

    今天小編就為大家分享一篇在python 中實(shí)現(xiàn)運(yùn)行多條shell命令,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-01-01
  • Python 備份程序代碼實(shí)現(xiàn)

    Python 備份程序代碼實(shí)現(xiàn)

    這篇文章主要介紹了Python 備份程序代碼實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Python報(bào)錯(cuò)TypeError: object of type ‘generator‘ has no len ()的解決方法

    Python報(bào)錯(cuò)TypeError: object of type ‘gener

    在Python開發(fā)的復(fù)雜世界中,報(bào)錯(cuò)信息就像神秘的謎題,困擾著開發(fā)者和環(huán)境配置者,其中,TypeError: object of type ‘generator’ has no len()這個(gè)報(bào)錯(cuò),常常在不經(jīng)意間打亂我們的開發(fā)節(jié)奏,本文讓我們一起深入探究這個(gè)報(bào)錯(cuò)問題,為Python開發(fā)之路掃除障礙
    2024-10-10
  • Python+OpenCV實(shí)現(xiàn)角度測(cè)量的示例代碼

    Python+OpenCV實(shí)現(xiàn)角度測(cè)量的示例代碼

    本文介紹如何使用python語(yǔ)言實(shí)現(xiàn)角度測(cè)量,程序包括鼠標(biāo)選點(diǎn)、直線斜率計(jì)算、角度計(jì)算三個(gè)子程序和一個(gè)主程序,感興趣的可以了解一下
    2022-03-03
  • pytorch深度神經(jīng)網(wǎng)絡(luò)入門準(zhǔn)備自己的圖片數(shù)據(jù)

    pytorch深度神經(jīng)網(wǎng)絡(luò)入門準(zhǔn)備自己的圖片數(shù)據(jù)

    這篇文章主要為大家介紹了pytorch深度神經(jīng)網(wǎng)絡(luò)入門準(zhǔn)備自己的圖片數(shù)據(jù)示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論

乐都县| 沧州市| 内丘县| 慈利县| 永川市| 金湖县| 河池市| 桂平市| 蒲城县| 平凉市| 米脂县| 孟村| 霸州市| 和静县| 盐边县| 浮山县| 湖州市| 黔南| 凤阳县| 康保县| 扎鲁特旗| 嘉义县| 海阳市| 宁都县| 南康市| 汝城县| 长宁县| 荣成市| 即墨市| 和硕县| 济宁市| 信丰县| 桂东县| 民勤县| 陆良县| 汝城县| 栾城县| 霍城县| 高青县| 大渡口区| 通道|