openpyxl -> 将一片单元格写入新工作簿

openpyxl -> Write a slice of cells to new workbook

我通过从 150-2000 多个源 Excel 文档中截取前 20 行并将它们一起编译在一个文档中来生成大型数据集的摘要表。我希望减少一些编译时间。目前使用 python 的 openpyxl 模块来加载和收集我需要的片段,但我想做的是一次性将一个单元格片段//片段写入一个新的工作簿,而不是遍历每个单元格细胞单独。假设我将切片定义为:

sheetSlice=sh[f"A1:{chr(colcount-1+65)}{min(rowlim,rowcount)}"]

请原谅我设置切片符号的方式的丑陋

有什么方法可以将这个切片//一组单元格一次写入一个新的 openpyxl.Workbook() 对象?我找不到有关此类操作的任何文档。谢谢! xoxo

不,您必须逐个单元地访问它。但是,您可以使用列表推导和 ws.iter_rows() 编写一个函数来整齐地复制和粘贴一系列数据。

import openpyxl as op


def flatten(t):
    return [item for sublist in t for item in sublist]


def excel_copy_paste(
    ws_copy, ws_paste, row_min, row_max, col_min, col_max, paste_row=1, paste_col=1
):
    # Copying your range
    copy_range = flatten(
        [
            [cell.value for cell in row]
            for row in ws_copy.iter_rows(
                min_row=row_min, max_row=row_max, min_col=col_min, max_col=col_max
            )
        ]
    )
    paste_range = flatten(
        [
            [cell for cell in row]
            for row in ws_paste.iter_rows(
                min_row=paste_row,
                max_row=paste_row + row_max - row_min,
                min_col=paste_col,
                max_col=paste_col + col_max - col_min,
            )
        ]
    )
    for cell_copy, cell_paste in zip(copy_range, paste_range):
        cell_paste.value = cell_copy


# Workbook, worksheets
wb = op.load_workbook("EXAMPLE.xlsx")
ws = wb["All data"]
ws_new = wb["Sheet1"]

# Copy/paste
excel_copy_paste(ws, ws_new, row_min=1, row_max=5, col_min=1, col_max=7)

# Save
wb.save("EXAMPLE.xlsx")

请注意,这不会保留格式。