iT邦幫忙

0

python openpyxl 關於excel檔、欄位值的處理

  • 分享至 

  • xImage

取excel欄位值採用下面2種。n為工作表sheet、中括號內為欄位座標例['B1']
n['B'+str(g)].value = 3.07
n.cell(row=2, column=g).value = 3.07
使用上方的語法,程式跑得很順,
採用下方的語法,一定會在w.save('p310b.xlsx') 此行出錯,
但是cell()理應是openpyxl的內部函數,為什麼會造成存款出錯???
註:cell()在別的程式是好好的。

報錯:
Traceback (most recent call last):
File "C:\Users\CathyMe\AppData\Local\Programs\Python\Python38\lib\site-package
s\openpyxl\utils\cell.py", line 110, in get_column_letter
return _STRING_COL_CACHE[idx]
KeyError: 23703
Traceback (most recent call last):
File "p310.py", line 39, in
w.save('p310b.xlsx') # p310b.xlsx
File "C:\Users\CathyMe\AppData\Local\Programs\Python\Python38\lib\site-package
s\openpyxl\workbook\workbook.py", line 407, in save
save_workbook(self, filename)
File "C:\Users\CathyMe\AppData\Local\Programs\Python\Python38\lib\site-package
s\openpyxl\writer\excel.py", line 293, in save_workbook
writer.save()下略。

完整程式碼如下


import openpyxl, sys, time

w = openpyxl.load_workbook('p310.xlsx')
s = w.sheetnames # ['Sheet']
n = w['Sheet']

print(n.max_row)    # 23758
print(n.max_column) # 4

m = 0

for k in list(n['A']):
    if k.value == 'Garlic':
        m+=1 
print(m) # 630

for g in range(2, n.max_row+1):
    if n['A'+str(g)].value == 'Garlic':
        #n['B'+str(g)].value = 3.07		# Garlic new cost 3.07
        n.cell(row=2, column=g).value = 3.07
        
    #if n['A'][g].value == 'Garlic':
        #n.cell(row=2, column=g).value = 3.07  	# Garlic new cost 3.07
        #print(n['B'+str(g)].value) # Garlic origin cost 1.19
        #sys.exit()

    if n['A'+str(g)].value == 'Celery':
        n['B'+str(g)].value = 1.19  # Celery new cost 1.19

w.save('p310b.xlsx') # p310b.xlsx

time.sleep(8) # 因為當機才加了這行,給ram緩衝時間,然而沒用
w = openpyxl.load_workbook('p310b.xlsx')
n = w['Sheet']

for g in range(1, n.max_row+1):
    if n['A'+str(g)].value == 'Garlic':
        print(n['B'+str(g)].value) # Garlic new cost 3.07
        sys.exit()


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
re.Zero
iT邦研究生 5 級 ‧ 2023-05-25 21:48:39
最佳解答

我沒細看你的程式碼, 但是, 因為你的 openpyxl 錯誤訊息內容跟我這邊安裝的 openpyxl 之程式碼內容有差, 請先檢查或升級你的 openpyxl 版本, 再試試看你的程式。
( 搞不好得升級的 Python 與 pip 。 )

檢視目前安裝的 openpyxl 資訊:

pip show openpyxl

另, 錯誤訊息之類的也能丟到 iThelp-Markdown 的程式碼區塊 ( 用指定語言: plaintext ) , 例如下面方式 :

```plaintext
show me the message.
```

Zero大大日安,我的電腦比較舊了,升不了級,所以可能是這方面的問題。(年初時跑這個還可以的)

re.Zero iT邦研究生 5 級 ‧ 2023-05-26 21:09:19 檢舉

@ iiuu 謝謝Houston :
等等, 升不了級, 表示問題沒解決吧? 怎會把我的回答設為最佳解答??
( 還是我誤解啥狀況? )
你先試試升級 pipopenpyxl
只要你跑得動 Python, 升級這兩個套件而不升 Python 應該是可行的, 因為這兩個不吃啥系統效能。
( 還是說,你不能升級 Python 且 Python 太舊而導致不能升級套件? 那我就沒轍了~ 得另等高明了~~ )

0
obarisk
iT邦研究生 2 級 ‧ 2023-05-26 08:32:50

看起來是

File "C:\Users\CathyMe\AppData\Local\Programs\Python\Python38\lib\site-package
s\openpyxl\utils\cell.py", line 110, in get_column_letter
return _STRING_COL_CACHE[idx]
KeyError: 23703

不是 cell 寫值的問題

謝謝樓上。

我要發表回答

立即登入回答