У меня есть два файла excel, главный и дочерний. Все имена столбцов одинаковы в обоих файлах.

Я хочу сопоставить столбец 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()
0
Aditya Aranya 2 Апр 2020 в 03:55
Не могли бы вы просто использовать pandas и выполнить .update() между двумя кадрами данных?
 – 
Chris
2 Апр 2020 в 04:06
Даже я обдумывал это. Я действительно запутался в том, следует ли изначально использовать pandas путем преобразования в dataframe, обновления значений, а затем использовать openpyxl для копирования и вставки данных. Как вы думаете, должен ли я реализовать все в pandas или использовать комбинацию openpyxl и pandas? Я слышал, что openpyxl и xlrd действительно хороши, когда дело доходит до файлов Excel, поэтому подумал о реализации в openpyxl.
 – 
StupendousEnzio
2 Апр 2020 в 04:14
Если вас не интересует форматирование ячеек, и такие старые добрые панды сделают свое дело
 – 
Chris
2 Апр 2020 в 04:24

1 ответ

Это демонстрирует, как вы можете взять два фрейма данных (которые оба могут быть созданы из .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
0
Chris 2 Апр 2020 в 04:19
Цените код. Я попытался реализовать и получил эту ошибку «ValueError: невозможно выполнить переиндексацию с дублирующейся оси». Я проверил, и это произошло из-за того, что в обоих файлах есть похожие столбцы. В stackoverflow они предлагают избавиться от повторяющихся столбцов. Вот ссылка - stackoverflow.com/questions/27236275/…
 – 
StupendousEnzio
2 Апр 2020 в 05:39