Мой второй диапазон отлично копирует, но первый ничего не делает? - PullRequest
0 голосов
/ 03 февраля 2020

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

import win32com.client
import openpyxl

#1st range
wb = openpyxl.load_workbook("C:/Users/tyler/Desktop/Beef Web/Export.xlsx") 
sheet = wb["Export"] 


template = openpyxl.load_workbook(filename='C:/Users/tyler/Desktop/Beef Web/Wall Types Live.xlsm', read_only=False, keep_vba=True) #Add file name
temp_sheet = template["Raw Export"] 



def copyRange(startCol, startRow, endCol, endRow, sheet):
    rangeSelected = []

    for i in range(startRow,endRow + 1,1):

        rowSelected = []
        for j in range(startCol,endCol+1,1):
            rowSelected.append(sheet.cell(row = i, column = j).value)

        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():
    print("Processing first...")
    selectedRange = copyRange(1,2,11,100000,sheet) 
    pastingRange = pasteRange(1,12,11,100000,temp_sheet,selectedRange) 

    print("Complete!")

Go = createData()
#Run macros
xl=win32com.client.Dispatch('Excel.Application')
xl.Workbooks.Open(Filename=r'C:\Users\tyler\Desktop\Beef Web\Wall Types Live.xlsm', ReadOnly=0)
xl.Application.Run('Python')
del xl
#2nd range
wb = openpyxl.load_workbook("C:/Users/tyler/Desktop/Beef Web/Wall Types Live.xlsm") 
sheet = wb["E1 Final"] 


template = openpyxl.load_workbook("C:/Users/tyler/Desktop/Beef Web/Export.xlsx") 
temp_sheet = template["Export"] 



def copyRange(startCol, startRow, endCol, endRow, sheet):
    rangeSelected = []

    for i in range(startRow,endRow + 1,1):

        rowSelected = []
        for j in range(startCol,endCol+1,1):
            rowSelected.append(sheet.cell(row = i, column = j).value)

        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():
    print("Processing second...")
    selectedRange = copyRange(1,1,19,100000,sheet) 
    pastingRange = pasteRange(1,1,19,100000,temp_sheet,selectedRange) 

    template.save("Finishtest.xlsx")
    print("Complete!")

Go = createData()

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Вы создаете функции (copyRange и pasteRange и createData), а затем воссоздаете их для «второго запуска». Это не очень хорошая практика кодирования и приведет к неожиданным последствиям. Я изменил ваш код, чтобы иметь только одно определение каждой функции. В конце, когда вы вызываете функцию main, она выполнит код в указанном вами порядке, и, используя createData, вы можете вызвать значения для каждого выбора диапазона.

import win32com.client
import openpyxl

#1st range
wb = openpyxl.load_workbook("C:/Users/tyler/Desktop/Beef Web/Export.xlsx") 
sheet = wb["Export"] 


template = openpyxl.load_workbook(filename='C:/Users/tyler/Desktop/Beef Web/Wall Types Live.xlsm', read_only=False, keep_vba=True) #Add file name
temp_sheet = template["Raw Export"] 


def copyRange(startCol, startRow, endCol, endRow, sheet):
    rangeSelected = []
    sheet.unmerge_cells(start_row=startRow, start_column=startCol, end_row=endRow, end_column=endCol)
    for i in range(startRow,endRow + 1):

        rowSelected = []
        for j in range(startCol,endCol+1):
            rowSelected.append(sheet.cell(row = i, column = j).value)

        rangeSelected.append(rowSelected)

    return rangeSelected


def pasteRange(startCol, startRow, endCol, endRow, sheetReceiving,copiedData):
    countRow = 0
    for i in range(startRow,endRow+1):
        countCol = 0
        for j in range(startCol,endCol+1):
            sheetReceiving.cell(row = i, column = j).value = copiedData[countRow][countCol]
            countCol += 1
        countRow += 1

def run_macros():
    #Run macros
    xl=win32com.client.Dispatch('Excel.Application')
    xl.Workbooks.Open(Filename=r'C:\Users\tyler\Desktop\Beef Web\Wall Types Live.xlsm', ReadOnly=0)
    xl.Application.Run('Python')
    del xl
    #2nd range
    wb = openpyxl.load_workbook("C:/Users/tyler/Desktop/Beef Web/Wall Types Live.xlsm") 
    sheet = wb["E1 Final"] 


    template = openpyxl.load_workbook("C:/Users/tyler/Desktop/Beef Web/Export.xlsx") 
    temp_sheet = template["Export"] 



def createData():
    print("Processing first...")
    selectedRange = copyRange(1,2,11,100000,sheet) 
    pastingRange = pasteRange(1,12,11,100000,temp_sheet,selectedRange) 

    print("Complete!")

    run_macros()

    print("Processing second...")
    selectedRange = copyRange(1,1,19,100000,sheet) 
    pastingRange = pasteRange(1,1,19,100000,temp_sheet,selectedRange) 

    template.save("Finishtest.xlsx")
    print("Complete!")

if __name__ == "__main__":
    createData()
0 голосов
/ 04 февраля 2020

@ APhillips Я наконец запустил его. У openpyxl есть проблема, не связанная с моим кодом, поэтому я закончил весь процесс с win32com. вот рабочий код.

import win32com.client
import openpyxl

def CopyIn_run_macros():
    #Run macros
    xl=win32com.client.Dispatch('Excel.Application')
    BC=xl.Workbooks.Open('Processing File 1 Path')
    xl.Application.Run('Python2')
    EXP=xl.Workbooks.Open('Import Data File Path')
    print("Importing Export To Processing Sheet....")
    EXP.Sheets('Sheet1').Range('A2:K100000').Copy()
    BC.Sheets('Sheet1').Paste(BC.Sheets('Sheet1').Range('A12'))
    EXP.Close(True)
    print("Complete.")
    print("Running Macros....")
    xl.Application.Run('Python')
    print("Complete.")
    print("Exporting Export Processed Data....")
    FIN=xl.Workbooks.Open('C:/Users/tyler/Desktop/Beef Web/Finish.xlsx')
    BC.Sheets('Sheet2').Range('A1:T100000').Copy()
    FIN.Sheets('Sheet1').Paste(FIN.Sheets('Sheet1').Range('A1'))
    BC.Sheets('Sheet3').Range('A1:H100000').Copy()
    FIN.Sheets('Sheet2').Paste(FIN.Sheets('Sheet2').Range('A1'))
    BC.Sheets('Sheet4').Range('A1:AG100000').Copy()
    FIN.Sheets('Sheet3').Paste(FIN.Sheets('Sheet3').Range('A1'))
    FIN.Close(True)
    print("Complete.")
    del xl


CopyIn_run_macros()
...