Задача по объединению нескольких .xlsx файлов в один в Python с помощью библиотеки openpyxl
Задача следующая: Главный бухгалтер компании "Рога и копыта" случайно удалил ведомость с начисленной зарплатой. К счастью, у него сохранились расчётные листки всех сотрудников. Помогите по этим расчётным листкам восстановить зарплатную ведомость. Архив с расчётными листками доступен по ссылке https://drive.google.com/drive/folders/1kg1CZ-ynVyElcYslOjOe0gGbBgFJz9Xr?usp=sharing
Ведомость должна содержать 1000 строк, в каждой строке должно быть указано ФИО сотрудника и, через пробел, его зарплата. Сотрудники должны быть упорядочены по алфавиту.
Я прекрасно вижу, что надо из каждого файла извлечь ячейки B2, D2 и объединить их в словарь или в отдельный .xlsx файл. Но я никак не могу найти инструкции в Интернет, как это сделать с помощью библиотеки openpyxl. Даже в официальной документации к этой библиотеке этого нет. Написание остального кода, я полагаю, не будет представлять для меня трудностей. Но вот объединение данных из файлов..... Кто знает, помогите, пожалуйста.
Ответы (4 шт):
Приведу алгоритм решения вместо самого решения, т.к. в вопросе отсутствует попытка собственного решения.
- воспользуйтесь функцией
glob.glob()илиpathlib.glob()для того, чтобы прочитать все Execl файлы в список Pandas DataFrame. - для каждого файла из списка, полученного в предыдущем шаге прочитайте Excel файл в Pandas DataFrame, пропустив ненужные строки и столбцы, воспользовавшись параметрами
skiprows,usecolsиheader. - объедините все получившиеся в предыдущем шаге DataFrame'ы в один, воспользовавшись методом
pd.concat().
PS при желании, получится однострочное решение...
Алгоритм решения на чистом Openpyxl:
- В цикле читаете две ячейки (B2 и D2) данных средствами Openpyxl из каждого файла в список списков - в каждом элементе внешнего списка будет два элемента - ФИО и сумма начисления.
- Создаете Pandas DataFrame из собранного списка списков
- Записываете получившийся на шаге 2. DataFrame в Excel файл. Ссылка на документацию по Openpyxl по работе с Pandas. В качестве альтернативы использованию Pandas, можно записывать собранные данные средствами Openpyxl вложенными циклами "по одной ячейке".
Изящного однострочного кода не получилось. Ну уж что получилось. Как и хотела, без 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')