Python 2.7 時代常用 xlrd + xlwt + xlutils.copy 實現對 .xls 讀取、複製、追加寫入。但 Python 3 中 xlutils 原包不再維護,需改用 xlutils3(第三方移植版),且 API 有細微差異,導致舊代碼報錯。
import xlrd
from xlutils3.copy import copy # 注意導入路徑
import xlwt
# 1. 讀取現有 .xls
read_book = xlrd.open_workbook('test.xls', formatting_info=True)
read_sheet = read_book.sheet_by_index(0)
rows = read_sheet.nrows # 現有行數,下一行即為追加位置
# 2. 複製一份可寫入的工作簿
write_book = copy(read_book)
write_sheet = write_book.get_sheet(0)
# 3. 追加寫入(第 rows 行,索引從 0 開始)
write_sheet.write(rows, 0, "新數據") # 列 0
write_sheet.write(rows, 1, "更多內容") # 列 1
# 4. 保存(會覆蓋原文件,建議先備份)
write_book.save('test.xls')
print("追加成功")
from xlutils3.copy import copy 而非 from xlutils.copy import copy。xlrd.open_workbook 必須加 formatting_info=True 以保留原格式(如列寬、樣式),否則複製後格式丟失。.xls 格式限制:單表 65536 行,單元格 32767 字符。若非強制使用 .xls,強烈建議遷移至 .xlsx 並使用 openpyxl:
from openpyxl import load_workbook
wb = load_workbook('test.xlsx')
ws = wb.active
ws.append(["新數據", "更多內容"])
wb.save('test.xlsx')
優點:支援超大表、現代格式、無需複製工作簿、API 更直觀。
AttributeError: module 'xlutils3' has no attribute 'copy' → 確認安裝 pip install xlutils3 且導入正確。xlutils3 不保留公式,只保留值。需用 openpyxl 或手動重寫公式。