尝试使用cell.offset在源工作表和目标工作表具有不同起始行的工作表之间进行复制

问题描述 投票:1回答:1

openpyxl的单元模块具有属性偏移量:https://openpyxl.readthedocs.io/en/stable/api/openpyxl.cell.cell.html

offset(row=0, column=0)[source]
Returns a cell location relative to this cell.

Parameters: 
row (int) – number of rows to offset
column (int) – number of columns to offset
Return type:    
openpyxl.cell.Cell

[我正在尝试了解如何使用cell.offset(如上所述)将数据从源工作表复制到源工作表,源工作表从A列的第2行开始,到目标工作表从A列的第7行开始。

我实际上可以通过以下不同方法来实现:

row_offset=5
for rows in ws2.iter_rows(min_row=2, max_row=None, min_col=1, max_col=1):
    for cell in rows:
        ws3.cell(row=cell.row + row_offset, column=1, value=cell.value)
        wb3.save('C:\\folder\\destOutputOffsetby5.xlsx')

以上将数据从第2行的ws2复制到第7行的ws3(由于偏移量5)。

但是我想将“单元”模块的“偏移”属性用于我自己的培训/学习目的。

如何用偏移量模块替换上面的内容?

这是我到目前为止的内容:

for row in ws2.iter_rows(min_row=2, max_row=None, min_col=1, max_col=1):    
    for cell in row:
        foo = cell.offset(row=5, column=0)

如果我随后运行:

"print(foo)"

我得到了正确的偏移量起始行以及其他行(此处未显示所有行):

<Cell 'report1570826222449'.A7>
<Cell 'report1570826222449'.A8>
<Cell 'report1570826222449'.A9>

依此类推。

如果我跑步

print(foo.value)

我当然会得到数据本身:

2019-10-03 00:00:00
2019-10-02 00:00:00

依此类推。

但是我不知道将foo(或foo.value?)从ws2复制到ws3。我尝试的每种方法都只会忽略cell.offset并将其写入目标工作表A列,该列从第2行而不是第7行开始。

ws3正在:

wb3 = load_workbook('C:\\folder\\DetOutPutOffset5.xlsx')
ws3 = wb3['Sheet2']

这不会复制任何数据,因为在ws3中实际上没有任何更改。

for rows in ws2.iter_rows(min_row=2, max_row=None, min_col=1, max_col=1):
    for cell in rows:
        cell.offset(row=5, column=0)
        wb3.save('C:\\folder\\Destfile.xlsx')

还有这个:

for rows in ws2.iter_rows(min_row=2, max_row=None, min_col=1, max_col=1):
    for cell in rows:
        ws3.cell.offset(row=5, column=0)
        wb3.save('C:\\folder\\Destfile.xlsx')

引发异常

AttributeError: 'function' object has no attribute 'offset'

有什么建议吗?我觉得我只是在这里缺少一些基本概念来弥合ws2和ws3之间的差距。预先感谢!

python openpyxl python-3.7
1个回答
0
投票

这将从ws1的行偏移ws2 5行上的值:

from openpyxl import load_workbook

wb = load_workbook("copies.xlsx")
ws1 = wb.worksheets[0]
ws2 = wb.worksheets[1]

# Get the row
for rows in ws1.iter_rows(min_row=2, max_row=None, min_col=1, max_col=1):
    # Get the cell
    for cell in rows:
        # offset the values for cells on ws2 with cell offset
        ws2.cell(row=cell.offset(row=5, column=0).row, column=1, value=cell.value)
wb.save("copies_copied.xlsx")
© www.soinside.com 2019 - 2024. All rights reserved.