В настоящее время я работаю над проектом, который преобразует файл 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