Python實(shí)現(xiàn)在多個(gè)Excel工作簿中批量新增指定工作表
1. 問(wèn)題背景:為什么要批量新增工作表
本文主題是 在多個(gè)工作簿中批量新增工作表。這個(gè)場(chǎng)景看起來(lái)不復(fù)雜,但它其實(shí)已經(jīng)非常接近真實(shí)辦公自動(dòng)化需求:不是處理一個(gè) Excel,而是對(duì)一個(gè)文件夾里的多個(gè) Excel 統(tǒng)一執(zhí)行同一類操作。
前面我們已經(jīng)接觸過(guò)批量重命名文件、批量修改工作表名稱等操作。這一節(jié)再往前走一步:給多個(gè)工作簿統(tǒng)一新增一張指定名稱的工作表,例如 匯總、備注、參數(shù)說(shuō)明。這類需求在項(xiàng)目資料整理、財(cái)務(wù)報(bào)表標(biāo)準(zhǔn)化、資產(chǎn)盤點(diǎn)數(shù)據(jù)匯總里都很常見(jiàn)。
這張圖展示的是本文的核心目標(biāo):通過(guò) Python 自動(dòng)處理多個(gè) Excel 工作簿,并批量新增指定工作表。

從圖中可以看出,重點(diǎn)不是“給某一個(gè) Excel 加一張表”,而是把一個(gè)文件夾里的多個(gè)工作簿都納入處理范圍。 這就是批處理和手工操作的本質(zhì)區(qū)別:手工關(guān)注單個(gè)文件,腳本關(guān)注一批文件。
這里最容易犯的錯(cuò)誤,是直接對(duì)所有工作簿無(wú)腦執(zhí)行新增操作。如果某些工作簿里已經(jīng)有同名工作表,腳本就可能報(bào)錯(cuò),甚至中斷后續(xù)處理。因此,本案例真正要掌握的不是 add() 這一個(gè)動(dòng)作,而是新增之前的 存在性判斷。
2. 應(yīng)用場(chǎng)景:這類需求在辦公中很常見(jiàn)
很多 Excel 自動(dòng)化需求,本質(zhì)上不是“復(fù)雜計(jì)算”,而是“統(tǒng)一結(jié)構(gòu)”。比如多個(gè)部門上報(bào)的數(shù)據(jù)文件格式不完全一致,后續(xù)匯總時(shí)很麻煩;或者每個(gè)項(xiàng)目資料包都需要增加一張說(shuō)明頁(yè),靠人工一個(gè)個(gè)打開(kāi)文件添加就很低效。
這張圖展示的是批量新增工作表的典型應(yīng)用場(chǎng)景:在多個(gè)工作簿中統(tǒng)一新增 匯總、備注、參數(shù)說(shuō)明 等工作表。

從圖中能看出,這個(gè)案例不是為了“新增一張空白 sheet”這么簡(jiǎn)單,而是為了讓多個(gè) Excel 文件具備統(tǒng)一結(jié)構(gòu)。比如新增 匯總 表便于后續(xù)數(shù)據(jù)校驗(yàn),新增 備注 表便于記錄人工說(shuō)明,新增 參數(shù)說(shuō)明 表便于統(tǒng)一管理模板規(guī)則。
推薦做法是先明確新增工作表的業(yè)務(wù)目的,再寫腳本。如果只是機(jī)械新增一張表,后續(xù)可能沒(méi)人用;但如果它承擔(dān)匯總、說(shuō)明、校驗(yàn)、參數(shù)管理等功能,這張工作表就有實(shí)際價(jià)值。
我在實(shí)際理解這個(gè)案例時(shí),會(huì)把它拆成三個(gè)層級(jí):第一,文件層面要遍歷多個(gè)工作簿;第二,工作簿層面要讀取已有工作表名稱;第三,判斷層面要確認(rèn)目標(biāo)工作表是否已經(jīng)存在。
3. 核心原理:先判斷,再新增
這個(gè)案例最關(guān)鍵的技術(shù)點(diǎn)是 存在性判斷。因?yàn)?Excel 同一個(gè)工作簿內(nèi)不允許存在兩個(gè)完全相同名稱的工作表。如果目標(biāo)工作表已經(jīng)存在,你還繼續(xù)新增同名工作表,就容易報(bào)錯(cuò)。
這張圖展示的是本案例的核心邏輯:先讀取當(dāng)前工作簿所有工作表名,再判斷目標(biāo)工作表是否存在,不存在才新增。

從圖中可以看到,判斷邏輯非常明確:先拿到當(dāng)前工作簿的全部 sheet 名稱列表,然后判斷 sheet_name not in sheet_names 是否成立。如果成立,說(shuō)明目標(biāo)工作表不存在,可以新增;如果不成立,說(shuō)明已經(jīng)存在,就應(yīng)該跳過(guò)。
這一步的本質(zhì)不是語(yǔ)法技巧,而是批處理安全機(jī)制。批量腳本最怕的是把同一個(gè)動(dòng)作重復(fù)執(zhí)行到不該執(zhí)行的文件上,所以任何可能重復(fù)、覆蓋、刪除、改名的操作,都應(yīng)該先判斷,再執(zhí)行。
核心代碼其實(shí)就兩步:
sheet_names = [j.name for j in wb.sheets]
if sheet_name not in sheet_names:
wb.sheets.add(sheet_name)
第一句使用了列表推導(dǎo)式,它會(huì)遍歷當(dāng)前工作簿中的所有工作表對(duì)象,并把每張表的名稱取出來(lái),最終形成一個(gè)列表。比如當(dāng)前工作簿里有 數(shù)據(jù)、明細(xì)、分析 三張表,那么最終得到的列表大概就是:
["數(shù)據(jù)", "明細(xì)", "分析"]
第二句使用 not in 做成員判斷。也就是說(shuō),如果目標(biāo)工作表名稱不在已有工作表名稱列表中,就新增;如果已經(jīng)在列表里,就不新增。
不要小看這個(gè)判斷。沒(méi)有它,腳本可能在第一個(gè)已存在同名工作表的文件上就報(bào)錯(cuò),后面的文件全部無(wú)法繼續(xù)處理。加上它,腳本就能穩(wěn)定區(qū)分“需要處理”和“無(wú)需處理”的文件。
4. 實(shí)現(xiàn)代碼:批量新增指定工作表
下面這段代碼是一個(gè)相對(duì)完整的版本。它會(huì)遍歷指定文件夾中的 Excel 文件,打開(kāi)每個(gè)工作簿,檢查是否已經(jīng)存在目標(biāo)工作表,如果不存在則新增并保存。
import os
import xlwings as xw
folder_path = r"e:\file" # Excel 文件所在文件夾
sheet_name = "匯總" # 想要新增的工作表名稱
app = xw.App(visible=False, add_book=False)
try:
for file in os.listdir(folder_path):
# 跳過(guò) Excel 臨時(shí)文件
if file.startswith("~$"):
continue
# 只處理常見(jiàn) Excel 文件
if not file.lower().endswith((".xlsx", ".xls", ".xlsm")):
continue
full_path = os.path.join(folder_path, file)
wb = app.books.open(full_path)
# 獲取當(dāng)前工作簿中已有的所有工作表名稱
sheet_names = [j.name for j in wb.sheets]
# 不存在才新增
if sheet_name not in sheet_names:
wb.sheets.add(sheet_name)
wb.save()
print(f"已新增:{file} -> [{sheet_name}]")
else:
print(f"已存在:{file} -> [{sheet_name}],跳過(guò)")
wb.close()
finally:
app.quit()
這段代碼有幾個(gè)關(guān)鍵點(diǎn)。第一,使用 os.listdir() 遍歷文件夾;第二,跳過(guò) ~$ 開(kāi)頭的 Excel 臨時(shí)文件;第三,只處理 .xlsx、.xls、.xlsm 這幾類文件;第四,通過(guò) sheet_names 判斷目標(biāo)工作表是否存在。
推薦保留打印日志。批量處理時(shí)不要只讓腳本靜默運(yùn)行,否則處理了哪些文件、跳過(guò)了哪些文件,很難復(fù)盤。哪怕只是簡(jiǎn)單的 print(),也能幫助我們快速判斷腳本執(zhí)行情況。
另外,app = xw.App(visible=False, add_book=False) 表示后臺(tái)啟動(dòng) Excel,不顯示界面,也不額外新建空白工作簿。這樣批量處理時(shí)會(huì)更干凈一些。
但要注意,使用 xlwings 通常依賴本機(jī)安裝的 Excel 環(huán)境。如果電腦上沒(méi)有 Excel,或者 Excel 被彈窗、加載項(xiàng)、權(quán)限問(wèn)題卡住,腳本可能會(huì)異常。這類問(wèn)題不是 Python 語(yǔ)法問(wèn)題,而是 Excel 應(yīng)用環(huán)境問(wèn)題。
5. 循環(huán)控制:continue 與 break 怎么理解
批量腳本一定繞不開(kāi)循環(huán)。很多人寫循環(huán)時(shí)最容易混淆兩個(gè)關(guān)鍵字:continue 和 break。它們都能改變循環(huán)流程,但作用完全不同。
這張圖展示的是批量處理文件時(shí)的循環(huán)控制邏輯:遇到臨時(shí)文件用 continue 跳過(guò)當(dāng)前文件;在工作簿內(nèi)部找到目標(biāo)工作表后,可以用 break 結(jié)束當(dāng)前查找。

從圖中可以看出,continue 更適合用在外層文件循環(huán)里,它的意思是“當(dāng)前這個(gè)文件不處理了,繼續(xù)處理下一個(gè)文件”。比如遇到 ~$ 開(kāi)頭的臨時(shí)文件,就應(yīng)該直接跳過(guò)。
if file.startswith("~$"):
continue
而 break 更適合用在某些查找場(chǎng)景里。比如你在一個(gè)工作簿的多張工作表中查找目標(biāo) sheet,找到以后就不需要繼續(xù)遍歷當(dāng)前工作簿里的其他 sheet 了,這時(shí)可以用 break 結(jié)束當(dāng)前這層循環(huán)。
簡(jiǎn)單區(qū)分就是:continue 是跳過(guò)當(dāng)前這一輪,break 是結(jié)束當(dāng)前這一層循環(huán)。注意,是“當(dāng)前這一層”,不是所有循環(huán)都結(jié)束。外層循環(huán)和內(nèi)層循環(huán)的邊界要看代碼縮進(jìn)。
這也是 Python 初學(xué)者很容易踩坑的地方。如果 break 寫在內(nèi)層 sheet 循環(huán)中,它只會(huì)結(jié)束當(dāng)前工作簿內(nèi)部的 sheet 查找,不會(huì)終止外層文件循環(huán)。后面的工作簿仍然會(huì)繼續(xù)處理。
6. 擴(kuò)展案例:批量刪除工作表
掌握“批量新增工作表”之后,可以順著同一套思路做一個(gè)反向案例:在多個(gè)工作簿中批量刪除指定工作表。比如某些文件中多了一張 匯總 表,現(xiàn)在需要統(tǒng)一清理。
這張圖展示的是擴(kuò)展案例:找到多個(gè)工作簿中的目標(biāo)工作表后,執(zhí)行刪除、保存,然后繼續(xù)處理下一個(gè)工作簿。

從圖中可以看出,刪除操作比新增操作風(fēng)險(xiǎn)更高。新增錯(cuò)了通常還能刪掉,但刪除錯(cuò)了就可能導(dǎo)致數(shù)據(jù)丟失。 所以批量刪除必須堅(jiān)持一個(gè)原則:存在才刪除,確認(rèn)目標(biāo)再執(zhí)行。
下面是批量刪除指定工作表的示例代碼:
import os
import xlwings as xw
folder_path = r"e:\file"
target_sheet = "匯總"
app = xw.App(visible=False, add_book=False)
try:
for file in os.listdir(folder_path):
if file.startswith("~$"):
continue
if not file.lower().endswith((".xlsx", ".xls", ".xlsm")):
continue
full_path = os.path.join(folder_path, file)
wb = app.books.open(full_path)
found = False
for sht in wb.sheets:
if sht.name == target_sheet:
sht.delete()
wb.save()
found = True
print(f"已刪除:{file} -> [{target_sheet}]")
break
if not found:
print(f"未找到:{file} -> [{target_sheet}],跳過(guò)")
wb.close()
finally:
app.quit()
這里的 found 變量用于記錄是否找到了目標(biāo)工作表。如果找到了,就刪除并保存;如果沒(méi)有找到,就打印跳過(guò)信息。這樣做的好處是日志更清楚,后續(xù)復(fù)盤時(shí)能看出哪些文件被刪除了目標(biāo)表,哪些文件本來(lái)就沒(méi)有目標(biāo)表。
推薦刪除前先備份原始文件。尤其是批量刪除、批量改名、批量覆蓋保存這類操作,不要直接對(duì)正式數(shù)據(jù)下手。先復(fù)制一份測(cè)試目錄,確認(rèn)邏輯無(wú)誤后再處理正式文件。
7. 效果驗(yàn)證:不要只看腳本有沒(méi)有報(bào)錯(cuò)
很多人跑完腳本后,只要控制臺(tái)沒(méi)有報(bào)錯(cuò),就默認(rèn)任務(wù)成功了。這個(gè)習(xí)慣很危險(xiǎn)。批量處理 Excel 時(shí),腳本不報(bào)錯(cuò)只能說(shuō)明程序流程跑完了,不代表結(jié)果完全正確。
對(duì)于“批量新增工作表”這個(gè)案例,至少要驗(yàn)證三件事。第一,文件夾里目標(biāo) Excel 是否都被處理;第二,已存在目標(biāo)工作表的文件是否被跳過(guò);第三,原本沒(méi)有目標(biāo)工作表的文件是否成功新增。
可以先用日志判斷處理情況:
print(f"已新增:{file} -> [{sheet_name}]")
print(f"已存在:{file} -> [{sheet_name}],跳過(guò)")
如果要進(jìn)一步做得更穩(wěn),可以把處理結(jié)果寫入一個(gè)日志列表,最后導(dǎo)出成 Excel,方便留痕。
import os
import xlwings as xw
import pandas as pd
folder_path = r"e:\file"
sheet_name = "匯總"
log_list = []
app = xw.App(visible=False, add_book=False)
try:
for file in os.listdir(folder_path):
if file.startswith("~$"):
continue
if not file.lower().endswith((".xlsx", ".xls", ".xlsm")):
continue
full_path = os.path.join(folder_path, file)
wb = app.books.open(full_path)
sheet_names = [j.name for j in wb.sheets]
if sheet_name not in sheet_names:
wb.sheets.add(sheet_name)
wb.save()
status = "已新增"
else:
status = "已存在,跳過(guò)"
log_list.append({
"文件名": file,
"目標(biāo)工作表": sheet_name,
"處理結(jié)果": status
})
wb.close()
finally:
app.quit()
log_df = pd.DataFrame(log_list)
log_df.to_excel(r"e:\file\處理日志.xlsx", index=False)
這個(gè)版本比單純打印日志更適合真實(shí)辦公場(chǎng)景。因?yàn)樽罱K會(huì)生成一份 處理日志.xlsx,以后別人問(wèn)“哪些文件處理過(guò)、哪些文件跳過(guò)”,可以直接拿日志說(shuō)明,而不是憑記憶回答。
8. 常見(jiàn)問(wèn)題與踩坑提醒
這個(gè)案例看似簡(jiǎn)單,但實(shí)際使用時(shí)仍然有幾個(gè)細(xì)節(jié)要注意。尤其是在企業(yè)辦公環(huán)境中,文件路徑、權(quán)限、Excel 占用、同步盤狀態(tài)都會(huì)影響腳本執(zhí)行結(jié)果。
8.1 Excel 臨時(shí)文件不能處理
Excel 打開(kāi)工作簿時(shí),經(jīng)常會(huì)在同目錄生成 ~$ 開(kāi)頭的臨時(shí)文件。這類文件不是正式工作簿,腳本如果嘗試打開(kāi)它,很可能報(bào)錯(cuò)。
if file.startswith("~$"):
continue
推薦在所有批量 Excel 腳本里默認(rèn)加上這句判斷。這不是多余代碼,而是現(xiàn)場(chǎng)穩(wěn)定性保障。
8.2 目標(biāo)工作表名稱要提前確認(rèn)
Excel 工作表名稱有長(zhǎng)度和特殊字符限制,而且不能包含某些特殊符號(hào)。比如 /、\、?、* 等字符都不適合作為工作表名稱。
如果目標(biāo) sheet 名稱來(lái)自外部輸入,一定要做合法性檢查。否則批量處理時(shí)可能處理到一半報(bào)錯(cuò),導(dǎo)致結(jié)果不完整。
8.3 文件被占用會(huì)導(dǎo)致保存異常
如果某個(gè) Excel 正在被用戶打開(kāi),或者存放在網(wǎng)盤同步目錄中,保存時(shí)可能失敗。遇到這種情況,不要急著懷疑代碼,先確認(rèn)文件是否被占用。
企業(yè)環(huán)境里,我更建議先把待處理文件復(fù)制到本地臨時(shí)目錄,例如 C:\Temp\excel_batch,處理完成后再回傳結(jié)果。這樣可以減少網(wǎng)絡(luò)盤、同步盤、權(quán)限控制帶來(lái)的干擾。
8.4 xlwings 腳本結(jié)束后要釋放 Excel 進(jìn)程
使用 xlwings 時(shí),如果沒(méi)有正確關(guān)閉工作簿和退出 Excel 應(yīng)用,后臺(tái)可能殘留 Excel 進(jìn)程。腳本多跑幾次后,就可能出現(xiàn)越來(lái)越慢、文件被鎖定、保存失敗等問(wèn)題。
try:
# 批量處理邏輯
pass
finally:
app.quit()
推薦把 app.quit() 放在 finally 中。這樣即使中間出現(xiàn)異常,也能盡量釋放 Excel 應(yīng)用資源。
9. 總結(jié)提升:真正要學(xué)的是批處理安全意識(shí)
這一節(jié)的代碼并不算復(fù)雜,但它背后的思路很重要:批量處理不是把單個(gè)操作重復(fù)很多次,而是要在重復(fù)之前加上判斷、過(guò)濾、日志和驗(yàn)證。
在多個(gè)工作簿中批量新增工作表,表面上是 wb.sheets.add() 的使用,核心其實(shí)是 sheet_name not in sheet_names 這個(gè)判斷。 只有先判斷,再新增,腳本才不會(huì)因?yàn)橹貜?fù)創(chuàng)建同名工作表而失控。
這篇筆記我建議重點(diǎn)記住四個(gè)點(diǎn):第一,遍歷文件夾時(shí)要過(guò)濾 Excel 臨時(shí)文件;第二,新增工作表前要讀取已有 sheet 名稱;第三,存在就跳過(guò),不存在才新增;第四,批量腳本要有日志,不能只看有沒(méi)有報(bào)錯(cuò)。
最后再?gòu)?qiáng)調(diào)一次:凡是批量新增、批量刪除、批量覆蓋的腳本,都不要直接在原始文件上試。先備份,先小樣本測(cè)試,先驗(yàn)證結(jié)果,再擴(kuò)大范圍。這才是辦公自動(dòng)化腳本能長(zhǎng)期復(fù)用的基礎(chǔ)。
以上就是Python實(shí)現(xiàn)在多個(gè)Excel工作簿中批量新增指定工作表的詳細(xì)內(nèi)容,更多關(guān)于Python Excel批量新增指定工作表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python實(shí)現(xiàn)Excel工作表的批量復(fù)制功能
- 使用Python保護(hù)和取消保護(hù)Excel工作表和工作簿的完整代碼
- Python批量處理Excel工作簿和工作表的完整代碼
- Python批量提取Excel工作簿中所有工作表的唯一值
- Python批量重命名Excel工作表的示例詳解
- Python批量合并多個(gè)Excel工作簿中同名工作表
- Python自動(dòng)化拆分Excel工作表的實(shí)戰(zhàn)教學(xué)
- Python自動(dòng)化批量排序Excel所有工作表的完整指南
- Python自動(dòng)化篩選Excel工作簿中多個(gè)工作表的實(shí)戰(zhàn)教學(xué)
相關(guān)文章
Python爬蟲之Selenium鼠標(biāo)事件的實(shí)現(xiàn)
這篇文章主要介紹了Python爬蟲之Selenium鼠標(biāo)事件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
python調(diào)用chrome實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)操作過(guò)程
這篇文章主要介紹了python調(diào)用chrome實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
基于Python+SQLite編寫一個(gè)本機(jī)程序啟動(dòng)器
本文介紹了基于Python+SQLite編寫一個(gè)Windows程序啟動(dòng)器工具的相關(guān)知識(shí),文章特別強(qiáng)調(diào)了打包后配置文件路徑的正確處理方法,以及針對(duì)不同程序安裝方式的多源數(shù)據(jù)采集策略,最終實(shí)現(xiàn)了一個(gè)可維護(hù)、可擴(kuò)展的輕量級(jí)程序啟動(dòng)2026-07-07
python實(shí)現(xiàn)一次創(chuàng)建多級(jí)目錄的方法
這篇文章主要介紹了python實(shí)現(xiàn)一次創(chuàng)建多級(jí)目錄的方法,涉及Python中os模塊makedirs方法的使用技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-05-05
使用Python有效識(shí)別和合并PDF的跨頁(yè)表格
在處理大量包含表格數(shù)據(jù)的PDF文檔時(shí),一個(gè)常見(jiàn)的挑戰(zhàn)是這些表格可能跨越多頁(yè),動(dòng)合并這些表格不僅耗時(shí),而且容易出錯(cuò),所以本文給大家介紹了如何使用Python有效識(shí)別和合并PDF的跨頁(yè)表格,需要的朋友可以參考下2025-12-12
Python+flask編寫一個(gè)簡(jiǎn)單實(shí)用的自動(dòng)排班系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Python+flask編寫一個(gè)簡(jiǎn)單實(shí)用的自動(dòng)排班系統(tǒng),文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下2025-03-03
基于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的古詩(shī)生成器
這篇文章主要為大家詳細(xì)介紹了基于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的古詩(shī)生成器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03

