You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Pandas/Openpyxl将Dataframe写入Excel并使其右下角对应D9单元格

如何使用Pandas/Openpyxl将Dataframe写入Excel并使其右下角对应D9单元格

嗨,这个需求其实不用费劲一个个单元格迭代,用Pandas搭配Openpyxl就能很简洁地实现,效率还高!我给你详细说下两种方法,优先推荐第一种最优解:

方法一:用Pandas原生参数直接定位(推荐)

Pandas的to_excel方法本身就支持startrowstartcol参数,我们只需要先算准起始位置,就能直接把DataFrame写到目标区域,让右下角刚好落在D9。

步骤说明:

  1. 先明确你的DataFrame形状:你的df是3行2列(df.shape返回(3,2)
  2. 目标右下角是D9,对应Excel的1-based行号9,列号4(A=1、B=2、C=3、D=4)
  3. 倒推起始位置:
    • Pandas的startrow/startcol是0-based计数(Excel行1对应startrow=0),所以转换后:
      • 0-based起始行 = 9 - 3 = 6(对应Excel行7)
      • 0-based起始列 = 4 - 2 = 2(对应Excel列C)

完整代码:

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

火山引擎 最新活动