Как вы можете создать копию листа, перебирая другой, исключая при этом определенные строки в массиве? - PullRequest
1 голос
/ 28 марта 2019

Я сравниваю две книги с использованием Openpyxl. У меня есть увеличение счетчика для последующего использования, а затем отслеживание строк, которые должны быть удалены из начальной книги. Как мне избавиться от этих строк из этой книги или создать новый лист (с удаленным затем оригиналом) или книгу с удаленными этими строками?

Я написал код до этого момента, но я не нашел много в плане написания или удаления строк из рабочей книги, и у меня нет особой удачи, кто-то посоветовал мне вместо этого создать копию рабочей книги но я также не добился успеха в этом.

from openpyxl import load_workbook
from tkinter import Tk
from tkinter.filedialog import askopenfilename
import datetime
import time

class ManualReporter:
    def __init__(self):
        '''
        Initializes Variables for use within the Class
        Hides the tkinter pop-up when using the file dialog
        '''
        Tk().withdraw()
        self.sap_file = None
        self.tracker_file = None
        self.wb_sap = None
        self.wb_wt = None
        self.XT = 0
        self.deadrows = []


    def open_sapfile(self):
        '''
        Sets the sap_file variable to be the first  directory to the SAP Report based on what the User Selects in the File Dialog
        Sets that directory and the file as the current workbook under the variable self.wb_sap
        Creates a Backup of the SAP Report so that if Errors Occur a Fresh Clean Copy is Present
        '''
        self.sap_file = askopenfilename()
        self.wb_sap = load_workbook(filename=self.sap_file)
        # Code to create a backup File in-case of Error or Fault
        copyfile = "Untimed_Report_SAP_" + str(datetime.date.today())+".xlsx"
        self.wb_sap.save(copyfile)
        print(self.sap_file)
    def open_tracker(self):
        '''
        Same as Above, sets self.tracker_file as a filedialog which retrieves the file's directory (User Inputted)
        Loads the File Workbook as self.wb_wt
        Creates a Backup of the Second SAP Report so that if Error Occurs a Clean Copy is Present.
        '''
        self.tracker_file = askopenfilename()
        self.wb_wt = load_workbook(filename=self.tracker_file)
        print(self.tracker_file)
    def check_rows(self):
        '''
        Sets the Active Sheets in Both the Workbook Variables,
        Creates a New Sheet in the Newest Report to Contain the Modified Data,
        Iterates through the Rows of the Two Sheets checking for a Comparison in Part Number,
        OpCode and then Compares the X/T/P Classification and Adjusts Data in Second Sheet
        '''
        start = time.time()
        sap = self.wb_sap.worksheets[0] #Sets The First Sheet in the Excel Workbook as the variable sap
        wt = self.wb_wt.worksheets[0]#Sets the First Sheet in the Second Report as the var wt
        ws1 = self.wb_sap.create_sheet("Sheet1", 1)#Create a Spare Sheet in the First Report to place the Adjusted Data
        ws1 = self.wb_sap.worksheets[1]#Sets ws1 as the Active Second Sheet for New Data
        for saprow in sap.iter_rows():
            for wtrow in wt.iter_rows():
                if (saprow[3].value == wtrow[4].value and int(saprow[2].value) == int(wtrow[5].value)):#  IF Material NUM & OPCode MATCH DO:
                    if wtrow[7].value in ("T","P"): #WT Entry is Marked as T/P
                        if saprow[4].value is "X": #SAP Report Entry is Marked as X
                            self.XT += 1#Increment X->Ts Counts
                            #print("X->T")
                            self.deadrows.append(saprow)
                        else:
                            if saprow not in self.deadrows:
                                ws1.append(saprow)


        end = time.time()
        #print("Finished, Total X->Ts: ", self.XT)
        print("Time Taken: ", (end - start))



x = ManualReporter()
x.open_sapfile()
x.open_tracker()
x.check_rows()

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

                    self.deadrows.append(saprow)
                else:
                    if saprow not in self.deadrows:
                        for i in saprow:
                            #Code to Create a row in ws1.
                            #Code to Append value of saprow[i] to current ws1 rows

РЕДАКТИРОВАТЬ 1: Я включил свои попытки добавить строки в скопированный лист. РЕДАКТИРОВАТЬ 2: Я хотя и о ручной итерации по Сапроу и добавлению данных в строки нового листа, но я озадачился, думая об этом.

1 Ответ

1 голос
/ 10 апреля 2019

После полной справки я пришел к выводу, что для копирования данных с одного листа на другой вы можете копировать данные по строкам с помощью этого метода:

self.workbook = load_workbook(filename="filepath")
sheet1 = self.workbook.worksheet[0]
sheet2 = self.workbook.create_sheet("Sheet 2")
sheet2 = self.workbook.worksheets[1]
for row in sheet1.iter_rows():
    sheet2.append([cell.value for cell in row])

Я также выяснил, хотите ли вы отфильтровать данные, которые вы можете добавить в операторы if внутри цикла for, описанного выше, которые могут ограничить количество строк, в которые их ячейки записываются в новую рабочую таблицу.

self.RowsToExclude = Some List containing row data that will be excluded.
for row in sheet1.iter_rows():
    if row not in self.RowsToExclude:
        ws1.append([cell.value for cell in row])

Наконец, я хотел бы поблагодарить всех тех, кто помог мне прийти к такому выводу.

...