Совпадает с уникальным столбцом из двух файлов .xlsx, если обновление сопоставлено, иначе добавьте с помощью openpyxl - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть два файла Excel, master и child. Все имена столбцов одинаковы в обоих файлах.

Я хочу сопоставить столбец C обоих файлов, если есть совпадение, обновите все столбцы для этой указанной строки c и, если совпадение не найдено, добавьте строка в конце мастер-файла.

Я хочу обновить данные из дочернего файла в мастер-файл на основе этой логики c. До сих пор я могу обновить мастер-файл, скопировав все данные из дочернего в мастер, но данные в мастер-файле заменяются из дочернего файла для указанного диапазона. Мы будем благодарны за любую помощь.

import openpyxl 

Master = openpyxl.load_workbook("Master.xlsx")
Child = openpyxl.load_workbook("Child.xlsx")

Master_File = Master["Sheet1"]
Child_File = Child["Sheet1"]

Функция для копирования строк и столбцов из дочернего файла

def copyRange(startCol, startRow, endCol, endRow, sheet):
    rangeSelected = []
    #Loop through selected rows------------------------------------------------
    for i in range(startRow, endRow + 1, 1):
        #Appends to row selected list--------------------------------------------
        rowSelected = []
        for j in range(startCol, endCol + 1, 1):
            rowSelected.append(sheet.cell(row=i, column=j).value)
        #Adds the rowSelected list and nests inside rangesSelected list------------------------------
        rangeSelected.append(rowSelected) 
    return rangeSelected

Функция для вставки всех данных в Главный файл

def pasteRange(startCol, startRow, endCol, endRow, sheetReceiving, copiedData):
    countRow = 0
    for i in range(startRow, endRow + 1, 1):
        countCol = 0
        for j in range(startCol, endCol + 1, 1):

            sheetReceiving.cell(row=i, column=j).value = copiedData[countRow][countCol]
            countCol += 1
        countRow += 1

Основная функция

def createData():
    wb = Workbook()
    print("Your data is being Processed.....")
    selectedRange = copyRange(1,10,39,45, Child_File)
    pastingRange = pasteRange(1,10,39,45, Master_File, selectedRange)
    Master.save(r"Final.xlsx")
    print("Range copied and pasted")





Final = createData()

1 Ответ

0 голосов
/ 02 апреля 2020

Это демонстрирует, как вы можете взять два фрейма данных (которые могут быть созданы из .read_excel () в pandas), установить индексный столбец как столбец, с которым вы хотите сопоставить, и обновить оригинал совпадениями из второго фрейм данных, затем снова запишите в xlsx.

import pandas as pd
#df = pd.read_excel('myfile1.xlsx')
df = pd.DataFrame({'C': [1, 2, 3],
                   'D': [400, 500, 600]})
#new_df = pd.read_excel('myfile2.xlsx')
new_df = pd.DataFrame({'C': [1, 2, 6],
                       'D': [7, 8, 9]})

df.set_index('C', inplace=True)
df.update(new_df.set_index('C'))

df.update(new_df)

df.reset_index().to_excel('updated.xlsx', index=False)

Вывод

    C   D
0   1   8.0
1   2   9.0
2   3   600.0
...