一. 獲取多個單元格的值報錯:AttributeError: 'tuple' object has no attribute 'value' 需要讀取的sample.xlsx 代碼讀取的是A3:B10之間的單元格 運行結果: 二. 如何解決 上面報錯信息是,元組對象沒有屬性"value",我們先來看 ...
一. 獲取多個單元格的值報錯:AttributeError: 'tuple' object has no attribute 'value'
需要讀取的sample.xlsx
代碼讀取的是A3:B10之間的單元格
from openpyxl import load_workbook
wb = load_workbook(r"D:\python_workshop\python6\study\sample.xlsx")
sh = wb["Sheet"]
print(sh["A3":"B10"].value)
運行結果:
Traceback (most recent call last):
File "D:/python_workshop/python6/study/demo.py", line 8, in <module>
print(sh["A3":"B10"].value)
AttributeError: 'tuple' object has no attribute 'value'
二. 如何解決
上面報錯信息是,元組對象沒有屬性"value",我們先來看一下print(sh["A2":"B10"]),得到的是一個元組,比較有意思的是,元組中的每一項也是一個元組,這個元組裡存儲的是每一行的單元格對象:相當於 元組(A3: B10) ——> 第三行:元組(A3: B3),第四行:元組(A4: B4)...第十行:元組(A10: B10)——>每一個單元格對象
print(sh["A3":"B10"])
運行結果:
((<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>), (<Cell 'Sheet'.A4>, <Cell 'Sheet'.B4>), (<Cell 'Sheet'.A5>, <Cell 'Sheet'.B5>), (<Cell 'Sheet'.A6>, <Cell 'Sheet'.B6>), (<Cell 'Sheet'.A7>, <Cell 'Sheet'.B7>), (<Cell 'Sheet'.A8>, <Cell 'Sheet'.B8>), (<Cell 'Sheet'.A9>, <Cell 'Sheet'.B9>), (<Cell 'Sheet'.A10>, <Cell 'Sheet'.B10>))
這種多層嵌套的形式,我們要想獲得最裡面單元格對象,就要用到雙層for迴圈:
for item in sh["A3":"B10"]: #item表示每一行的單元格元組
for cell in item: #cell表示每一行的每一個單元格對象
print(cell) #列印出每個單元格對象
運行結果:
<Cell 'Sheet'.A3>
<Cell 'Sheet'.B3>
<Cell 'Sheet'.A4>
<Cell 'Sheet'.B4>
<Cell 'Sheet'.A5>
<Cell 'Sheet'.B5>
<Cell 'Sheet'.A6>
<Cell 'Sheet'.B6>
<Cell 'Sheet'.A7>
<Cell 'Sheet'.B7>
<Cell 'Sheet'.A8>
<Cell 'Sheet'.B8>
<Cell 'Sheet'.A9>
<Cell 'Sheet'.B9>
<Cell 'Sheet'.A10>
<Cell 'Sheet'.B10>
得到單元格對象就好辦了,只需要單元格對象.value,我們就可以獲取單元格值。試試按照excel中的形式列印,得到的結果看起來很美觀:
用enumerate包裝一個可迭代對象,可以同時使用索引和迭代項,在迭代的同時獲取迭代項所在位置時非常方便
for index, item in enumerate(sh["A3":"B10"]):
if index > 0:
print("\n")
for cell in item:
print(cell.value, end=" ")
運行結果:
2018-05-10 電影
hello world 小說
hi 數據
stop 美團
bike 花生
中國 電視
測試 連續劇
深圳 廣告