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

Python實現(xiàn)Excel多表合并與自動化報表生成

 更新時間:2026年04月29日 08:23:03   作者:小莊-Python辦公  
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)Excel多表合并與自動化報表生成,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下

案例背景與需求分析

場景說明:你是一名數(shù)據(jù)運營,每個月各個城市的分公司都會給你發(fā)一份當(dāng)月的銷售明細表,放在 sales_reports 文件夾下。

文件命名規(guī)則如:北京_202310.xlsx上海_202310.xlsx,廣州_202310.xlsx 等等。可能多達幾十個文件。

你的老板提出了以下需求:

  1. 把這個文件夾里所有的 Excel 數(shù)據(jù)合并成一張大表。
  2. 清洗數(shù)據(jù):剔除“銷售額”為空的無效記錄。
  3. 統(tǒng)計出各個城市的總銷售額和訂單數(shù)量。
  4. 將合并后的明細和統(tǒng)計結(jié)果導(dǎo)出到一個新的 Excel 中。
  5. (加分項)把統(tǒng)計結(jié)果的表頭加粗,背景標(biāo)黃。

如果手動操作,打開幾十個文件復(fù)制粘貼極易出錯,而且每個月都要重復(fù)勞動?,F(xiàn)在,我們用Python一鍵搞定!

核心模塊引入

除了 pandasopenpyxl,我們還需要用到 Python 的內(nèi)置庫 osglob,它們擅長處理文件和路徑。

import os
import glob
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill

第一步:批量讀取與合并數(shù)據(jù)

# 1. 定義文件夾路徑
folder_path = "sales_reports"

# 2. 使用 glob 匹配文件夾下所有的 .xlsx 文件
# 假設(shè)當(dāng)前目錄下有 sales_reports 文件夾
file_paths = glob.glob(os.path.join(folder_path, "*.xlsx"))

# 用于存放每個讀取出來的 DataFrame
df_list = []

print("開始批量讀取文件...")
for file in file_paths:
    print(f"正在讀取: {file}")
    # 讀取 Excel
    temp_df = pd.read_excel(file)
    
    # 【小技巧】可以從文件名中提取城市名,作為新的一列加上去
    # 比如從 "sales_reports\北京_202310.xlsx" 中提取 "北京"
    basename = os.path.basename(file) # 獲取文件名: 北京_202310.xlsx
    city_name = basename.split("_")[0] # 以下劃線分割,取第一部分: 北京
    temp_df["文件來源城市"] = city_name 
    
    df_list.append(temp_df)

# 3. 使用 concat 將所有數(shù)據(jù)上下拼接合并
master_df = pd.concat(df_list, ignore_index=True)
print(f"合并完成,共計 {len(master_df)} 條數(shù)據(jù)。")

第二步:數(shù)據(jù)清洗與統(tǒng)計分析

# 1. 數(shù)據(jù)清洗:剔除銷售額為空的行
master_df.dropna(subset=["銷售額"], inplace=True)

# 2. 統(tǒng)計分析:按“文件來源城市”分組,計算總銷售額和訂單數(shù)
summary_df = master_df.groupby("文件來源城市").agg({
    "銷售額": "sum",
    "訂單號": "count" # 假設(shè)原始表有訂單號這一列,計數(shù)即可代表訂單數(shù)量
}).reset_index()

summary_df.rename(columns={"訂單號": "訂單總數(shù)", "銷售額": "總銷售額"}, inplace=True)

第三步:導(dǎo)出數(shù)據(jù)并使用 openpyxl 調(diào)整格式

為了同時寫入多個Sheet并進行格式美化,我們分兩步走:先用 pandas 保存基礎(chǔ)數(shù)據(jù),再用 openpyxl 打開進行格式渲染。

output_file = "月度匯總報告.xlsx"

# 1. pandas 寫入數(shù)據(jù)
with pd.ExcelWriter(output_file) as writer:
    summary_df.to_excel(writer, sheet_name="城市匯總", index=False)
    master_df.to_excel(writer, sheet_name="所有明細", index=False)

# 2. openpyxl 修改格式
wb = load_workbook(output_file)
ws_summary = wb["城市匯總"]

# 定義樣式:加粗,黃色背景
header_font = Font(bold=True)
header_fill = PatternFill(fill_type="solid", start_color="FFFF00")

# 遍歷第一行(表頭),設(shè)置樣式
for cell in ws_summary[1]:
    cell.font = header_font
    cell.fill = header_fill

# 調(diào)整列寬使數(shù)據(jù)顯示更完整
ws_summary.column_dimensions['A'].width = 15
ws_summary.column_dimensions['B'].width = 15
ws_summary.column_dimensions['C'].width = 15

# 保存最終結(jié)果
wb.save(output_file)
print("自動化報表生成完畢,格式已美化!")

方法補充

使用 Python 將 Excel 多表合并并生成自動化報表,主要分為四個階段:批量讀取 → 數(shù)據(jù)合并 → 數(shù)據(jù)清洗 → 報表生成與樣式美化。

核心合并函數(shù):concat 與 merge

在具體實現(xiàn)前,先快速了解 pandas 中兩個核心合并函數(shù)的區(qū)別:

函數(shù)用途適用場景
pd.concat()垂直拼接(行追加)或水平拼接,把多個框架按軸堆疊在一起多份格式相同的 Excel 文件需要上下拼接成大表(最常用
pd.merge()類似 SQL 的 JOIN,基于共同列進行數(shù)據(jù)關(guān)聯(lián)兩個表需要根據(jù)某一列(如用戶ID)進行左右匹配

對于大多數(shù)日常場景(合并同結(jié)構(gòu)的多份報表),pd.concat() 是首選。

批量讀取與垂直合并

基礎(chǔ)版:合并多個同結(jié)構(gòu) Excel 文件

import pandas as pd
from pathlib import Path
folder_path = "./sales_reports"
# 用 Path.glob 批量獲取所有 xlsx 文件
files = list(Path(folder_path).glob("*.xlsx"))
# 收集所有 DataFrame 到列表
dataframes = []
for file in files:
    df = pd.read_excel(file)
    # 【可選】從文件名提取標(biāo)識列,如月份/城市
    df["來源文件"] = file.stem   # 提取文件名不含擴展名
    dataframes.append(df)
# 一次性垂直合并,性能遠優(yōu)于逐行 append
merged = pd.concat(dataframes, ignore_index=True, sort=False)
# 保存結(jié)果
merged.to_excel("合并結(jié)果.xlsx", index=False)

進階版:兼容多場景的成熟方案

在實際生產(chǎn)中,直接逐文件讀取有兩個隱患:

  • 丟數(shù)據(jù)風(fēng)險pd.concat(dataframes, ignore_index=True) 是標(biāo)準(zhǔn)做法。必須注意如果你用老寫的 df_total = df_total.append(df),新版本 pandas 會警告性能問題。
  • 格式不統(tǒng)一:需要提前處理數(shù)據(jù)類型、排除損壞文件:

以下是帶進度監(jiān)控和錯誤容錯的生產(chǎn)級腳本:

import pandas as pd
from pathlib import Path
from tqdm import tqdm   # pip install tqdm

def merge_excels(folder_path, output_name="merged_output.xlsx"):
    print(f"正在掃描: {folder_path}")
    files = list(Path(folder_path).rglob("*.xlsx"))  # 遞歸查找子文件夾中的文件
    if not files:
        print("未找到 Excel 文件")
        return

    print(f"發(fā)現(xiàn) {len(files)} 個文件")
    all_data = []
    error_files = []

    for file in tqdm(files, desc="處理進度"):
        try:
            df = pd.read_excel(file, dtype=str)       # 統(tǒng)一先按字符串讀取,避免類型沖突
            all_data.append(df)
        except Exception as e:
            error_files.append((file.name, str(e)))  # 記錄錯誤文件

    if not all_data:
        print("沒有成功讀取任何文件")
        return

    # 一次性合并
    merged = pd.concat(all_data, ignore_index=True, sort=False)
    merged.to_excel(output_name, index=False)

    print(f"合并完成!共 {len(merged)} 行。")
    if error_files:
        print(f"警告:{len(error_files)} 個文件讀取失敗")

同工作簿內(nèi)多 Sheet 合并

import pandas as pd

file_path = "同一個工作簿.xlsx"
sheets = pd.read_excel(file_path, sheet_name=None)   # sheet_name=None 讀取所有 sheet

all_dfs = []
for sheet_name, df in sheets.items():
    all_dfs.append(df)

result = pd.concat(all_dfs, ignore_index=True)
result.to_excel("合并后.xlsx", index=False)

數(shù)據(jù)清洗與預(yù)處理

從不同來源合并的數(shù)據(jù)通常很“臟”,必需先做四大基本清洗才能保證報表質(zhì)量。

清洗任務(wù)常用代碼注意事項
去重df.drop_duplicates(inplace=True)默認(rèn)整行判斷為重復(fù)才刪除;可用 subset=["列名"] 指定列去重
刪除缺行df.dropna(subset=["關(guān)鍵列"])不強刪全局,只刪某列缺失的行;若某列如手機號為空的確實可刪除
填充缺值df["列"].fillna(value)數(shù)字類用 0 或均值,分類用 "未知"「保持?jǐn)?shù)據(jù)量」——切勿隨意刪掉太多行,會使統(tǒng)計基數(shù)錯位
類型糾正df["日期"] = pd.to_datetime(df["日期"], errors="coerce") + 清理非標(biāo)準(zhǔn)條目先轉(zhuǎn) datetime 能自動將非法日期轉(zhuǎn)成 NaT;再檢測是否為 NaT,把明顯錯誤的行剔除,統(tǒng)一日期格式

【注意】所有清洗必須按去重 → 填缺 → 修類型 → 刪不可用行的順序:刪完重復(fù)和空字段后再修正類型最省事。

水平關(guān)聯(lián)合并

在合并“不同維度的信息”(例如銷售明細 + 城市信息)時,使用 pd.merge()

# 左表:明細表,右表:城市分類映射表
merged_df = pd.merge(sales_detail, city_mapping, on="城市", how="left")

how 參數(shù)選擇:

  • inner:兩張表都匹配的記錄才保留
  • left:以左表為主,右表匹配不到的顯示 NaN
  • outer:保留所有記錄(少用)

自動生成匯總與透 視表

# 1. 分組匯總
summary = merged.groupby("城市")["銷售額"].agg(["sum", "mean", "count"]).reset_index()

# 2. 數(shù)據(jù)透視表
pivot = pd.pivot_table(merged, values="銷售額", index="城市", columns="季度", aggfunc="sum", fill_value=0)

導(dǎo)出與樣式美化(pandas + openpyxl 兩步走)

df.to_excel() 能保存數(shù)據(jù),但導(dǎo)出的格式存在明顯的樣式缺陷:

問題現(xiàn)象原因
格式丟失列寬顯示異常、日期顯示為數(shù)字、長文本被截斷to_excel 不保留原表任何樣式
索引誤寫第一列出現(xiàn) 0, 1, 2...(當(dāng)成真實數(shù)據(jù)列)忘記使用 index=False

推薦做法:用 pandas 寫數(shù)據(jù),再用 openpyxl 加格式。

寫入數(shù)據(jù)(pandas)

with pd.ExcelWriter("報表.xlsx") as writer:
    merged.to_excel(writer, sheet_name="明細", index=False)
    summary.to_excel(writer, sheet_name="匯總", index=False)

美化格式(openpyxl)

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill

wb = load_workbook("報表.xlsx")
ws = wb["匯總"]   # 或 "明細"

# 設(shè)置表頭樣式:加粗 + 黃色背景
header_font = Font(bold=True)
header_fill = PatternFill(fill_type="solid", start_color="FFFF00")  # 黃色

for cell in ws[1]:   # 第一行是表頭
    cell.font = header_font
    cell.fill = header_fill

# 調(diào)整列寬
for col in ws.columns:
    max_length = 0
    col_letter = col[0].column_letter
    for cell in col:
        try:
            if len(str(cell.value)) > max_length:
                max_length = len(str(cell.value))
        except:
            pass
    adjusted_width = min(max_length + 2, 30)
    ws.column_dimensions[col_letter].width = adjusted_width

wb.save("報表_美化.xlsx")

總結(jié)

至此,我們的《Python辦公Excel處理》五節(jié)課就全部結(jié)束了!回顧一下我們走過的路:

  1. 搭建了Python與自動化辦公環(huán)境。
  2. 學(xué)會了用 openpyxl 精細化控制Excel單元格的讀寫與外觀格式。
  3. 掌握了 pandas 進行單表的極速讀取、條件篩選與排序。
  4. 進階學(xué)習(xí)了 pandas 的多表關(guān)聯(lián)、合并以及強大的數(shù)據(jù)透 視表。
  5. 最終完成了包含批量文件讀取、數(shù)據(jù)清洗、分組統(tǒng)計、多表頁導(dǎo)出及自動化排版的終極實戰(zhàn)案例。

只要你能把本課程的代碼保存下來作為“模板”,在未來的工作中遇到類似需求時稍微修改一下字段名,就能幫你節(jié)省成百上千個小時的加班時間。

到此這篇關(guān)于Python實現(xiàn)Excel多表合并與自動化報表生成的文章就介紹到這了,更多相關(guān)Python Excel自動化生成報表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 動態(tài)變量名定義與調(diào)用方法

    Python 動態(tài)變量名定義與調(diào)用方法

    這篇文章主要介紹了Python 動態(tài)變量名定義與調(diào)用方法,需要的朋友可以參考下
    2020-02-02
  • 關(guān)于Python 列表的索引取值問題

    關(guān)于Python 列表的索引取值問題

    這篇文章主要介紹了Python 列表的索引取值,本節(jié)重點掌握多次索引取值的語法:列表[索引][索引],結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Pytorch?和?Tensorflow?v1?兼容的環(huán)境搭建方法

    Pytorch?和?Tensorflow?v1?兼容的環(huán)境搭建方法

    這篇文章主要介紹了搭建Pytorch?和?Tensorflow?v1?兼容的環(huán)境,本文是小編經(jīng)過多次實踐得到的環(huán)境配置教程,給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • keras中的loss、optimizer、metrics用法

    keras中的loss、optimizer、metrics用法

    這篇文章主要介紹了keras中的loss、optimizer、metrics用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python3如何將docx轉(zhuǎn)換成pdf文件

    python3如何將docx轉(zhuǎn)換成pdf文件

    這篇文章主要為大家詳細介紹了python3如何將docx轉(zhuǎn)換成pdf文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python在字典中查找元素的3種方式

    Python在字典中查找元素的3種方式

    這篇文章主要介紹了Python在字典中查找元素的3種方式,字典是另一種可變?nèi)萜髂P?且可存儲任意類型對象,需要的朋友可以參考下
    2023-04-04
  • python去除字符串中的空格、特殊字符和指定字符的三種方法

    python去除字符串中的空格、特殊字符和指定字符的三種方法

    本文主要介紹了python去除字符串中的空格、特殊字符和指定字符的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python編程實現(xiàn)控制cmd命令行顯示顏色的方法示例

    Python編程實現(xiàn)控制cmd命令行顯示顏色的方法示例

    這篇文章主要介紹了Python編程實現(xiàn)控制cmd命令行顯示顏色的方法,結(jié)合實例形式分析了Python針對命令行字符串顯示顏色屬性相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Python中強大的函數(shù)map?filter?reduce使用詳解

    Python中強大的函數(shù)map?filter?reduce使用詳解

    Python是一門功能豐富的編程語言,提供了許多內(nèi)置函數(shù),以簡化各種編程任務(wù),在Python中,map(),filter()和reduce()是一組非常有用的函數(shù),它們允許對可迭代對象進行操作,從而實現(xiàn)數(shù)據(jù)轉(zhuǎn)換、篩選和累積等操作,本文將詳細介紹這三個函數(shù),包括它們的基本用法和示例代碼
    2023-11-11
  • 詳解Python中的數(shù)據(jù)清洗工具flashtext

    詳解Python中的數(shù)據(jù)清洗工具flashtext

    FlashText是GitHub上的一個開源Python庫,正如之前所提到的,它在提取關(guān)鍵字和替換關(guān)鍵字任務(wù)上有著極高的性能。本文將詳解一下flashtext的使用,需要的可以參考一下
    2022-06-06

最新評論

绩溪县| 钟祥市| 喜德县| 安岳县| 勐海县| 抚松县| 浮山县| 颍上县| 伊宁县| 乃东县| 彰化市| 大荔县| 顺昌县| 潮州市| 靖江市| 锦屏县| 游戏| 西充县| 民和| 长泰县| 南京市| 龙胜| 略阳县| 文山县| 金门县| 东辽县| 西安市| 云阳县| 长宁区| 贵港市| 沐川县| 上高县| 乃东县| 营山县| 崇义县| 巫山县| 高要市| 海淀区| 承德县| 漠河县| 临清市|