Задача по объединению нескольких .xlsx файлов в один в Python с помощью библиотеки openpyxl

Задача следующая: Главный бухгалтер компании "Рога и копыта" случайно удалил ведомость с начисленной зарплатой. К счастью, у него сохранились расчётные листки всех сотрудников. Помогите по этим расчётным листкам восстановить зарплатную ведомость. Архив с расчётными листками доступен по ссылке https://drive.google.com/drive/folders/1kg1CZ-ynVyElcYslOjOe0gGbBgFJz9Xr?usp=sharing

Ведомость должна содержать 1000 строк, в каждой строке должно быть указано ФИО сотрудника и, через пробел, его зарплата. Сотрудники должны быть упорядочены по алфавиту.

Я прекрасно вижу, что надо из каждого файла извлечь ячейки B2, D2 и объединить их в словарь или в отдельный .xlsx файл. Но я никак не могу найти инструкции в Интернет, как это сделать с помощью библиотеки openpyxl. Даже в официальной документации к этой библиотеке этого нет. Написание остального кода, я полагаю, не будет представлять для меня трудностей. Но вот объединение данных из файлов..... Кто знает, помогите, пожалуйста.


Ответы (4 шт):

Автор решения: MaxU

Приведу алгоритм решения вместо самого решения, т.к. в вопросе отсутствует попытка собственного решения.

  1. воспользуйтесь функцией glob.glob() или pathlib.glob() для того, чтобы прочитать все Execl файлы в список Pandas DataFrame.
  2. для каждого файла из списка, полученного в предыдущем шаге прочитайте Excel файл в Pandas DataFrame, пропустив ненужные строки и столбцы, воспользовавшись параметрами skiprows, usecols и header.
  3. объедините все получившиеся в предыдущем шаге DataFrame'ы в один, воспользовавшись методом pd.concat().

PS при желании, получится однострочное решение...

→ Ссылка
Автор решения: MaxU

Алгоритм решения на чистом Openpyxl:

  1. В цикле читаете две ячейки (B2 и D2) данных средствами Openpyxl из каждого файла в список списков - в каждом элементе внешнего списка будет два элемента - ФИО и сумма начисления.
  2. Создаете Pandas DataFrame из собранного списка списков
  3. Записываете получившийся на шаге 2. DataFrame в Excel файл. Ссылка на документацию по Openpyxl по работе с Pandas. В качестве альтернативы использованию Pandas, можно записывать собранные данные средствами Openpyxl вложенными циклами "по одной ячейке".
→ Ссылка
Автор решения: Irina

Изящного однострочного кода не получилось. Ну уж что получилось. Как и хотела, без pandas. Но пришлось использовать glob. Привожу код. Тестирующая система приняла ответ. Вывод ответа сделала на консоль.

import glob
import openpyxl

vedomost = {}

path = "C:\\Users\\Asus\\OneDrive\Masaüstü\\RogaiKopita"
file_identifier = "*.xlsx"

for f in glob.glob(path + "/*" + file_identifier):
    wb = openpyxl.load_workbook(f)
    sh = wb.active
    b = sh['B2'].value
    d = sh['D2'].value
    vedomost[b] = d
vedomost1 = sorted(vedomost.items())
for i in vedomost1:
    print(i[0], i[1])
→ Ссылка
Автор решения: Иришка
import openpyxl
vedomost = []
for i in range(1,1001):
    fname = str(i)+'.xlsx'
    wb = openpyxl.load_workbook(fname)
    sh = wb.active
    vedomost.append([sh.cell(row=2,column=2).value,sh.cell(row=2,column=4).value])

vedomost = sorted(vedomost)
for i in range(len(vedomost)):
    print((' ').join(map(str,vedomost[i])), sep='\n')
→ Ссылка