原xls保格式修改(Excel COM)
觸發條件
- 使用者/客戶要求「在原表基礎上修改,格式/設計一模一樣不要動,其他表格不要調整」
- 財務三表調整:改未分配利潤/利潤總額後保持資產=負債+權益勾稽
- 拿到.xls老格式報表要改數字,不能重建
鐵律:不要用 openpyxl 重建
openpyxl 重建 xlsx 會丟失原表格式/樣式/佈局——客戶一打開就知道「不是原來的表」。 必須用 Excel COM 打開原檔案複本,只改目標儲存格,其餘原樣保留。
環境(Windows)
# pywin32 裝在 hermes venv(系統 python 沒有!)
python -m pip install pywin32
# 執行腳本也用 hermes venv 的 python(系統 python import 不到 win32com)
核心流程
1. 先複製原檔再改
import shutil
shutil.copy2(SRC, OUT) # 原檔不動,改 OUT
2. 用 COM 打開 + 掃描定位行/列(別猜行號!)
import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False; excel.DisplayAlerts = False
wb = excel.Workbooks.Open(OUT)
ws = wb.Sheets('資產負債表')
# 掃 A 列/E 列找科目名,印出實際行列
for r in range(1, 60):
a = str(ws.Cells(r, 1).Value or ''); e = str(ws.Cells(r, 5).Value or '')
if '未分配利潤' in a or '未分配利潤' in e:
print(r, a, e, ws.Cells(r,7).Value) # G/H 列是右側數值
⚠️ 左右雙欄報表(資產負債表)科目在 E 列、數值在 G/H 列——「未分配利潤」在右側 G34/H34,不是 C/D! ⚠️ xlrd 0-indexed vs COM 1-indexed,行號差1——必須用 label 掃描確認。
3. 只改目標儲存格
ws.Cells(13, 3).Value = 4307698.97 # 其他應收款期末(左欄 C)
ws.Cells(34, 7).Value = 1052736.98 # 未分配利潤期末(右欄 G)
wb.Application.Calculate()
wb.Save(); wb.Close(True); excel.Quit()
4. ⚠️ 原 xls 往往沒有公式——合計行必須手動算好寫進去
小企業準則匯出的 xls 合計行常是數值不是 SUM 公式,改明細後合計不會自動變。 調整後必須手動算:
- 資產合計 = 流動資產 + 非流動資產
- 權益合計 = 實收資本 + 未分配利潤
- 負債+權益 = 負債合計 + 權益合計 = 資產合計 ✅ 驗證平衡
- 利潤表:營業利潤 = 收入-成本-管理-財務;利潤總額 = 營業利潤+營業外收入;淨利潤 = 利潤總額-所得稅
5. 驗證平衡
assert abs(ws.Cells(36,3).Value - ws.Cells(36,7).Value) < 0.01 # 資產=負債+權益
財務三表調整常見方案(2026-08實測)
目標:未分配利潤調正(如期末105萬/期初79萬),利潤總額=期末-期初差。
- 資產負債表:只調「其他應收款」(資產方)同額增加 → 資產=負債+權益自動平衡
- 利潤表:調「營業收入」(或管理費用)使利潤總額=未分配利潤差;本期利潤另定
- 現金流量表:無現金收付的損益調整,通常不動
- 勾稽驗證:
期末未分配 - 期初未分配 == 累計利潤總額
坑與解決
- pywin32 只裝在 hermes venv → 系統 python
import win32com報 No module named 'pywintypes';用 venv python python -I隔離模式讀不到 site-packages → 直接執行不帶 -I- COM 讀原值顯示 0 → 行號對錯(xlrd 0-indexed vs COM 1-indexed),label 掃描定位
- 改完驗證時發現沒生效 → 檢查改的是左欄還是右欄(C/D vs G/H)
- 殺 python 程序前確認 CommandLine(webapp/網關也是 python 程序)
🙋 關於作者
九品錦鋰e | 把踩過的坑封裝成「拿來就能跑」的 skill,不寫教科書。這個 skill 是我自己每天在用的版本。
微信:ly5419495(加時備註「SkillHub」,我優先通過) 公眾號:初五Agent(微信搜一搜,復盤和方法都寫在那兒,不加微信也能讀)
我另外做的幾個能直接跑的工具,都放在這個貨架頁(複製到瀏覽器打開): https://skillpay.alipay.com/public/jiupinjinlie
用的時候卡住了、或者有別的場景想讓我封裝成 skill,按上面任意方式找我就行。
