如何用Pandas将数据复制到已有Excel工作簿且不覆盖原有内容?
解决Excel数据导入不覆盖原有内容的问题
你的判断完全正确——直接用pd.to_excel会覆盖目标工作表的全部内容,哪怕指定了起始行列也没用,因为Pandas默认会重新创建整个工作表。要保留原有公式、格式和列分组,必须基于已有的工作簿对象来写入DataFrame,而不是直接生成新文件。
下面给两种实用的解决方案:
方法一:用openpyxl配合Pandas
openpyxl是纯Python实现的xlsx读写库,能完整保留Excel原有格式。步骤如下:
- 先加载目标工作簿,确保原有内容不丢失
- 用ExcelWriter以追加模式打开,关联已加载的工作簿
- 将DataFrame写入指定位置,仅覆盖目标区域的单元格
代码示例:
import pandas as pd from openpyxl import load_workbook # 读取原始数据集 data = pd.read_excel( '/Users/mikey/Desktop/Automating Financial Reporting/QBO Spreadsheets/Statement of Cash Flows/StatementofCashFlows-ABC.xlsx', sheet_name="Month" ) # 目标文件和工作表信息 target_file = '/Users/mikey/Desktop/Automating Financial Reporting/QBO Spreadsheets/Statement of Cash Flows/StatementofCashFlows-ABCReporting.xlsx' target_sheet = "ABC Cash Flows" # 加载已有工作簿,保留所有原有内容 book = load_workbook(target_file) # 以追加模式打开ExcelWriter,指定覆盖已有工作表的指定区域 with pd.ExcelWriter(target_file, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer: # 关联已有的工作表,避免创建新表 writer.sheets = {ws.title: ws for ws in book.worksheets} # 将DataFrame写入指定行列,不写入索引和表头 data.to_excel(writer, sheet_name=target_sheet, startcol=17, startrow=9, index=False, header=None)
方法二:用xlwings(更直观易读)
xlwings可以直接操控本地Excel应用,完全保留原有格式、公式和分组,写法更简洁:
import pandas as pd import xlwings as xw # 读取原始数据集 data = pd.read_excel( '/Users/mikey/Desktop/Automating Financial Reporting/QBO Spreadsheets/Statement of Cash Flows/StatementofCashFlows-ABC.xlsx', sheet_name="Month" ) # 打开目标工作簿(visible=True可显示Excel窗口,False则后台运行) with xw.Book('/Users/mikey/Desktop/Automating Financial Reporting/QBO Spreadsheets/Statement of Cash Flows/StatementofCashFlows-ABCReporting.xlsx') as book: # 获取目标工作表 sheet = book.sheets["ABC Cash Flows"] # 从指定单元格开始写入数据(R对应第17列,9对应第9行) sheet.range('R9').value = data.values
注意:xlwings需要本地安装Excel应用,适合Windows/macOS环境;openpyxl纯Python实现,跨平台性更强。
内容的提问来源于stack exchange,提问作者Michael Mesa
相关产品推荐
相关产品推荐

