OpenPyxl, зациклите формулу по столбцам, используя .format()?

#python #pandas #openpyxl

Вопрос:

Я использую openpyxl для создания файлов Excel из Python. Я хочу взять фрейм данных pandas, вставить его в электронную таблицу, а затем суммировать столбцы A, B и C с помощью цикла for. (формула в ячейках A5, B5 и C6 ). Однако я не знаю, как изменить строку формулы в цикле, поэтому я суммирую правильный столбец.

 data = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                   columns=['a', 'b', 'c'])

data

wb1 = openpyxl.Workbook()
ws1 = wb1.active

rows = dataframe_to_rows(data, index=False, header=False)
for r_idx, row in enumerate(rows, 2):
    for c_idx, value in enumerate(row, 1):
        ws1.cell(row=r_idx, column=c_idx, value=value)

for col in ws1.iter_cols(min_row=5, max_row=5, min_col=1, max_col=3):
    for cell in col:
        cell.value = '=SUMMA(A2:A4)' # can I use .format() here in a smart way so A2:A4 changes to # B2:B4 and so on?         
        
wb1.save('test.xlsx')
 

Ответ №1:

Это должно сработать:

 for col in ws1.iter_cols(min_row=5, max_row=5, min_col=1, max_col=3):
    for cell in col:
        cell.value = '=SUMMA({0}2:{0}4)'.format(cell.column)
 

Комментарии:

1. Мило! Однако это возвращает ошибку. Возможно, потому, что мой итератор col не возвращает ни одного числа, вместо этого col печатает (<Ячейка «Лист». A5>,), (<Ячейка «Лист». A5><Ячейка «Лист». B5>,) (<Ячейка «Лист».B5><Ячейка «Лист».C5>,)’

2. Наверное, так оно и есть. Я немного обновлю свой ответ.

3. Блестяще! Большое спасибо!

4. Вы можете сделать это без вашего собственного хрупкого счетчика и преобразователя: ячейки с сообщением вам их column_letter

5. Почему я получаю «@» после = ??