如何使用Pandas向Excel指定列(a、c列)写入数据?
解决向Excel模板指定列插入数据的问题
我的模板文件
my_template.xlsx结构如下:a | b | c ---------我需要仅向其中的
a列和c列插入数据,但当前代码会把数据插入到a列和b列,错误代码如下:reports = reports.query(FSSP_MAIN).filter_by(id=id).all() reports_df = pd.Dataframe(data=([report.id, report.surname] for report in reports), columns = ['a', 'c']) excel_template = 'my_template.xlsx' with pd.ExcelWriter(excel_template, if_sheet_exists="overlay", mode="a", engine="openpyxl") as writer: reports_df.to_excel( writer, start_row=1 index=False, header = False )
问题原因
pandas的to_excel方法默认会按DataFrame的列顺序,依次填充到Excel的连续列中。你的DataFrame只有a和c两列,所以会被自动填充到A、B列,而非目标的A、C列。另外注意原代码里pd.Dataframe是拼写错误,正确写法是pd.DataFrame,这个问题也需要修正。
两种解决方法
方法一:补全DataFrame列与模板匹配
给DataFrame添加空的b列,让列顺序和模板完全对应,这样写入时就会匹配到正确的Excel列:
reports = reports.query(FSSP_MAIN).filter_by(id=id).all() # 补全b列,列顺序对应模板的a、b、c reports_df = pd.DataFrame( data=([report.id, "", report.surname] for report in reports), columns=['a', 'b', 'c'] ) excel_template = 'my_template.xlsx' with pd.ExcelWriter(excel_template, if_sheet_exists="overlay", mode="a", engine="openpyxl") as writer: reports_df.to_excel( writer, start_row=1, index=False, header=False )
方法二:直接用openpyxl操作指定单元格
如果不想修改DataFrame结构,可以直接用openpyxl加载模板,手动指定单元格写入数据,灵活性更高:
from openpyxl import load_workbook reports = reports.query(FSSP_MAIN).filter_by(id=id).all() excel_template = 'my_template.xlsx' # 加载模板文件 wb = load_workbook(excel_template) ws = wb.active # 操作默认工作表,如需指定表名可改为wb['你的工作表名称'] # 遍历数据写入指定列:A列对应a,C列对应c for row_num, report in enumerate(reports, start=2): # start=2对应Excel第2行(跳过表头行) ws.cell(row=row_num, column=1, value=report.id) # column=1是A列 ws.cell(row=row_num, column=3, value=report.surname) # column=3是C列 # 保存修改 wb.save(excel_template)
内容的提问来源于stack exchange,提问作者Truffaldino
相关产品推荐
相关产品推荐

