一、说明
在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+向上键> |