Python 我的第二套复制品很完美,但第一套什么都不做?

Python 我的第二套复制品很完美,但第一套什么都不做?,python,excel,vba,openpyxl,pywin32,Python,Excel,Vba,Openpyxl,Pywin32,所以我得到了几乎相同的不同块,第二个范围复制得很好,但第一个范围什么也不做。知道怎么回事吗?我已经尝试了我能想到的一切。我检查了宏,以确保它们在粘贴到工作簿后没有清除该范围,宏在执行任何操作之前都会停止,因为该范围为空 import win32com.client import openpyxl #1st range wb = openpyxl.load_workbook("C:/Users/tyler/Desktop/Beef Web/Export.xlsx") sheet = wb["E

所以我得到了几乎相同的不同块,第二个范围复制得很好,但第一个范围什么也不做。知道怎么回事吗?我已经尝试了我能想到的一切。我检查了宏,以确保它们在粘贴到工作簿后没有清除该范围,宏在执行任何操作之前都会停止,因为该范围为空

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()
您正在创建函数(
copyRange
pasteRange
createData
),然后为“第二次运行”重新创建它们。这不是一个好的编码实践,会造成意想不到的效果。我已经调整了您的代码,使每个函数只有一个定义。最后,当您调用
main
函数时,它将按照您指定的顺序执行代码,并且使用
createData
可以调用每个范围选择的值

导入win32com.client
导入openpyxl
#第一范围
wb=openpyxl.load_工作簿(“C:/Users/tyler/Desktop/Beef-Web/Export.xlsx”)
工作表=wb[“导出”]
template=openpyxl.load_工作簿(filename='C:/Users/tyler/Desktop/Beef-Web/Wall-Types-Live.xlsm',只读=False,保留=True)#添加文件名
临时工作表=模板[“原始导出”]
def复印范围(startCol、startRow、endCol、endRow、sheet):
rangeSelected=[]
表.取消合并单元格(开始行=开始列,开始列=开始列,结束行=结束行,结束列=结束列)
对于范围内的i(起始行、结束行+1):
rowSelected=[]
对于范围内的j(startCol,endCol+1):
rowSelected.append(sheet.cell(行=i,列=j).value)
rangeSelected.append(行已选)
返回选定范围
def粘贴范围(startCol、startRow、endCol、endRow、图纸接收、复印数据):
countRow=0
对于范围内的i(起始行、结束行+1):
countCol=0
对于范围内的j(startCol,endCol+1):
sheetReceiving.cell(行=i,列=j).value=copiedData[countRow][countCol]
countCol+=1
countRow+=1
def run_宏():
#运行宏
xl=win32com.client.Dispatch('Excel.Application')
xl.Workbooks.Open(Filename=r'C:\Users\tyler\Desktop\Beef-Web\Wall-Types-Live.xlsm',只读=0)
xl.Application.Run('Python'))
德尔xl
#第二范围
wb=openpyxl.load_工作簿(“C:/Users/tyler/Desktop/Beef-Web/Wall-Types-Live.xlsm”)
工作表=wb[“E1最终版”]
template=openpyxl.load_工作簿(“C:/Users/tyler/Desktop/Beef-Web/Export.xlsx”)
临时工作表=模板[“导出”]
def createData():
打印(“先处理…”)
selectedRange=copyRange(1,2,11100000张)
粘贴范围=粘贴范围(1,12,11100000,温度表,选定范围)
打印(“完成!”)
运行_宏()
打印(“第二次处理…”)
selectedRange=copyRange(1,1,19100000张)
粘贴范围=粘贴范围(1,1,19100000,温度表,选定范围)
template.save(“Finishtest.xlsx”)
打印(“完成!”)
如果名称=“\uuuuu main\uuuuuuuu”:
createData()

@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()

感谢您指出这一点,这是我用Python做的第一件事,所以我还是有点迷茫。我试过你的代码,但它仍然留下空白。以及它现在抛出的一个错误
AttributeError:“MergedCell”对象属性“value”是只读的
我无法调试,因为我没有您的Excel或模板文件,但您可以尝试使用
取消合并单元格
。我更新了上面的代码。好的,非常感谢。我会摆弄它,直到我让它运行,然后发布更新。