如何使用Pandas/Openpyxl将Dataframe写入Excel并使其右下角对应D9单元格
如何使用Pandas/Openpyxl将Dataframe写入Excel并使其右下角对应D9单元格
嗨,这个需求其实不用费劲一个个单元格迭代,用Pandas搭配Openpyxl就能很简洁地实现,效率还高!我给你详细说下两种方法,优先推荐第一种最优解:
方法一:用Pandas原生参数直接定位(推荐)
Pandas的to_excel方法本身就支持startrow和startcol参数,我们只需要先算准起始位置,就能直接把DataFrame写到目标区域,让右下角刚好落在D9。
步骤说明:
- 先明确你的DataFrame形状:你的df是3行2列(
df.shape返回(3,2)) - 目标右下角是D9,对应Excel的1-based行号9,列号4(A=1、B=2、C=3、D=4)
- 倒推起始位置:
- Pandas的
startrow/startcol是0-based计数(Excel行1对应startrow=0),所以转换后:- 0-based起始行 = 9 - 3 = 6(对应Excel行7)
- 0-based起始列 = 4 - 2 = 2(对应Excel列C)
- Pandas的
完整代码:
import pandas as pd from openpyxl import Workbook # 1. 创建你的DataFrame df = pd.DataFrame({ "A": [1, 3, 5], "B": [2, 4, 6], }) # 2. 初始化Excel工作簿和Writer wb = Workbook() ws = wb.active writer = pd.ExcelWriter('output.xlsx', engine='openpyxl') writer.book = wb writer.sheets = {'Sheet1': ws} # 3. 计算起始位置(转换为Pandas的0-based参数) target_end_row = 9 # Excel目标右下角行号(1-based) target_end_col = 4 # Excel目标右下角列号(D列,1-based) df_rows, df_cols = df.shape start_row = target_end_row - df_rows # 9-3=6(0-based,对应Excel行7) start_col = target_end_col - df_cols # 4-2=2(0-based,对应Excel列C) # 4. 写入DataFrame到指定位置 # index=False 表示不写入Pandas的行索引,header=True 保留列名A、B df.to_excel(writer, sheet_name='Sheet1', startrow=start_row, startcol=start_col, index=False, header=True) # 5. 保存文件 writer.close()
运行这段代码后,你的DataFrame最后一个单元格(对应df的B3)就会刚好落在Excel的D9位置,完全符合需求,全程不用手动遍历单元格。
方法二:手动迭代单元格(不推荐,仅作参考)
如果你出于某些原因一定要手动遍历每个单元格写入,也可以这么做,但这种方法代码冗余,大DataFrame下效率很低,所以一般不建议用:
import pandas as pd from openpyxl import Workbook df = pd.DataFrame({ "A": [1, 3, 5], "B": [2, 4, 6], }) wb = Workbook() ws = wb.active # 计算Excel的1-based起始位置 target_end_row = 9 target_end_col = 4 df_rows, df_cols = df.shape start_row = target_end_row - df_rows + 1 # 9-3+1=7(Excel行7) start_col = target_end_col - df_cols + 1 #4-2+1=3(Excel列C) # 先写入列名 for col_idx, col_name in enumerate(df.columns, start=start_col): ws.cell(row=start_row, column=col_idx, value=col_name) # 再写入数据行 for row_offset, row_data in enumerate(df.itertuples(index=False), start=1): for col_offset, value in enumerate(row_data, start=0): ws.cell(row=start_row + row_offset, column=start_col + col_offset, value=value) wb.save('output_iter.xlsx')
备注:内容来源于stack exchange,提问作者Chjul




