Я написал код, который открывает файл шаблона Excel с поддержкой макросов (.xltm
), записывает фрейм данных pandas в определенное место в этом файле и сохраняет файл как обычную книгу с поддержкой макросов (.xlsm
). Некоторые ячейки кадра данных содержат строки, а другие — словари.
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
wb = openpyxl.load_workbook(stemplatepath, keep_vba=True)
ws = wb['Health']
rows = dataframe_to_rows(dflower, index=False, header=False)
for r_idx, row in enumerate(rows, 1):
for c_idx, value in enumerate(row, 1):
if isinstance(value, dict):
ws.cell(row=r_idx+10, column=c_idx, value=value['status'])
if value['comment']:
ws.cell(row=r_idx+10, column=c_idx).comment = value['comment'] # This line doesn't work
else:
ws.cell(row=r_idx+10, column=c_idx, value=value)
wb.template = False
wb.save(soutputpath)
В документации показан только синтаксис добавления комментариев по адресу:
comment = Comment("Text", "Author")
ws["A1"].comment = comment
Есть ли способ добавления комментариев по номеру строки и столбца, чтобы я мог сохранить его внутри цикла for?
То, что у вас есть, подойдет для определения координат ячейки, но вы неправильно добавляете комментарий к ячейке согласно документу;
Изменять
ws.cell(row=r_idx+10, column=c_idx).comment = value['comment'] # This line doesn't work
к
ws.cell(row=r_idx+10, column=c_idx).comment = Comment(value['comment'], "<author>")
или вы можете создать переменную для комментария, как показано
comment = Comment(value['comment'], "Author")
и применить это
ws.cell(row=r_idx+10, column=c_idx).comment = comment
Важная часть — значение, применяемое к атрибуту комментария ячейки, — это объект комментария Openpyxl, который имеет ряд атрибутов, а не просто строку.
Также не забудьте импортировать комментарий из Openpyxl, если вы его еще не включили.
from openpyxl.comments import Comment
Второе строковое значение должно быть автором комментария и должно быть включено.
Примечание; вы также можете указать размер комментария, высоту и ширину как целые числа;
ws.cell(row=r_idx+10, column=c_idx).comment = Comment(value['comment'], "<author>", 80, 40)