Python向现有xlsx文件新增工作表遇报错及内存占用过高求助
问题解决:向现有Excel添加工作表时的报错与内存占用问题
核心错误原因
pd.read_excel()参数错误:你直接将openpyxl的Workbook对象传给了pd.read_excel(),但该函数只接受文件路径、ExcelFile实例或字节流,这就是Invalid file path or buffer object type错误的直接原因。- openpyxl内存占用过高:openpyxl会将整个工作簿的所有内容(包括样式、格式、公式等)加载到内存中,哪怕文件体积只有6-12MB,若内部数据量庞大,也会导致内存暴涨甚至程序无响应。
解决方案
方案一:分开处理工作表创建与数据读取
先通过openpyxl完成工作表的创建与保存,再用pandas直接读取文件路径,避免传递Workbook对象:
def HCReport(self): wb2 = load_workbook(filename='HC-Template.xlsx') ws2 = wb2['Raw Data'] allCols = ['Employee Number', 'Full Name', 'Team'] input_file = self.inputHC.get() # 1. 检查并创建工作表 wb = load_workbook(input_file) if 'Raw Data' not in wb.sheetnames: wb.create_sheet('Raw Data') # 保存后关闭工作簿,释放内存 wb.save(input_file) wb.close() # 2. 用pandas读取文件 df = pd.read_excel(input_file, sheet_name='Raw Data') print(df.head())
方案二:用pandas ExcelWriter处理(适合无复杂格式的文件)
如果原文件没有复杂样式/公式,优先用pandas的ExcelWriter追加工作表,内存占用更低:
def HCReport(self): wb2 = load_workbook(filename='HC-Template.xlsx') ws2 = wb2['Raw Data'] allCols = ['Employee Number', 'Full Name', 'Team'] input_file = self.inputHC.get() # 检查现有工作表 sheet_names = pd.ExcelFile(input_file).sheet_names if 'Raw Data' not in sheet_names: # 追加模式打开文件,创建空工作表 with pd.ExcelWriter(input_file, mode='a', engine='openpyxl', if_sheet_exists='new') as writer: pd.DataFrame().to_excel(writer, sheet_name='Raw Data', index=False) # 读取目标工作表 df = pd.read_excel(input_file, sheet_name='Raw Data') print(df.head())
注意:
if_sheet_exists='new'需要pandas 1.4.0及以上版本,若版本过低,可提前检查工作表再执行创建逻辑。
内存优化建议
- 指定读取列:读取时只加载需要的列,减少内存占用:
df = pd.read_excel(input_file, sheet_name='Raw Data', usecols=allCols) - openpyxl参数优化:加载文件时添加
data_only=True,只读取单元格值而非公式:wb = load_workbook(input_file, data_only=True) - 分块读取:数据量极大时,用
chunksize分块处理:for chunk in pd.read_excel(input_file, sheet_name='Raw Data', chunksize=1000): print(chunk.head()) # 处理逻辑
内容的提问来源于stack exchange,提问作者Alfa Rojo
相关产品推荐
相关产品推荐

