我试图找出如何枚举索引正确到使用Python的Excel电子表格上指定的单元格。看了一个教程视频后,我以为我已经弄清楚了,但是它似乎没有像预期的那样提取每个索引值并将其解析到每个单独的单元格。相反,它只接受第一个条目并将其应用于所有指定的单元格,而忽略第二个和第三个条目。谁能告诉我,我到底搞砸了什么?谢谢。
代码:
from openpyxl import Workbook, load_workbook
from openpyxl.utils import get_column_letter
wb = load_workbook('PythonNetwork.xlsx')
ws = wb['Systems']
print(ws)
# Shows each designated cell as well as its cell value.
for row in ws['A2':'A4']:
for cell in row:
print(cell, cell.value)
new_data = ["192.168.1.4", "192.168.1.5", "192.168.1.6"]
# Enters new data from created index.
for row in ws['A2':'A4']:
for index, cell in enumerate(row):
cell.value = new_data[index]
# Shows each designated cell value for comparison to previously printed information.
for row in ws['A2':'A4']:
for cell in row:
print(cell.value)
输出:
<Worksheet "Systems">
<Cell 'Systems'.A2> 192.168.1.1
<Cell 'Systems'.A3> 192.168.1.2
<Cell 'Systems'.A4> 192.168.1.3
192.168.1.4
192.168.1.4
192.168.1.4
我试着将索引中的值从有引号改为没有引号的简单整数,看看它是否有任何不同。但事实并非如此。例如,我将索引中的每个IP地址替换为10、20等,如下所示:
new_data = [10, 20, 30]
输出结果与每个单元报告的10 10 10
而不是10 20 30
相同。
不幸的是,这种访问单元格范围的方式总是有点笨拙。如果你看一下访问范围返回什么:
>>> ws['A2':'A4']
((<Cell 'Systems'.A2>,), (<Cell 'Systems'.A3>,), (<Cell 'Systems'.A4>,))
它是元组的元组,其中每个内部元组是一个单元格。在你的for
循环中,你所说的row
是一个单元格的元组。它不是一行,但你的代码打印这些单元格工作。
当您尝试更改值时,但是,枚举index
总是0
,因为每个元组都有一个单元格,所以您总是分配new_data[0]
的值。
相反,你可以这样做:
for index, cell in enumerate(ws['A2':'A4']):
cell[0].value = new_data[index]
每个cell
实际上是一个单元格的元组,所以你必须引用第0个元素。