Openpyxl - 如何将数据范围从 excel 工作表复制到另一个
Openpyxl - How to copy data range from an excel worksheet to another
我正在尝试将基于行坐标的数据范围从 sheet 复制到另一个。
我有一个包含行坐标的列表
tbrow = [1, 34, 52, 75, 101]
我想做的是从以下位置复制行范围:
1 到 34 从 sheet 0 到 sheet 1,
34 到 52 从 sheet 0 到 sheet 2,
52 到 75 从 sheet 0 到 sheet 3,
75 到 101 从 sheet 0 到 sheet 4.
到目前为止我尝试的是以下内容:
-获取主sheet0
sheet0 = wb["Sheet"]
然后我将 sheet 存储在一个变量中,忽略第一个 sheet
sheets = wb.worksheets[1:]
最后,我尝试复制给定的值。
for i in range(tbrow[i],tbrow[i]+1)
for j in range(1,sheet0.max_column+1):
for k in sheets:
k.cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value
问题是我只将第一行复制到 sheet 的其余部分,而不是整个范围。 (1-34;34-52 等等)
我错过了什么?
谁能帮我组织一下这里的逻辑?或者提供解决方案?
谢谢!
UPDATE
另一种方法是对列表进行切片。
a,b = tbrow[:2]
for i in range(a,b):
for j in range(1,sheet1.max_column+1):
for k in sheets: k.cell(row=i, column=j).value = sheet1.cell(row=i, column=j).value
但这只需要列表的前两行坐标,我想转到列表中的下一项:
-从第一到第二
-从第二到第三
-从第三到第四
...等等 –
我注意到您的代码存在的问题是范围方法中 i
的值。 range 方法中的 i
与 for 循环中使用的 i
不同。我假设你必须有一个 i=0
的全局定义然后不更新,因此为什么只有第一行被复制到下一个 sheet.
for i in range(tbrow[i],tbrow[i]+1):#------here
for j in range(1,sheet0.max_column+1):
for k in sheets:
k.cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value
考虑使用可以传递行值的函数
def addRowsToSheet(lb,ub):
for i in range(lb,ub):#------here
for j in range(1,sheet0.max_column+1):
#consider using switch case, instad of the loop
switch (ub):
case 34:
sheets[0].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;
sheets[1].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;
case 52:
sheets[2].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;
#Do the same logic below
#calls
for i in range(0,len(tbrow)-1):
addRowsToSheet(tbrow[i],tbrow[i+1])
我正在尝试将基于行坐标的数据范围从 sheet 复制到另一个。
我有一个包含行坐标的列表
tbrow = [1, 34, 52, 75, 101]
我想做的是从以下位置复制行范围:
1 到 34 从 sheet 0 到 sheet 1,
34 到 52 从 sheet 0 到 sheet 2,
52 到 75 从 sheet 0 到 sheet 3,
75 到 101 从 sheet 0 到 sheet 4.
到目前为止我尝试的是以下内容:
-获取主sheet0
sheet0 = wb["Sheet"]
然后我将 sheet 存储在一个变量中,忽略第一个 sheet
sheets = wb.worksheets[1:]
最后,我尝试复制给定的值。
for i in range(tbrow[i],tbrow[i]+1)
for j in range(1,sheet0.max_column+1):
for k in sheets:
k.cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value
问题是我只将第一行复制到 sheet 的其余部分,而不是整个范围。 (1-34;34-52 等等) 我错过了什么?
谁能帮我组织一下这里的逻辑?或者提供解决方案?
谢谢!
UPDATE
另一种方法是对列表进行切片。
a,b = tbrow[:2]
for i in range(a,b):
for j in range(1,sheet1.max_column+1):
for k in sheets: k.cell(row=i, column=j).value = sheet1.cell(row=i, column=j).value
但这只需要列表的前两行坐标,我想转到列表中的下一项:
-从第一到第二
-从第二到第三
-从第三到第四
...等等 –
我注意到您的代码存在的问题是范围方法中 i
的值。 range 方法中的 i
与 for 循环中使用的 i
不同。我假设你必须有一个 i=0
的全局定义然后不更新,因此为什么只有第一行被复制到下一个 sheet.
for i in range(tbrow[i],tbrow[i]+1):#------here
for j in range(1,sheet0.max_column+1):
for k in sheets:
k.cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value
考虑使用可以传递行值的函数
def addRowsToSheet(lb,ub):
for i in range(lb,ub):#------here
for j in range(1,sheet0.max_column+1):
#consider using switch case, instad of the loop
switch (ub):
case 34:
sheets[0].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;
sheets[1].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;
case 52:
sheets[2].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;
#Do the same logic below
#calls
for i in range(0,len(tbrow)-1):
addRowsToSheet(tbrow[i],tbrow[i+1])