如何使用openpyxl像在Excel文件中一样进行“选择”和“填充”

问题描述 投票:0回答:1

我使用 openxpyxl 进行了许多操作,取得了很大的成功。 我有一个日期、数字和公式表,我在表中插入一个新行并输入一些简单的数据(日期、名称、金额),但我在处理具有简单公式(如单元格 F7 为 '=F6)的列时遇到问题+C7'。 F8 将是“=F7+C8”等。 当我在表中间插入新(空)行时,插入行下方的行不会使用正确的索引进行更新。 例如,F24 变为“=F22+C23”,而不是像我在电子表格中使用 Excel“向下填充”时那样递增到“=F23+C24”。 所以我正在寻求帮助使其发挥作用。 我已经尝试了这里显示的很多东西:

for语句的基本内容是:

for row in range(8, finalrow + 1):
    cell_value = f"=F{row-1} + C{row}"
    print("cell formula", cell_value)

我已经尝试过以下每一项:

  1. worksheet2.cell(行=行,列=6,值=form_data['cell_value']).font=red_font

  2. worksheet2.array_formulae["F{row}"] = "=F{row-1} + C{row}"

  3. worksheet2.cell(行=行,列=6,值=“=F{行-1} + C{行}”).font = red_font

  4. worksheet2.cell(行=行,列=6,值=form_data[f"=F{row-1} + C{row}"]).font = red_font

  5. worksheet2[f"C{row}"] = Translator("=B6/$F$3)", origin="c7").translate_formula(f"C{row}") 评论 5) - 我相信 Translator 是我想要使用的命令,但我无法理解如何在这种情况下使用它作为填充。 对于此 Translator 行,我收到此错误消息 File "C:\C Drive Documents\Pete Home\Python Excel ond-input.py", line 292, in worksheet2[f"F{row}"] = Translator("=C8+F7)", origin="F7").translate_formula(f"F{row}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“C:\ Users \ laroc \ AppData \ Local \ Programs \ Python \ Python312 \ Lib \ site-packages \ openpyxl ormula ranslate.py”,第50行,在init中 self.tokenizer = Tokenizer(公式) ^^^^^^^^^^^^^^^^^^^ 文件“C:\Users\laroc\AppData\Local\Programs\Python\Python312\Lib\site-packages\openpyxl ormula okenizer.py”,第 53 行,位于 init self._parse() 文件“C:\ Users \ laroc \ AppData \ Local \ Programs \ Python \ Python312 \ Lib \ site-packages \ openpyxl ormula okenizer.py”,第87行,在_parse中 self.offset +=dispatchercurr_char ^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“C:\ Users \ laroc \ AppData \ Local \ Programs \ Python \ Python312 \ Lib \ site-packages \ openpyxl ormula okenizer.py”,第246行,在_parse_closer中 token = self.token_stack.pop().get_closer() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ IndexError:从空列表中弹出

  6. 我使用 xlswrite 包看到了这个解决方案 - 但 xlswriter 无法打开现有的 .xlsx 文件进行编辑,因此我无法使用它。

worksheet2.write_formula(f"f{row}", 'cell_value') # 来自 xlxwriter

因此,任何使用 openpyxl 进行“选择”和“填充”的创造性解决方案我都会很感激,或者我尝试中的任何语法更正都会有用。

顺便说一句 - 我不知道如何开始,所以我让 ChatGPT 生成代码,这就是我开始的方式,但该解决方案不起作用。

select openpyxl fill
1个回答
0
投票

使用

Translate
将是正确的方法。

让我们通过一个简单的例子来了解它是如何工作的。

鉴于以下

source.xlsx

enter image description here

...以下代码:

from openpyxl import load_workbook
from openpyxl.formula.translate import Translator

def insert_row_adjust_formulas(ws, row, value):
    ws.insert_rows(row)
    ws[f'C{row}'] = value
    formula_origin = f'F{row-1}' # the formula origin is cell abowe the inserted cell 
    formula_string = ws[formula_origin].value
    last_row = len(ws['F'])
    for rw in range(row, last_row+1):
        #              Translate the formula string of given formula origin to the new cell
        ws[f'F{rw}'] = Translator(formula_string, formula_origin).translate_formula(f'F{rw}')

wb = load_workbook(filename = 'source.xlsx')
ws = wb.active

insert_row_adjust_formulas(ws, 7, 12.5)

wb.save('result.xlsx')

...导致以下

result.xlsx

enter image description here

代码是不言自明的,并在必要时进行了注释。

© www.soinside.com 2019 - 2024. All rights reserved.