Python / Openpyxl копировать и вставлять столбцы с формулой - PullRequest
0 голосов
/ 12 октября 2019

У меня есть рабочая тетрадь с именем 1. Я хочу скопировать некоторые столбцы из листа № 1 и немного изменить порядок столбцов. Сначала я создаю новый лист с именем «Лист №2». Я могу копировать и вставлять с листа № 1 на лист № 2, но я нахожу openpyxl копирует формулы точно как есть, поэтому у меня есть проблема. Например, столбец O на листе № 1 имеет некоторую формулу, например:

O3 = (M3 * 1) + (N3 * 1)

Переместить столбецM на листе № 1 в столбец H на листе № 2 и переместите столбец N на листе № 1 в столбец I на листе № 2. Когда я перемещаю столбец O на листе № 1 в столбец M на листе № 2, у меня возникают проблемы. Во-первых, столбец M в формуле листа № 2 по-прежнему:

M3 = (M3 * 1) + (N3 * 1)

У меня есть круговая ссылкапроблема, так как я пытаюсь использовать себя, чтобы рассчитать себя. Во-вторых, если я переместлю столбец O на листе № 1 в столбец J на листе № 2, у меня не будет этой проблемы циклической ссылки, но моя формула все еще не работает.

Я используюследующий способ копирования и вставки:

for i in range(0, 1000):

     sheet_#2.cell(row=i,column=12).value = sheet_#1.cell(row=i,column=14).value

Я пытался data_only с true и false, когда я звоню load_workbook, следующим образом.

  my_workbook = openpyxl.load_workbook(args.input_file, data_only=False)

Ни то, ни другое не работает для меня. True получает все нули на листе № 1 и листе № 2. False возвращает мне проблему циклической ссылки, как описано выше.

Есть ли способ использовать пакет openpyxl для решения моей проблемы? Я думаю, что до тех пор, пока при копировании и вставке можно добавить имя листа для указания ячеек в формуле, моя проблема будет решена примерно так:

M3 = ("Лист № 1"M3 * 1) + («Лист № 1» N3 * 1)

Если openpyxl не выполняет работу, есть ли лучший пакет для решения этой проблемы? pandas?

1 Ответ

0 голосов
/ 12 октября 2019

Я начну с того, что скажу, что я не эксперт, но я попробую.

Звучит вопрос, который, кажется, может быть, вы не знакомы с пандами. Я бы занялся этим с пандами. Также сделайте некоторое дополнительное чтение на Пандах, это настолько сильно! Специально для автоматизации Excel.

import pandas as pd

# Read the excel sheets to Pandas DataFrames
DataFrame1 = pd.read_excel("FileName.xlsx", sheetname='sheet_number_1')
DataFrame2 = pd.read_excel("FileName.xlsx", sheetname='sheet_number_2')

Вы должны прочитать свой DataFrame № 2 и привести столбцы, которые НЕ содержат формулы из вашего DataFrame № 1 в первую очередь. .

#You can set columns equal to each other like this.
sheet2df['sheet_2_column_name'] = sheet1df['sheet_1_column_name']

Это перенесет все данные из любого выбранного столбца листа 1 в любой выбранный столбец листа 2.

Теперь для столбцов с формулами ... Вы упомянули, что формула (M3*1)+(N3*1) теперь станет (H3*1)+(I3*1) на вашем листе # 2. Я бы не стал приводить эти столбцы, используя вышеуказанный метод, вместо этого я бы сделал что-то вроде этого ...

#apply formula down each row in a column
DataFrame2['column_name_to_insert_formula_to'] = DataFrame2.apply(lambda row: '(H{}*1)+(I{}*1)'.format(row.name + 2), axis=1)

В этом случае вы можете оставить поле {} пустым. Эта формула будет перебирать номер строки в скобках {}. По сути, вы передаете .format(row.name +2), который в данном случае является вашим номером строки, в качестве параметра в скобках. Также мы используем axis = 1, потому что вы хотите применить его к каждой строке в столбце. axis = 1 сделает это за нас.

Подробнее о функции Pandas .apply из документации Pandas https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html

Подробнее о применении Apply и Lambda в Pandas https://towardsdatascience.com/apply-and-lambda-usage-in-pandas-b13a1ea037f7

...