python实现excel单元格位置转10进制坐标

最近项目中碰到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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值