openpyxl - "复制/粘贴"细胞范围

时间:2018-03-27 16:28:55

标签: python copy-paste openpyxl excel-automation

我是Python新手,我尝试使用openpyxl库调整我的一些VBA代码。在这种特殊情况下,我尝试根据标题中的字符串从工作簿中复制单个列中的468行,并将它们粘贴到具有另一个特定字符串作为标题的特定列中的另一个工作簿中。我不能简单地选择我要复制的单元格范围,因为这是报表自动化的一部分,标题会更改文件到文件的位置。

我需要使用什么功能将468个单元格中的每一个从一个工作簿复制到第二个工作簿的468个单元格中?或者,我如何复制一系列单元格,然后将它们粘贴到另一个工作簿中?这是我的代码,我确切地知道错误:我将一个单元格(第一个工作簿中的最后一个)重复复制到第二个工作簿的468个单元格中。

// SECOND VIEW CONTROLLER

import Cocoa

class SecondViewController: NSViewController {

    var imagesQty = 30  

    override func viewWillAppear() {

    super.viewWillAppear()
    self.view.wantsLayer = true

    print("viewWillAppear – Qty:\(imagesQty)")

    //let arrayOfViews: [NSImageView] = [view01...view12]

    let url = URL(fileURLWithPath: NSHomeDirectory()).appendingPathComponent("Desktop/ArrayOfElements")
    do {
        let fileURLs = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles]).reversed()
        let photos = fileURLs.filter { $0.pathExtension == "jpg" }

        for view in arrayOfViews {
            //"imagesQty" is here
            let i = Int(arc4random_uniform(UInt32(imagesQty-1)))
            let image = NSImage(data: try Data(contentsOf: photos[i]))
            view.image = image
            view.imageScaling = .scaleNone
        }
    } catch {
        print(error)
    }
}

2 个答案:

答案 0 :(得分:0)

您可能需要将输入翻转为.cell(column, row),我猜是.cell(column=z, row=o)。或者只使用关键字for o in range(2, 469): #note the common o for both, could also be o+1 for one if there is an offset ws2.cell(o, z).value = ws1.cell(o, y).value

您需要两个行迭代器的动态索引,同时保持列索引的位置:

<ComboBox   
            Name="cmComp"
            MinWidth="150"
            Margin="12 0 0 12"
            ItemsSource="{Binding SelectedComponentLookup}"
            DisplayMemberPath="ComponentChoice"
            SelectedValuePath="ComponentChoice"
            SelectedItem="{Binding ComponentChosen}">
</ComboBox>

答案 1 :(得分:0)

创建这样的函数实际上很容易:

from openpyxl.utils import rows_from_range

def copy_range(range_str, src, dst):

    for row in rows_from_range(range_str):
        for cell in row:
            dst[cell].value = src[cell].value

    return

请注意,range_str是一个常规字符串,例如“ A1:B2”,并且src和dest都必须是有效的工作表对象。但是,如果您要复制较大的范围,则可能需要一段时间,因为读/写操作似乎很耗时。