最近项目中碰到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的字符
- 用isalnum()判断是否只包含数字和字母会有问题,字符串里面含中文是也会返回True
测试例子
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)