zoukankan      html  css  js  c++  java
  • 获得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+向上键>

     

     

     

     

     

    四、结果展示

  • 相关阅读:
    尾递归
    gcc/g++ 命令
    GCC输出带C源代码的汇编文件
    linux下Ctrl命令组合
    静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)
    VS2010-MFC(菜单:菜单及CMenu类的使用)
    VS2010-MFC(菜单:VS2010菜单资源详解)
    VS2010-MFC(常用控件:标签控件Tab Control 下)
    VS2010-MFC(常用控件:标签控件Tab Control 上)
    VS2010-MFC(常用控件:树形控件Tree Control 下)
  • 原文地址:https://www.cnblogs.com/qianslup/p/12419300.html
Copyright © 2011-2022 走看看