Попытка использовать cell.offset для копирования между листами, где исходные и конечные листы имеют разные начальные строки - PullRequest
2 голосов
/ 13 октября 2019

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 (задокументировано выше) для копирования данных из исходного листа, начиная со строки 2в столбце A к листу назначения, начинающемуся со строки 7 в столбце A.

На самом деле я могу добиться этого с помощью следующего подхода:

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

Приведенное выше копирует данные из ws2, начиная со строки2 до ws3, начиная со строки 7 (благодаря смещению 5).

Но я хочу использовать свойство 'offset' module 'cell' для своих собственных тренировок / обучения.

КакМогу ли я заменить вышеприведенный модуль смещения?

Вот что у меня есть:

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. Заранее спасибо!

1 Ответ

1 голос
/ 14 октября 2019

Это сместит значения на 5 строк ws2 из строк ws1:

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")
...