Как получить доступ к отдельным ячейкам в openPyXL (лучше время выполнения) при форматировании ячеек - PullRequest
0 голосов
/ 27 января 2020

В настоящее время я работаю над проектом, который преобразует файл Excel в AODA-совместимую и лучше отформатированную версию.

Одной из функций является установка границ таблицы. В настоящее время он обращается к отдельным ячейкам, определяет углы и заголовки, чтобы применить толстую рамку, и все, что внутри, является чем-то более тонким.

Я прикрепил код, но этот код имеет время выполнения 45 секунд для листа с ячейками около 355 КБ , Это немного медленно. Как я могу сделать это быстрее?

... other functions

def setBorder(sh, sheetRange, emptyRowList):
    cellRange = getNewSheetRange(False, sheetRange, emptyRowList)
    print("cR: ", cellRange)
    rows = sh[cellRange]

    # gets the header row
    DataRow = getRow(sheetRange['beginData'])
    HeaderRow = getRow(sheetRange['beginHeader'])

    # formats headers with thick borders
    headerRow = DataRow - HeaderRow
    print("hR:", headerRow)

    borderHeight = 25

    hair = Side(border_style='hair', color='d3d3d3')
    thick = Side(border_style='thick', color='a9a9a9')
    alignV = Alignment(vertical='center')
    # alignH = Alignment(horizontal='center')
    align = Alignment(vertical='center', horizontal='center')

    maxRow = len(rows)  # index of the last row
    # print("MaxRow", maxRow)
    for row, cells in enumerate(rows, 1):
        # print("PosRow, cells: ", row, cells)
        maxCol = len(cells)  # index of the last cell
        # print("MaxCol", maxCol)
        for col, cell in enumerate(cells, 1):
            # print("PosCol, cell: ",  col, cell)

            sh.row_dimensions[cell.row].height = borderHeight
            cell.alignment = alignV

            if col != 1:
                cell.alignment = align

            border = Border(
                left=hair,
                right=hair,
                top=hair,
                bottom=hair
            )

            # applies thick border on corners
            if col == 1:
                border.left = thick
            if col == maxCol:
                border.right = thick
            if row == 1:
                border.top = thick
            if row == maxRow:
                border.bottom = thick
            # applies thick border on header rows
            if row == headerRow:
                border.top = thick
                border.bottom = thick
                cell.font = Font(bold=True)

            cell.border = border

    sh.row_dimensions[sh.max_row + 1].height = borderHeight


def convertSheet(sh, sheetRange):
    mergedRangeList = sh.merged_cells.ranges  # detect all merge cells and get the merge range
    mergeCount = len(mergedRangeList)  # count number of merged cells

    # store the mergeRangeList before it gets unmerged
    newMergedRangeList = []

    # un-merges merged cells
    counter = mergeCount
    while counter > 0:
        newMergedRangeList.append(mergedRangeList[counter - 1])
        sh.unmerge_cells(str(mergedRangeList[counter - 1]))
        counter -= 1

    # returns list of empty rows while writing "No Data" and "End of Column" appropriately
    emptyRowList = checkEmptyRows(sh, sheetRange)

    # deletes empty rows from emptyRowList
    deleteEmptyRows(sh, emptyRowList)

    # sets the border around Data Segment
    borderTop = getRow(sheetRange['beginHeader'])
    borderBottom = getRow(sheetRange['endData'])
    print("Border T/B: ", borderTop, borderBottom)

    # copies merged cell value across the range
    populateGroups(sh, newMergedRangeList, mergeCount, emptyRowList, borderTop, borderBottom)

    # inserts Screen Reader messages
    insertScreenReader(sh, sheetRange)

    # formats table into a Table format with the correct header
    convertTable(sh, sheetRange, emptyRowList)

    # formats whole table with borders
    start = timeit.default_timer()
    setBorder(sh, sheetRange, emptyRowList)
    stop = timeit.default_timer()
    print('Time: ', stop - start)

... main
...