How to clear a range of values in an Excel workbook using OpenPyXl How to clear a range of values in an Excel workbook using OpenPyXl vba vba

How to clear a range of values in an Excel workbook using OpenPyXl


It seems that the library doesn't have a method to clear or set a range directly. So your best chance is probably to clear the value for each cell:

for row in ws['A1:G37']:  for cell in row:    cell.value = None


If you want to truncate (drop and recreate) a whole sheet, including styles, grid styles, everything else you can do it this way:

wb = load_workbook(filename = 'testing.xlsx')sheet_name = 'AR Cutoff'# index of [sheet_name] sheetidx = wb.sheetnames.index(sheet_name)# remove [sheet_name]# old versions: wb.remove(writer.book.worksheets[idx])# for new versions, tested with 3.0.3ws = wb.get_sheet_by_name(sheet_name)wb.remove(ws)# create an empty sheet [sheet_name] using old indexwb.create_sheet(sheet_name, idx)


This one works for me:

from openpyxl.utils import cols_from_range, range_boundariesdef range_contains(range_1, range_2):    """    Evaluates if a range contains another.    Args:        range_1 (str): Range to contain        range_2 (str): Range to be contained    Returns:        bool:    Examples:        >>> range_contains('A1:F6', 'B2:D3')        True        >>> range_contains('B2:D3', 'A1:F6')        False        >>> range_contains('A1:F3', 'B2:D6')        False        >>> range_contains('A1:F3', 'A1:F3')        True    """    bound_1 = range_boundaries(range_1)    bound_2 = range_boundaries(range_2)    if bound_1[0] <= bound_2[0] and bound_1[1] <= bound_2[1] and bound_1[2] >= bound_2[2] and bound_1[3] >= bound_2[3]:        return True    else:        return Falsedef delete_cells(worksheet, cell_range):    """    Removes cells from a worksheet (deletes value, conditional formatting, data validation and cell merging)    Args:        worksheet (Worksheet):        cell_range (str):    """    for column in cols_from_range(cell_range):        for cell_coordinates in column:            # Removing value            worksheet[cell_coordinates].value = None            # Removing style (applying the style of cell A1)            worksheet[cell_coordinates]._style = worksheet['A1']._style    # Removing conditionnal formatting    conditionnal_formattings = list(worksheet.conditional_formatting._cf_rules.keys())    for conditionnal_formatting in conditionnal_formattings:        ranges_to_keep = [x for x in conditionnal_formatting.cells.ranges                          if not range_contains(cell_range, x.coord)]        if len(ranges_to_keep) != 0:            conditionnal_formatting.cells.ranges = conditionnal_formatting.sqref.ranges = ranges_to_keep        else:            del worksheet.conditional_formatting._cf_rules[conditionnal_formatting]    # Removing data validation    for validation in worksheet.data_validations.dataValidation:        for validation_range in validation.cells.ranges:            if range_contains(cell_range, validation_range.coord):                validation.cells.ranges.remove(validation_range)    # Remove merge cells    merge_cells_ranges = [x.coord for x in worksheet.merged_cells.ranges]    for merged_cells_range in merge_cells_ranges:        if range_contains(cell_range, merged_cells_range):            worksheet.unmerge_cells(merged_cells_range)