J'ai un classeur sur lequel j'aimerais effacer une plage de valeurs avec OpenPyXI. Jusqu'à présent, je donne les résultats suivants:
# Import OpenPyXl module.
from openpyxl import load_workbook
# Load workbook.
wb = load_workbook(filename = 'testing.xlsx')
# Make a variable with a worksheet you want to view/modify.
sheet = wb['AR Cutoff']
# Change value of A3.
sheet['A3'] = 'Assigned value'
En bref, j'essaie de faire dans OpenPyXL la même chose que le VBA suivant:
Worksheets("Sheet1").Range("A1:G37").Clear
Je vous remercie!
Il semble que la bibliothèque ne dispose pas d'une méthode pour effacer ou définir directement une plage. Donc, votre meilleure chance est probablement d'effacer la valeur pour chaque cellule:
for row in ws['A1:G37']:
for cell in row:
cell.value = None
Si vous voulez tronquer (supprimer et recréer) une entier feuille, y compris les styles, les styles de grille, tout le reste vous pouvez le faire de cette façon:
wb = load_workbook(filename = 'testing.xlsx')
sheet_name = 'AR Cutoff'
# index of [sheet_name] sheet
idx = wb.sheetnames.index(sheet_name)
# remove [sheet_name]
wb.remove(writer.book.worksheets[idx])
# create an empty sheet [sheet_name] using old index
wb.create_sheet(sheet_name, idx)
Celui-ci fonctionne pour moi:
from openpyxl.utils import cols_from_range, range_boundaries
def 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 False
def 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)