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或模板文件,但您可以尝试使用取消合并单元格
。我更新了上面的代码。好的,非常感谢。我会摆弄它,直到我让它运行,然后发布更新。