如何使用 Openpyxl 获取当前行索引

新手上路,请多包涵

我编写了一个 Python 脚本来从 .json 文件中提取一些字符串值,将它们存储在一些字典中并使用我第一次使用的 Openpyxl 将它们填充到 .xlsx 文件中:

简而言之,它看起来像这样:

 WORKBOOK = Workbook()
WORKSHEET = WORKBOOK.active
. . .
. . .
for PERSON in TEAM_LIST:
    for ITEM in ITEMS[PERSON]:
       if PERSON in REGULAR_LIST:
          PERSON_ITEMS_ROW = (PERSON,ITEM[0],ITEM[1],ITEM[2],ITEM[3],ITEM[4)]
          SHEET.append(PERSON_ITEMS_ROW)    # Fill each row with some PERSON ITEMS
      else:
        PERSON_ITEMS_ROW = (PERSON,ITEM[0],ITEM[1],ITEM[2],ITEM[5],ITEM[6])
        SHEET.append(PERSON_ITEMS_ROW)      # Fill each row with other PERSON ITEMS

这段代码运行良好(虽然我不是 100% 确定它是正确的)

我想更改在上面“其他”部分中选择的行的背景和前景色,但我没有设法找到一种方法;

我知道如何将特定颜色和字体应用于特定行:我为用作标题行的第一行执行此操作,但我不知道如何获取当前行索引,因此我可以在每个行上应用特定颜色和字体“其他”部分的行

欢迎任何想法

谢谢

原文由 bigstyx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

您正在寻找 ws._current_row

注意ws._current_row 仅在插入新单元格后有效。

你可以这样做:

     ...
    SHEET.append(PERSON_ITEMS_ROW)
    # For all cells in ws._current_row
    for row_cells in ws.iter_rows(min_row=ws._current_row,  max_row=ws._current_row):
        for cell in row_cells:
            cell.font = Font(color=colors.GREEN, italic=True)

    # Only for cell in column A == 1
    ws.cell(row=ws._current_row, column=1).font = Font(color=colors.RED)

如果您 不想 使用不受支持的 ws._current_row

     # Assume you start in row==2
    for ws_current_row, PERSON in enumerate(TEAM_LIST, 2):
        #...
        #SHEET.append(PERSON_ITEMS_ROW)

        # For all cells in ws_current_row
        for row_cells in ws.iter_rows(min_row=ws_current_row, max_row=ws_current_row):
            for cell in row_cells:
                cell.font = Font(color=colors.GREEN, italic=True)

        # Only for cell in column A == 1
        ws.cell(row=ws_current_row, column=1).font = Font(color=colors.RED)

OOP 解决方案,或 openpyxl 可以实现它。

例如:

     from openpyxl.workbook.workbook import Workbook as _Workbook
    from openpyxl.worksheet.worksheet import Worksheet as _Worksheet

    class Worksheet(_Worksheet):
        # Overload openpyxl.Worksheet.append
        def append(self, iterable):
            super().append(iterable)
            return self._current_row, \
                   self._cells_by_col(min_col=1, min_row=self._current_row,
                                      max_col=self.max_column, max_row=self._current_row)

    class Workbook(_Workbook):
        # Workaround, as openpyxl is not using self.create_sheet(...) in __init__
        def __init__(self, write_only=True):
            super().__init__(write_only)
            self.__write_only = False
            self.create_sheet()

        # Not working for self.read_only and self.write_only :
        # Overload openpyxl.Workbook.create_sheet
        def create_sheet(self, title=None, index=None):
            new_ws = Worksheet(parent=self, title=title)
            self._add_sheet(sheet=new_ws, index=index)
            return new_ws

    for PERSON in TEAM_LIST:
        # ...
        ws_current_row, iter_col = SHEET.append(PERSON_ITEMS_ROW)

        # Iterate all cells from generator iter_col
        for cell in [col_cells[0] for col_cells in iter_col]:
            cell.font = Font(color=colors.RED, italic=True)

        # Only for cell in column A == 1
        ws.cell(row=ws_current_row, column=1).font = Font(color=colors.BLUE)

使用 Python:3.4.2 测试 - openpyxl:2.4.1 - LibreOffice: 4.3.3.2

OpenPyXL 文档

原文由 stovfl 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想分享一个简单的解决方案,用于在使用 ws.iter_rows() 方法迭代行时获取行号。我正在使用行元组中的第一个对象,它是一个单元格,因此它也有关于它的行和列的信息。

 for row in ws.iter_rows(min_row=1, max_row=ws.max_rows):
    print('Row number:', str(row[0].row))

原文由 Kietna Qu‘tak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏