Имитировать функцию копирования Excel или LibreOffice Calc с openpyxl и python3 (копировать со свойствами в новую позицию)

Есть ли способ имитировать функцию копирования "Excel" или "LibreOffice Calc", используя openpyxl и python3?

Я хотел бы указать определенный диапазон (например, "A1:E5") и скопировать "border", "alignment", "number_format", "value", "merged_cells", ... свойства каждой ячейки в другую позицию (и, возможно, на другой лист), в результате чего используемые формулы должны автоматически обновляться до новой позиции. Новые формулы предназначены для ссылки на ячейки в целевой таблице, а не на старые ячейки в исходной таблице.


Мой проект:

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

Копирование всего листа не является решением, потому что мне также нравится указывать положение таблицы отдельно для каждого листа. Таким образом, позиция на целевом листе может отличаться от позиции в шаблоне.


Мой текущий код (где формулы не обновляются автоматически):

import copy

# The tuple "topLeftCell" represents the assumed new position in the target worksheet. It is zero-based. (e.g. (0,0) or (7,3))
# "templateSheet" is the template from which to copy.
# "worksheet" is the target worksheet

# Create the same "merged_cells" as in the template at the new positioin
for cell_range in templateSheet.merged_cells.ranges:
    startCol, startRow, endCol, endRow = cell_range.bounds
    worksheet.merge_cells(start_column=topLeftCell[0] + startCol,
                           start_row=topLeftCell[1] + startRow,
                           end_column=topLeftCell[0] + endCol,
                           end_row=topLeftCell[1] + endRow)

colNumber = topLeftCell[0] + 1         # 1 is added up because topLeftCell is zero based.
rowNumber = topLeftCell[1] + 1         # 1 is added up because topLeftcell is zero based.

# Copy the properties of the old cells into the target worksheet
for row in templateSheet[templateSheet.dimensions]:
    tmpCol = colNumber                 # sets the column back to the original value
    for cell in row:
        ws_cell = worksheet.cell(column=tmpCol, row=rowNumber)

        ws_cell.alignment = copy.copy(cell.alignment)
        ws_cell.border = copy.copy(cell.border)
        ws_cell.font = copy.copy(cell.font)
        ws_cell.number_format = copy.copy(cell.number_format)
        ws_cell.value = cell.value

        tmpCol += 1                    # move one column further
    rowNumber += 1                     # moves to the next line



Поскольку копирование диапазонов на самом деле является обычной задачей, я предположил, что openpyxl предоставляет функцию или метод для этого. К сожалению, я не смог найти один до сих пор.
Я использую openpyxl версии 2.5.1 (и Python 3.5.2).

С наилучшими пожеланиями AFoeee

2 ответа

Решение

Поскольку кажется, что openpyxl не предоставляет общего решения моей проблемы, я поступил следующим образом:

Я создал шаблон со свойствами набора ячеек (границы, выравнивание, формат чисел и т. Д.). Хотя формулы вводятся в соответствующие ячейки, столбцы и строки заменяются местозаполнителями. Эти заполнители указывают смещение "нулевой точки".

Область шаблона копируется, как описано выше, но при копировании "cell.value", заполнитель используется для вычисления фактической позиции в целевой рабочей таблице.

С наилучшими пожеланиями
AFoeee

openpyxl позволит вам скопировать все рабочие листы в рабочую книгу. Этого должно быть достаточно для вашей работы, но если вам нужно больше, вам нужно будет написать свой собственный код.

Другие вопросы по тегам