python實現excel單元格位置轉10進位制座標

丁爸發表於2020-11-14

最近專案中碰到excel單元格位置轉10進位制座標,如下面幾個例子:
h5 =》(5, 8),表示第5行,第8列
c3 =》(3, 3),表示第3行,第3列
aDh32 =》(32, 788),表示第32行,第788列
程式碼實現如下:

def excel_item_to_rowcol(item: str):
    idx_num = 0
    for i, v in enumerate(item):
        if v.isdigit():
            idx_num = i
            break

    if idx_num == 0:  # 字串裡面沒有找到數字或首字元是數字
        return 1, 1

    num_str, name_str = item[idx_num:len(item)], item[0:idx_num].upper()  # 把分割的字串轉為大寫
    if not num_str.isdigit():  # 數字後面還有字串
        print(num_str, name_str)
        return 1, 1
    row, col = int(num_str), 0
    power = 1
    for i in range(len(name_str) - 1, -1, -1):
        ch = name_str[i]
        if ch < 'A' or ch > 'Z':  # 判斷字串裡面是否全部為A-Z的字元
            return 1, 1
        col += (ord(ch) - ord('A') + 1) * power
        power *= 26

    return row, col

說明:

  • 給輸入引數加str型別可以指定輸入引數型別,不用自己寫程式碼判斷
  • 把輸入字串引數強制轉大寫,避免大小寫不能識別的問題
  • 輸入字串是:字串+數字 的結構,這裡根據從字串開始找到的第一個數字的位置來分割成行列,並判斷行是否全部為數字,列是否為A~Z的字元

測試例子

print(excel_item_to_rowcol('h5'))
print(excel_item_to_rowcol('c3'))
print(excel_item_to_rowcol('Dh32'))
print(excel_item_to_rowcol('1Dh32'))
print(excel_item_to_rowcol('Dh32a'))
print(excel_item_to_rowcol('@Dh32'))
print(excel_item_to_rowcol('啊啊Dh32'))
(5, 8)
(3, 3)
(32, 112)
(1, 1)
(1, 1)
(1, 1)
(1, 1)

相關文章