获得excel连续区域的范围

一、说明

在python操作excel时,有时需要读取excel连续区域的范围。

连续区域:在操作excel时,假如起始位置在左上角,Ctrl+→(向右的方向键)然后Ctrl+↓(向下的方向键)达到的区域。

二、excel展示

获得图中绿色圈出的区域。

三、代码展示

3.1 使用xlwings处理。

import xlwings


def column_to_name(colnum):
    # 返回数字对应的excel列的位置, 比如2返回B, 27返回AA
    # 可以看成是10进制的数字转化为26进制的数字。
    if type(colnum) is not int or colnum <= 0:
        return '请输入正整数'
    str = ''
    while (colnum > 0) :
        temp = 25
        if (colnum % 26 == 0):
            str += chr(temp + 65)
            colnum -= 1
        else:
            str += chr(colnum % 26 - 1 + 65)
        colnum //= 26
        # print(str)
    return str[::-1]        # 倒序输出拼写的字符串


def get_range(path_file, sheet_name,cell_start, cell_expand):
    app = xlwings.App(visible=True, add_book=False)
    wb = app.books.open(path_file)
    sheet = wb.sheets[sheet_name]
    rng = sheet.range(cell_expand).expand()   #获得的是连续的区域
    maxrow = rng.last_cell.row
    maxcol = rng.last_cell.column
    maxcol = column_to_name(maxcol)
    range ='{cell_start}:{maxcol}{maxrow}'.format(cell_start=cell_start,maxcol=maxcol, maxrow=maxrow)
    wb.close()
    app.quit()
    return range


if __name__ == '__main__':
    path_file = 'E:测试ceshi1.xlsx'
    sheet_name = 'ceshi1'
    cell_expand = 'G10'
    cell_start = 'G10'
    range = get_range(path_file=path_file, sheet_name=sheet_name, cell_start= cell_start,cell_expand=cell_expand)
    print(range)

 

3.2 使用win32com处理。

 

import win32com
from win32com.client import Dispatch



def column_to_name(colnum):
    # 返回数字对应的excel列的位置, 比如2返回B, 27返回AA
    # 可以看成是10进制的数字转化为26进制的数字。
    if type(colnum) is not int or colnum <= 0:
        return '请输入正整数'
    str = ''
    while (colnum > 0) :
        temp = 25
        if (colnum % 26 == 0):
            str += chr(temp + 65)
            colnum -= 1
        else:
            str += chr(colnum % 26 - 1 + 65)
        colnum //= 26
        # print(str)
    return str[::-1]

def get_range(path_file, sheet_name,cell_start, cell_expand):
    xlapp = win32com.client.gencache.EnsureDispatch('Excel.Application')
    xlapp.Visible = True
    xlapp.DisplayAlerts = False  # 关闭警告
    wb = xlapp.Workbooks.Open(path_file)
    sheet = wb.Worksheets(sheet_name)
    maxrow =  sheet.Range(cell_expand).End(-4121).Row        # 向下扩展
    maxcol = sheet.Range(cell_expand).End(-4161).Column      # 向右扩展
    maxcol = column_to_name(maxcol)                          # 转化为字母
    range = '{cell_start}:{maxcol}{maxrow}'.format(cell_start=cell_start, maxcol=maxcol, maxrow=maxrow)
    wb.Save()
    wb.Close(1)
    xlapp.Quit()
    return range

if __name__ == '__main__':
    path_file = r'D:测试
icai博客中的源文件excel获得excel连续区域的范围.xlsx'
    sheet_name = 'Sheet1'
    cell_expand = 'G10'
    cell_start = 'G10'
    range = get_range(path_file=path_file, sheet_name=sheet_name, cell_start= cell_start,cell_expand=cell_expand)
    print(range)

3.3 对比说明

xlwings是将向右扩展和向下扩展一步完成,二win32则是分为两步。

大部分情况下,对于列数我们都是知道的,而行数则是动态变化的。此时如果使用win32则方便一点。

 

 

 3.4 补充说明

3.4.1   10进制转化为26进制说明:

将10进制的x转化为26进制:

假如x大于26

y = math.floor(x/26)  y为x/26向下取证。

z= x%26                z为x/26的求余。

假如y不大于26。则x的26进制为y与z对应的26进制中对应的数字。

 如果还是不懂,去网上查一下10进制转化为16进制。

3.4.1   win32com补充:

XlDirection常量 描述
xlDown -4121 向下,相当于<Ctrl+向下键>
xlToRight -4161 向右,相当于<Ctrl+向右键>
xlToleft -4159 向左,相当于<Ctrl+向左键>
xlUP -4126 向上,相当于<Ctrl+向上键>

 

 

 

 

 

四、结果展示

原文地址:https://www.cnblogs.com/qianslup/p/12419300.html