【问题标题】:Openpyxl - How to copy data range from an excel worksheet to anotherOpenpyxl - 如何将数据范围从excel工作表复制到另一个
【发布时间】:2020-04-09 22:03:59
【问题描述】:

我正在尝试将基于行坐标的一系列数据从一个工作表复制到另一个工作表。

我有一个行坐标列表 tbrow = [1, 34, 52, 75, 101]

我想做的是从以下位置复制行范围:

从工作表 0 到工作表 1 的 1 到 34,

从表 0 到表 2 的 34 到 52,

52 到 75 从工作表 0 到工作表 3,

从工作表 0 到工作表 4 的 75 到 101。

到目前为止,我尝试了以下内容:

-获取主表0

sheet0 = wb["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

问题是我只将第一行复制到其余工作表而不是整个范围。 (1-34;34-52 等等) 我错过了什么?

谁能帮我在这里组织一个逻辑?或者提供解决方案?

谢谢!

更新

另一种方法是对列表进行切片。

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

但这只需要列表中的前两行坐标,我想转到列表中的下一项:

-从第一到第二

-从第二个到第三个

-从第三到第四

...等等——

【问题讨论】:

    标签: python excel openpyxl


    【解决方案1】:

    我注意到你的代码的问题是i 在 range 方法中的值。 range 方法中的i 与for 循环中使用的i 不同。我假设您必须有一个 i=0 的全局定义,然后不会更新,因此只有第一行被复制到下一张表。

    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])
    
    

    【讨论】:

    • 有什么方法可以获取列表中的下一个项目(就像您使用的:case (34,52..) 而不提及它们?考虑到我想在不查看列表的情况下自动递增值并命名它们。工作表也是如此。从第一个工作表复制到下一个工作表,然后从第一个工作表复制到下一个+1,依此类推。
    • 您可能需要有一个条件来确定要应用的工作表和行。您可以为此做的更改之一是在调用循环中将i 作为另一个参数传递。然后在函数中为 k 的值添加循环for k in range(0,len(new_param)-1): 使用 sheet[k] 来更新工作表。这次 switch 的 instewd 只使用 if 语句,例如如果 k
    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 2022-11-14
    • 2018-07-22
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多