Есть ли способ скопировать объединенные ячейки с помощью Python (openpyxl)?

#python #excel #openpyxl

#python #excel #openpyxl

Вопрос:

Я пытаюсь создать код с использованием Python для многократного копирования определенного диапазона файлов Excel.

Как и в приведенном ниже файле изображения, то же содержимое копируется путем размещения нескольких столбцов на листе с существующим содержимым на том же листе.

введите описание изображения здесь

Несмотря на то, что это начальный уровень владения, сначала я полагал, что это будет действительно легко реализовать. И я реализовал большую часть своих планов с помощью приведенного ниже кода, за исключением объединенных ячеек

 import openpyxl
from openpyxl import Workbook
wb = openpyxl.load_workbook('DSD.xlsx')
ws = wb.worksheets[3]

from openpyxl.utils import range_boundaries
min_col, min_row, max_col, max_row = range_boundaries('I1')

for row, row_cells in enumerate(wb['2'], min_row):
    for column, cell in enumerate(row_cells, min_col):
        # Copy Value from Copy.Cell to given Worksheet.Cell
        ws.cell(row=row, column=column).value = cell.value
        ws.cell(row=row, column=column)._style = cell._style

wb.save('DSD.xlsx')
  

введите описание изображения здесь

Тем не менее, я искал несколько дней и думал об этом, но я не знаю, как объединить объединенные ячейки. Помимо этого, я даже не знаю, возможно ли это технически.

То, как я думал об этом сегодня, заключалось в том, чтобы извлечь список объединенных ячеек на листе, а затем добавить только дополнительные столбцы из координат каждой объединенной ячейки, чтобы добавить команды для объединения в том же объеме.

Однако, поскольку я вытащил список объединенных ячеек, как показано ниже, я не могу придумать, что делать. Есть ли способ?

 import openpyxl
from openpyxl import Workbook

wb=openpyxl.load_workbook('merged.xlsx')
ws=wb.active

Merged_Cells = ws.merged_cell_ranges

a = Merged_Cells[0]

print(ws.merged_cell_ranges)
print(a)
  
 [<MergedCellRange B2:C3>, <MergedCellRange B9:C9>, <MergedCellRange B13:B14>]
B2:C3
  

Значение B2: C3, соответствующее a, представляется специальным значением, в котором a.replace(~~) не работает, даже если значение похоже на «B2: C3».

Неужели нет никакого способа?

Ответ №1:

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

Следующее должно дать вам представление о том, как это сделать.

 from openpyxl.worksheet.cell_range import CellRange
area = CellRange("A1:F13") # area being copied

for mcr in ws.merged_cells:
    if mcr.coord not in area:
         continue
    cr = CellRange(mcr.coord)
    cr.shift(col_shift=10)
    ws.merge_cells(cr.coord)