我想构建一个函数,将excel中的公式字符串从绝对引用转换为相对引用

2024-06-13 08:27:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用python构建一个函数,将excel中的公式字符串从绝对引用转换为相对引用

比如,;假设公式“=SUM(A1:A15)”位于excel的A16单元格中,我希望函数接收公式字符串和公式编写位置(在本例中为A16单元格),并以R1C1引用样式输出公式,因此它将给出字符串“=SUM(R[-15]C:R[-1]C)”

我取得了以下进展:

我已将excel公式读入numpy数组,并将它们全部转换为字符串

wb = load_workbook(filename = r"C:\Form1.xlsx")
sheet_ranges = wb["Sheet1"]
df1 = pd.DataFrame(sheet_ranges.values)
    df1 = df1.astype(str)
    excelsheetdata_asNPA1= df1.to_numpy()

使用openpyxl.formula,我导入了标记器并定义了一个函数,该函数接受excel公式字符串并将公式字符串分解为其组成标记

from openpyxl.formula import Tokenizer   
def tok2 (c):
    this = Tokenizer(c)
    return this.items

我已经在包含excel公式的numpy数组中运行了该函数,并生成了一个列表的numpy数组(array2),每个列表都包含来自Tokeniser函数的项,即:值、类型和子类型

String_Of_Formula = np.vectorize(tok2)
array2 = String_Of_Formula (excelsheetdata_asNPA1)

我现在认为下一步是生成另一个与“array2”形状相同的数组,它包含相同的数据,但子类型=RANGE除外

excel中A16单元格中的公式“=SUM(A1:A15)”表示(15,0)处的数组2读取“[FUNC OPEN SUM(:,操作数范围A1:A17:,FUNC CLOSE:]”,我认为这是一个列表,但我不确定

我的困难是根据列表的内容访问该部分。因此,我想选择列表中包含单词“RANGE”的部分,在本例中,它将返回“操作数范围A1:A17”,然后我计划编辑它,使A1变成R[-15]C,A17变成R[-1]C。要进行此编辑,我还需要使用位置或索引??(15,0).

我认为array2包含列表,如上所述,array2(15,0)返回“[FUNC开和(:,操作数范围A1:A17:,FUNC闭]”

pull = [FUNC OPEN SUM(:, OPERAND RANGE A1:A17:, FUNC CLOSE ):]

pull [1]
Out[219]: OPERAND RANGE A1:A17:

pul2 = pull [1]

pul2 [1]
Traceback (most recent call last):

  File "<ipython-input-221-e68f9727e90f>", line 1, in <module>
    pul2 [1]

TypeError: 'Token' object is not subscriptable

我的array2中的最低级别是[Token],我需要关于如何搜索Token的内容并在将其放入新数组之前编辑该Token的帮助

非常欢迎您的帮助,谢谢


Tags: 函数字符串numpytoken列表a1range数组