如何用pandas的ExcelWriter()在Excel中新增数据不覆盖原有数据
解决Pandas向Excel工作表新增数据不覆盖原有内容的问题
你的代码目前会直接覆盖整个Excel文件,因为xlsxwriter引擎的ExcelWriter默认是创建新文件或覆盖原有文件,无法直接向已有工作表追加数据。要实现新增数据且保留原有内容,推荐两种常用方法:
方法一:读取原有数据合并后写入
适合数据量不大的场景,逻辑简单易维护:
import pandas as pd from os.path import exists file_path = r'D:\Projects\MOJ\MOJ.xlsx' sheet_name = 'Sheet1' # 获取表单提交的新数据 serial_num = request.form.get("serialNumberFromSheet_htmlName") new_data = pd.DataFrame({'Serial Number': [serial_num]}) # 合并原有数据与新数据 if exists(file_path): existing_data = pd.read_excel(file_path, sheet_name=sheet_name) combined_data = pd.concat([existing_data, new_data], ignore_index=True) else: combined_data = new_data # 写入Excel(覆盖原文件,但内容是原有+新数据) combined_data.to_excel(file_path, sheet_name=sheet_name, index=False)
说明:先读取原有数据,和新数据合并后整体写入,相当于间接实现“追加”,能自动保留表头和原有内容。
方法二:用Openpyxl引擎直接追加行
适合大数据量场景,无需读取全部原有数据:
首先确保安装openpyxl依赖:
pip install openpyxl
然后使用以下代码:
import pandas as pd from os.path import exists file_path = r'D:\Projects\MOJ\MOJ.xlsx' sheet_name = 'Sheet1' # 获取新数据 serial_num = request.form.get("serialNumberFromSheet_htmlName") new_data = pd.DataFrame({'Serial Number': [serial_num]}) if exists(file_path): # 以追加模式打开Excel,指定覆盖已有工作表 with pd.ExcelWriter(file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: # 获取工作表最后一行的行号 target_sheet = writer.sheets[sheet_name] start_row = target_sheet.max_row # 写入新数据,不重复写表头 new_data.to_excel(writer, sheet_name=sheet_name, startrow=start_row, index=False, header=False) else: # 文件不存在时直接写入 new_data.to_excel(file_path, sheet_name=sheet_name, index=False)
说明:利用openpyxl的追加模式,定位到已有数据的下一行写入新内容,避免了读取全量数据的开销。
内容的提问来源于stack exchange,提问作者Nour Eldin Megahed
相关产品推荐
相关产品推荐

