Code: Select all
def single_merged( container ):
for entry in container:
for cell in entry.Cells:
if cell.IsMerged:
yield cell
def query_merged_cellranges(*_):
doc = XSCRIPTCONTEXT.getDocument()
sheets = doc.Sheets
REPORT = "MergeReport"
try:
sheets[REPORT].clearContents(-1)
except:
sheets.insertNewByName(REPORT,sheets.Count)
reports = []
for sheet in sheets[:-1]:
report = []
uniques = sheet.UniqueCellFormatRanges
for cell in single_merged(uniques):
cursor = sheet.createCursorByRange(cell)
cursor.collapseToMergedArea()
name = cursor.AbsoluteName.rpartition('.')[-1].replace('$','')
report.append(name)
report = [ sheet.Name, len(report)] + report
reports.append(report)
total = ['*Total*', sum( report[1] for report in reports)]
max_merged = max(report[1] for report in reports)
header = ['Sheet', '#Merges'] + list( f'#{n}' for n in range(1, max_merged+1))
finish = [ header]
finish.extend(reports)
finish.append(total)
finish = [line + ['']*(len(header)-len(line)) for line in finish]
out_sheet = doc.Sheets[REPORT]
(area:=out_sheet[:len(finish),:len(header)]).DataArray = finish
area.Columns.OptimalWidth = True