python使用openpyxl库报错

运行报错:
Traceback (most recent call last):
File "F:/新建文件夹 (3)/合并.py", line 9, in
cell.value = copy.next()[0].value
StopIteration


import openpyxl as ox
wordbook = ox.load_workbook(filename="panda.xlsx")
sheet1 = wordbook['Sheet1']
copy = sheet1.iter_rows(min_row=1, max_row=10, min_col=1, max_col=10)
wordbook2 = ox.load_workbook(filename="1.xlsx")
sheet2 = wordbook2['Sheet2']
for i, row in enumerate(sheet2.iter_rows(min_row=1, max_row=10, min_col=1, max_col=10)):
    for j, cell in enumerate(row):
        cell.value = copy.__next__()[0].value

wordbook2.save(filename="panda111.xlsx")

img


询问一下这个是什么情况

if copy:
# 当这个 copy 不为空的时候再进行
    cell.value = next(copy)[0].value
else: 
     
# 为空的时候 cell.value = ?

可以试试

【以下回答由 GPT 生成】

报错的原因是使用了StopIteration错误。这个错误通常在使用迭代器的时候出现,表示迭代器没有更多的元素可以返回了。

在上述代码中,copy是一个迭代器对象,当你在内循环中使用copy.__next__()时,如果迭代器已经没有更多元素可以返回,就会抛出StopIteration错误。

解决这个问题可以采取以下两种方法之一:

方法一:使用itertools.islice函数

可以使用itertools.islice函数来限制迭代器的长度,确保不会超出范围。将第一个for循环替换为以下代码:

import itertools

copy = itertools.islice(sheet1.iter_rows(min_row=1, max_row=10, min_col=1, max_col=10), 10)

这样可以确保copy迭代器只有10个元素。

方法二:使用zip函数

可以使用zip函数将两个迭代器打包在一起,然后使用zip_longest函数确保两个迭代器长度一致。将第二个for循环替换为以下代码:

import itertools

for i, (row, copy_row) in enumerate(zip(sheet2.iter_rows(min_row=1, max_row=10, min_col=1, max_col=10), copy)):
    for j, (cell, copy_cell) in enumerate(zip(row, copy_row)):
        cell.value = copy_cell.value

这样可以确保在每次迭代时,copy迭代器只返回与sheet2相应行的元素。

无论你采用哪种方法,都需要确保两个迭代器的长度是一致的,否则可能会抛出StopIteration错误。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^