Python批量實現(xiàn)更改Excel中多個工作簿的數(shù)據(jù)格式
1. 問題背景:為什么要批量更改多個工作簿的數(shù)據(jù)格式
本文主題是:批量更改多個工作簿的數(shù)據(jù)格式。這類需求在真實辦公場景里很常見,尤其是多個部門、多個區(qū)域、多個項目分別提交 Excel 報表時,數(shù)據(jù)內容可能是對的,但顯示格式經(jīng)常不統(tǒng)一。
比如日期列里有的顯示為 2026/1/1,有的顯示為 2026-01-01,還有的顯示為 1 Jan 2026;金額列里有的沒有千分位,有的保留一位小數(shù),有的又帶貨幣符號;百分比列里有的顯示為 0.1234,有的顯示為 12.34%。這些問題單看一個文件不嚴重,但如果幾十個工作簿都這樣,后續(xù)匯總、審核和展示都會很難看。
推薦做法是:把這種“格式規(guī)則明確、處理文件數(shù)量多、人工統(tǒng)一成本高”的工作交給 Python 批量處理。人負責確定格式標準,腳本負責逐個打開工作簿、定位數(shù)據(jù)區(qū)域、設置顯示格式、保存結果。
這張圖展示的是本文的整體目標:用 Python + Excel 自動化,將多個工作簿中的日期、金額、百分比等數(shù)據(jù)格式一次性統(tǒng)一。

從圖中可以看出,本文關注的不是單個單元格的手動格式調整,而是批量處理多個工作簿的數(shù)據(jù)格式標準化。這也是辦公自動化真正有價值的地方:不是替代一次點擊,而是把大量重復點擊變成穩(wěn)定規(guī)則。
2. 應用場景:哪些格式問題適合用 Python 批量處理
這個案例適合處理三類典型問題:日期格式統(tǒng)一、金額格式統(tǒng)一、百分比格式統(tǒng)一。只要這些列的位置相對固定,或者可以通過表頭定位,就可以通過腳本批量設置顯示格式。
在公司報表里,數(shù)據(jù)格式不統(tǒng)一經(jīng)常不是因為員工不會填,而是來源系統(tǒng)不同、復制粘貼習慣不同、Excel 自動識別規(guī)則不同。最后造成一個結果:表面上都是“日期”“金額”“百分比”,實際展示出來卻很混亂。
這里要先明確一個邊界:number_format 主要控制的是 Excel 的顯示格式,它不等于數(shù)據(jù)清洗。也就是說,如果一個單元格本質上是文本,單純設置 number_format 不一定能把它變成真正的日期或數(shù)字。
這張圖展示的是批量統(tǒng)一數(shù)據(jù)格式的應用場景,包括日期格式、金額格式、百分比格式,以及多個報表工作簿的批量處理。

從圖中可以看出,批量改格式適合解決“顯示不統(tǒng)一”的問題。比如把 2026/1/1 統(tǒng)一顯示為 2026-01-01,把 1234567 統(tǒng)一顯示為 1,234,567.00,把 0.1234 統(tǒng)一顯示為 12.34%。這些處理能明顯提升報表規(guī)范性,也能減少人工校對成本。
3. 核心原理:動態(tài)找末行,再設置 number_format
這一節(jié)的核心不是“給某個單元格設置格式”,而是對多個工作簿中的指定數(shù)據(jù)區(qū)域批量設置格式。所以代碼要解決兩個關鍵問題:第一,怎么找到每個文件的數(shù)據(jù)區(qū)域;第二,怎么給不同列設置不同的顯示格式。
核心思路可以拆成四步:先遍歷目標文件夾,找到所有需要處理的 Excel 文件;再打開每個工作簿并定位目標工作表;然后通過 current_region.last_cell.row 動態(tài)獲取數(shù)據(jù)末行;最后對日期列、金額列、百分比列分別設置 number_format 并保存。
這張圖展示的是批量更改多個工作簿數(shù)據(jù)格式的核心流程:讀取文件、定位工作表、動態(tài)獲取末行、設置格式并保存。

從圖中可以看出,流程里最關鍵的一步是動態(tài)獲取末行。如果把范圍寫死為 A2:A10000,短表會處理多余空白,長表又可能漏數(shù)據(jù)。用動態(tài)末行可以讓腳本適應不同工作簿的數(shù)據(jù)量。
4. 實現(xiàn)代碼:批量更改日期、金額、百分比格式
下面這份代碼假設第 1 行是表頭,A 列是日期,B 列是金額,C 列是百分比。腳本會從目標文件夾中遍歷所有 Excel 文件,并批量設置這三列的數(shù)據(jù)格式。
import os
import xlwings as xw
# ====== 需要根據(jù)實際情況修改的參數(shù) ======
folder_path = r"e:\file\target" # 多個 Excel 文件所在文件夾
sheet_name = "Sheet1" # 需要處理的工作表名稱
# ======================================
app = xw.App(visible=False, add_book=False)
try:
for file in os.listdir(folder_path):
# 跳過 Excel 臨時文件
if file.startswith("~$"):
continue
# 只處理 Excel 文件
if not file.lower().endswith((".xlsx", ".xls", ".xlsm")):
continue
full_path = os.path.join(folder_path, file)
wb = None
try:
wb = app.books.open(full_path)
# 如果目標工作表不存在,則跳過當前文件
sheet_names = [s.name for s in wb.sheets]
if sheet_name not in sheet_names:
print(f"跳過:{file},不存在工作表:{sheet_name}")
continue
sht = wb.sheets[sheet_name]
# 動態(tài)獲取末行:以 A1 為起點識別連續(xù)數(shù)據(jù)區(qū)域
last_row = sht.range("A1").current_region.last_cell.row
# 如果只有表頭,沒有數(shù)據(jù),則跳過
if last_row < 2:
print(f"跳過:{file},沒有有效數(shù)據(jù)")
continue
# 構造動態(tài)區(qū)域
rng_date = sht.range(f"A2:A{last_row}")
rng_amount = sht.range(f"B2:B{last_row}")
rng_rate = sht.range(f"C2:C{last_row}")
# 設置顯示格式
rng_date.number_format = "yyyy-mm-dd"
rng_amount.number_format = "#,##0.00"
rng_rate.number_format = "0.00%"
wb.save()
print(f"已更改數(shù)據(jù)格式:{file},末行:{last_row}")
finally:
if wb is not None:
wb.close()
finally:
app.quit()
這份腳本比最簡單版本多了幾個保護動作:跳過 ~$ 臨時文件、判斷工作表是否存在、判斷是否有有效數(shù)據(jù)、用 try/finally 確保工作簿關閉。這些細節(jié)看起來不顯眼,但對批量處理非常重要。
如果是正式處理業(yè)務文件,建議先復制一份測試目錄,再運行腳本。格式類操作雖然一般不會刪除數(shù)據(jù),但一旦批量改錯,返工也很麻煩。
5. 關鍵代碼邏輯:current_region、last_row 與 number_format
這段代碼最關鍵的不是 for 循環(huán),而是下面這句:
last_row = sht.range("A1").current_region.last_cell.row
它的含義是:從 A1 出發(fā),識別當前連續(xù)數(shù)據(jù)區(qū)域,然后取這個區(qū)域最后一個單元格所在的行號。這樣就可以得到當前工作表的實際數(shù)據(jù)末行。
有了 last_row 之后,就能動態(tài)構造區(qū)域:
rng_date = sht.range(f"A2:A{last_row}")
rng_amount = sht.range(f"B2:B{last_row}")
rng_rate = sht.range(f"C2:C{last_row}")
最后再分別設置顯示格式:
rng_date.number_format = "yyyy-mm-dd" rng_amount.number_format = "#,##0.00" rng_rate.number_format = "0.00%"
這張圖展示的是關鍵代碼邏輯:動態(tài)找末行、設置 number_format,并強調格式設置只影響顯示,不直接改變底層數(shù)值。

從圖中可以看出,number_format 的價值在于統(tǒng)一顯示規(guī)則。日期列顯示為 yyyy-mm-dd,金額列顯示為 #,##0.00,百分比列顯示為 0.00%。但這里必須記?。簄umber_format 不是萬能的數(shù)據(jù)轉換工具,它主要控制顯示格式,不負責把文本徹底清洗成真實日期或真實數(shù)字。
6. 操作步驟:先小范圍驗證,再批量執(zhí)行
這類腳本不要一上來就直接跑正式目錄。更穩(wěn)的做法是先準備 2 到 3 個測試工作簿,確認格式效果正確,再擴大到完整文件夾。
第一步,確認目標文件夾。把需要處理的 Excel 文件放在同一個目錄中,避免混入無關文件。對于 Excel 自動生成的臨時文件,腳本中已經(jīng)用 file.startswith("~$") 跳過。
第二步,確認目標工作表名稱。示例代碼里使用的是 Sheet1,實際工作中可能是 銷售明細、數(shù)據(jù)表、報表。名稱不一致時,腳本會跳過該文件。
第三步,確認列規(guī)則。示例中默認 A 列是日期、B 列是金額、C 列是百分比。如果你的表結構不同,必須修改對應列區(qū)域,不能機械照抄。
第四步,小范圍運行并檢查結果。重點看日期、金額、百分比是否顯示正確,是否存在文本無法格式化的問題。
我的建議是:批量處理前先打印文件名和末行,確認腳本識別的目標范圍是否符合預期。
print(f"當前文件:{file}")
print(f"識別到的數(shù)據(jù)末行:{last_row}")
日志越清楚,排錯越省時間。尤其是處理多個工作簿時,一旦某個文件結構異常,日志可以快速告訴你問題發(fā)生在哪一個文件。
7. 知識延伸:批量設置外觀格式
數(shù)據(jù)格式統(tǒng)一只是第一步。很多公司報表還要求表頭加粗、居中、底色統(tǒng)一、正文自動換行、邊框規(guī)范。對于這類外觀格式,xlwings 也可以通過 .api 調用 Excel 的底層屬性。
# 假設已經(jīng)獲取 sht 和 last_row
# 1. 設置表頭格式
header_rng = sht.range("A1:C1")
header_rng.api.Font.Bold = True
header_rng.api.HorizontalAlignment = -4108 # 居中
header_rng.api.VerticalAlignment = -4108 # 垂直居中
header_rng.color = (217, 217, 217) # 淺灰色底色
# 2. 設置正文格式
body_rng = sht.range(f"A2:C{last_row}")
body_rng.api.Font.Name = "微軟雅黑"
body_rng.api.Font.Size = 10
body_rng.api.HorizontalAlignment = -4131 # 左對齊
body_rng.api.WrapText = True # 自動換行
# 3. 設置邊框
body_rng.api.Borders.Weight = 2
.api 的作用可以理解為:直接調用 Excel COM 對象的能力。它比普通屬性更底層,也更接近 Excel 原生功能,適合處理字體、邊框、對齊、顏色這類外觀細節(jié)。
但要注意:外觀格式越復雜,腳本越容易和不同電腦上的 Excel 環(huán)境、字體環(huán)境、區(qū)域設置產生差異。正式批量處理前,最好先在幾臺典型電腦上驗證效果。
8. 常見問題:批量改格式前后必須檢查
批量改格式最容易讓人誤判。很多時候腳本沒有報錯,但結果并不一定符合預期。尤其是 current_region、文本日期、文本數(shù)字這些問題,如果不提前理解,后面會踩坑。
這張圖展示的是批量改格式前后最需要檢查的幾個點:跳過臨時文件、檢查空行、確認真實數(shù)據(jù)類型、驗證最終結果。

從圖中可以看出,~$ 開頭的 Excel 臨時文件要跳過;如果數(shù)據(jù)區(qū)域中間有整行空行,current_region 可能提前結束;如果日期和數(shù)字本質上是文本,單純設置 number_format 可能只改變顯示規(guī)則,不能完成真實數(shù)據(jù)類型轉換。
最危險的誤區(qū)是:看到單元格“長得像日期”或者“長得像數(shù)字”,就以為它已經(jīng)是真實日期或真實數(shù)字。Excel 里顯示像,不代表類型對。后續(xù)如果要參與公式計算或匯總統(tǒng)計,就必須進一步確認數(shù)據(jù)類型。
如果懷疑某一列是文本數(shù)字,可以先通過 Excel 現(xiàn)象判斷:單元格左上角是否有綠色提示,求和結果是否異常,排序是否按文本順序排列。也可以在腳本里加入更嚴格的數(shù)據(jù)清洗邏輯,但那已經(jīng)超出單純 number_format 的范圍。
9. 效果驗證:用腳本檢查格式是否生效
批量處理之后,建議至少抽查幾個文件。更穩(wěn)一點的做法,是寫一個驗證腳本,把目標區(qū)域的 number_format 打印出來,確認格式是否真的寫入。
import os
import xlwings as xw
folder_path = r"e:\file\target"
sheet_name = "Sheet1"
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 = None
try:
wb = app.books.open(full_path)
if sheet_name not in [s.name for s in wb.sheets]:
print(f"跳過:{file},不存在工作表:{sheet_name}")
continue
sht = wb.sheets[sheet_name]
print(f"文件:{file}")
print("A2 日期格式:", sht.range("A2").number_format)
print("B2 金額格式:", sht.range("B2").number_format)
print("C2 百分比格式:", sht.range("C2").number_format)
print("-" * 40)
finally:
if wb is not None:
wb.close()
finally:
app.quit()
這個驗證腳本不修改文件,只讀取格式結果。對于批量處理任務來說,驗證腳本和處理腳本一樣重要。只會批量執(zhí)行,不會驗證結果,自動化就還不夠可靠。
10. 總結提升:格式統(tǒng)一背后是報表標準化能力
這一節(jié)表面上是在學習 number_format,實際是在訓練一種很重要的辦公自動化能力:批量統(tǒng)一多個工作簿的報表標準。這類能力在真實辦公里很有用,因為很多報表問題不是數(shù)據(jù)本身錯,而是格式混亂導致閱讀、匯總和審核成本變高。
這一節(jié)我重點掌握了四個點:用 os.listdir() 遍歷文件夾;用 current_region.last_cell.row 動態(tài)獲取末行;用 number_format 設置日期、金額、百分比顯示格式;最后通過驗證腳本檢查格式是否真正生效。
不要把“格式統(tǒng)一”看成簡單美化。在正式報表里,格式規(guī)范就是數(shù)據(jù)質量的一部分。日期格式不統(tǒng)一、金額顯示不規(guī)范、百分比小數(shù)位混亂,都會影響別人對報表專業(yè)度的判斷。
我對這一節(jié)的理解是:Python 做 Excel 自動化,不只是為了少點幾下鼠標,更重要的是把報表處理規(guī)則固化下來。只要規(guī)則穩(wěn)定,腳本就能重復執(zhí)行;只要腳本可驗證,這套流程就能沉淀成真正可復用的辦公工具。
以上就是Python批量實現(xiàn)更改Excel中多個工作簿的數(shù)據(jù)格式的詳細內容,更多關于Python批量更改Excel數(shù)據(jù)格式的資料請關注腳本之家其它相關文章!
- Python實現(xiàn)Excel數(shù)據(jù)格式自由切換(數(shù)值轉文本)的完整指南
- Python提取PDF表格數(shù)據(jù)并導出為TXT、Excel?格式
- 使用Python將JSON格式的假期數(shù)據(jù)轉換為Excel文件
- Python3使用win32com從Excel讀取數(shù)據(jù)生成Word格式報告批量發(fā)郵件的示例詳解
- 基于Python實現(xiàn)excel表格數(shù)據(jù)一鍵轉json格式小工具
- Python實現(xiàn)讀取Excel表數(shù)據(jù)并轉為JSON格式文件
- Python把excel文件數(shù)據(jù)轉化為字典格式存儲詳解
- Python導入Excel表格數(shù)據(jù)并以字典dict格式保存的操作方法
相關文章
Python中使用 Selenium 實現(xiàn)網(wǎng)頁截圖實例
這篇文章主要介紹了Python中使用 Selenium 實現(xiàn)網(wǎng)頁截圖實例,Selenium支持Java、C#、Ruby 以及 Python等語言,本文以Python語言為例,需要的朋友可以參考下2014-07-07
一文帶你搞懂Python?FastAPI中所有核心參數(shù)的設置
本文帶你一次搞懂?FastAPI?中的所有核心參數(shù)類型,從簡單的查詢字符串,再到處理復雜?JSON?或表單數(shù)據(jù)的請求體,感興趣的小伙伴可以了解下2025-12-12
Python-GUI?wxPython之自動化數(shù)據(jù)生成器的項目實戰(zhàn)
本文主要介紹了Python-GUI?wxPython之自動化數(shù)據(jù)生成器實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05

