python的PANDAS生成EXCEL如何设置相对地址

python的PANDAS生成EXCEL如何设置相对地址

在Python的Pandas库中,将DataFrame数据导出到Excel文件时,通常有两种地址引用方式:绝对引用和相对引用。默认情况下,Pandas在将DataFrame写入Excel文件时使用的是绝对引用。如果你想使用相对引用,可以通过一些额外的步骤来实现。

使用绝对引用

Pandas默认使用绝对引用,例如在公式中直接使用单元格的绝对地址(如$A$1),这在Excel中是有效的,但如果你想在Pandas中明确指定,可以直接在公式中使用:

import pandas as pd
 
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})
 
# 添加一个公式列,使用绝对引用
df['C'] = '=SUM(A1:B1)'
 
# 写入Excel文件
df.to_excel('output.xlsx', index=False)

使用相对引用(手动调整后写入)

如果你的需求是让Excel中的公式使用相对引用(例如A1B1等),你可以先将DataFrame写入Excel,然后使用openpyxl库去修改这些公式为相对引用。

首先,确保安装了openpyxl

pip install openpyxl

然后,使用以下代码:

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
 
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})
 
# 添加一个公式列,这里先使用绝对引用以便演示如何转换为相对引用
df['C'] = '=SUM(A1:B1)'
 
# 写入Excel文件
df.to_excel('output.xlsx', index=False)
 
# 加载工作簿并修改公式为相对引用
wb = load_workbook('output.xlsx')
ws = wb.active
 
for row in ws.iter_rows(min_row=2, values_only=False):  # 从第二行开始,避免标题行
    for cell in row:
        if 'formula' in cell:  # 检查单元格是否包含公式
            formula = cell.value[1:]  # 移除等号开头,得到原始公式字符串
            new_formula = f'=SUM({get_column_letter(cell.column-1)}{cell.row}:{get_column_letter(cell.column+1)}{cell.row})'  # 转换为相对引用公式
            cell.value = new_formula  # 更新公式
            cell.data_type = "f"  # 设置数据类型为公式
 
wb.save('output_modified.xlsx')  # 保存修改后的文件

注意:

  • 在上面的代码中,我们手动遍历每个单元格,检查是否包含公式,并修改为相对引用。这种方法适用于简单的列操作。对于更复杂的操作(例如跨多个列或行的操作),你可能需要更复杂的逻辑来动态生成新的公式。
  • 使用openpyxl修改公式时,我们通过get_column_letter()函数获取列的字母表示,并手动构建新的公式字符串。这种方法虽然可以工作,但对于复杂的表格操作来说可能不够灵活或高效。对于更高级的动态引用调整,可能需要编写更复杂的逻辑来处理不同的情况。
  • 如果你的数据集非常大或者需要频繁地进行此类操作,考虑是否有更高效的方法(例如在Excel中使用VBA宏或者通过Excel的其他高级功能来预先设置好公式)。在某些情况下,直接在Excel中设置好公式然后导入数据可能是一个更简单且高效的方法。