Python读写Excel库:xlwings从入门到放弃
Python操作Excel的库还是挺多的,比较常见的有:xlwings
、xlrd
、xlwt
、openpyxl
、xlutils
等。
xlrd
、xlwt
都有自身的局限性,例如xlrd
只读不写,xlwt
不能处理.xlsx
综合下来,xlwings
是相对功能更全面,操作文件效率相对高,可以与matplotlib、pandas无缝衔接,免费开源的库。
安装
xlwings不是Python的内置库,需要单独安装。
1 |
pip install xlwings |
使用
首先了解一下Excel的基本结构。
Excel的基本结构可以分为:Application(应用程序)--> Workbooks(工作簿)--> Worksheets(工作表)--> Range(单元格)
xlwings的结构跟Excel的基本结构是一致的。
在xlwings中:
- 单个Excel程序由app表示
- 单个工作簿用Boos表示
- 单个工作表用Sheet表示
- 区域/单元格用Range表示
基础操作
初始化
1 2 3 4 5 |
import xlwings as xw app = xw.App(visible=True, add_book=False) app.display_alerts = False # 关闭提示信息,可提高运行速度。 默认为 True。 app.screen_updating = True # 更新显示工作表的内容。默认为 True。关闭它可以提升速度。 |
操作工作簿
1 2 3 |
wb = app.books.add() # 新建工作簿。 wb = app.books.open(r'd:\temp\test.xlsx') # 打开现有的d:\temp路径下的test.xlsx文件 wb = app.books.active # 获取当前活动的工作簿 |
操作工作表
1 2 3 4 5 6 |
sht = wb.sheets.active # 获取当前活动的工作表 sht = wb.sheets[0] # 按索引获取工作表 shtName = sht.name # 获取工作表名 sht = wb.sheets['Sheet1'] # 按表名获取工作表 sht1 = wb.sheets.add() # 新建工作表,默认新建的放在最前面。 sht1 = wb.sheets.add('新建工作表', after=sht) # 新建工作表,放在sht工作表后面。 |
读取单元格
1 2 3 4 5 6 7 8 |
cell1 = sht.range('A1') # 获取A1单元格 # 获取 A1 中的值 v = cell1.value # 也可以根据行列号读取 cell1_value = sht.range(3,2).value # sht.range(行号, 列号).value # 读取一段区间内的值 b1_e4_value = sht.range('b1:e4').options(ndim=2).value # ndim来设置维度 b1_e4_value = sht.range((1,2),(4,5)).options(ndim=2).value # 和上面读取的内容一样 |
关于options
的参数,可以参阅 官方文档
写入单元格
1 2 3 4 5 6 |
sht.range('A1').value = 0 # 向A1单元格写入值 sht.range(3,2).value = 'welcome' # 向B3单元格写入值,(行号,列号) sht.range('A1').value=[1,2,3] # 向A1、B1、C1单元格写入值(写一行) sht.range('A2').value = [[1,2,3], [2,2,3], [3,2,3]] # 向A2-A4,B2-B4,C2-C4写三行三列 |
扩展式方法操作单元格
有如下表格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
rng = sht.range("A1").expand("table") print(rng.value) # [ [1.0, 2.0, 3.0], [4.0, 5.0, 6.0] ] sht.range("A4").value = 5 # 如果需要在更新区域后快速获取区域变化,可以使用options的expand参数: rng1 = sht.range("A1").options(expand="table") print(rng1.value) # [ [1.0, 2.0, 3.0, 5.0], [4.0, 5.0, 6.0] ] # 获取第一列 rng = sht.range("A1").expand("down") # 获取第一行 rng = sht.range("A1").expand("right") |
合并单元格
1 2 |
sht.range('C8:D8').api.merge() # 合并单元格 C8 到 D8 sht.range('C8:D8').api.unmerge() # 拆分单元格 |
行操作
1 2 |
sht.range('a3').api.EntireRow.Delete() # 会删除 ’a3‘ 单元格所在的行 sht.api.Rows(3).Insert() # 在第3行插入 |
列操作
1 2 |
sht.range('c2').api.EntireColumn.Delete() # 会删除 ’c2‘ 单元格所在的列。 sht.api.Columns(3).Insert() # 会在第3列插入一列,原来的第3列右移 |
Range常用API
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# 引用当前活动工作表的单元格 rng=xw.Range('A1') # 加入超链接 rng.add_hyperlink(r'www.dadclab.com','大D技研所','提示:点击即链接访问大D技研所') # 取得当前range的地址 rng.address rng.get_address() # 清除range的内容 rng.clear_contents() # 清除格式和内容 rng.clear() # 取得range的背景色,以元组形式返回RGB值 rng.color # 设置range的颜色 rng.color=(255,255,255) # 清除range的背景色 rng.color=None # 获得range的第一列列标 rng.column # 返回range中单元格的数据 rng.count # 返回current_region rng.current_region # 返回ctrl + 方向 rng.end('down') # 获取公式或者输入公式 rng.formula='=SUM(B1:B5)' # 数组公式 rng.formula_array # 获得单元格的绝对地址 rng.get_address(row_absolute=True, column_absolute=True,include_sheetname=False, external=False) # 获得列宽 rng.column_width # 返回range的总宽度 rng.width # 获得range的超链接 rng.hyperlink # 获得range中右下角最后一个单元格 rng.last_cell # range平移 rng.offset(row_offset=0,column_offset=0) #range进行resize改变range的大小 rng.resize(row_size=None,column_size=None) # range的第一行行标 rng.row # 行的高度,所有行一样高返回行高,不一样返回None rng.row_height # 返回range的总高度 rng.height # 返回range的行数和列数 rng.shape # 返回range所在的sheet rng.sheet #返回range的所有行 rng.rows # range的第一行 rng.rows[0] # range的总行数 rng.rows.count # 返回range的所有列 rng.columns # 返回range的第一列 rng.columns[0] # 返回range的列数 rng.columns.count # 所有range的大小自适应 rng.autofit() # 所有列宽度自适应 rng.columns.autofit() # 所有行宽度自适应 rng.rows.autofit() |
格式操作
设置单元格格式
1 2 3 4 |
sht.range('A1').api.NumberFormat = "@" #设置为文本格式 sht.range('A2').api.NumberFormat = "0.0" #设置为小数格式 sht.range('A3').api.NumberFormat = "0%" #设置为百分比 sht.range('A4').api.NumberFormat = "yyyy-mm-dd" #设置为"-"连接的日期格式 |
设置单元格大小 字体格式
1 2 3 4 5 6 7 8 9 10 11 |
sht.autofit() # 自动调整单元格大小。注:此方法是在单元格写入内容后,再使用,才有效。 sht.range(1,4).column_width = 5 # 设置第4列 列宽(1,4)为第1行第4列的单元格 sht.range(1,4).row_height = 20 # 设置第1行 行高 cell1 = sht.range("A1") cell1.color = 255,200,255 # 设置单元格的填充颜色 cell1.api.Font.ColorIndex = 3 # 设置字体的颜色,具体颜色索引见下方。 cell1.api.Font.Size = 24 # 设置字体的大小 cell1.api.Font.Bold = True # 设置为粗体。 cell1.api.HorizontalAlignment = -4108 # -4108 水平居中。 -4131 靠左,-4152 靠右。 cell1.api.VerticalAlignment = -4130 # -4108 垂直居中(默认) -4160 靠上,-4107 靠下, -4130 自动换行对齐 |
排序与去重
排序
排序需要使用到Sort
这个api。
1 2 3 4 |
sht.range('a2',(rows,columns)).api.Sort(Key1=sht.range('c2').api, Order1=1) # 先选择需要排序的区域 a2开始到(行号,列号)的区域 # 指定按C2单元格所在列的数据进行排序 # Order1=1为升序排列,2为降序排列 |
去重
去重需要使用到RemoveDuplicates
这个api。
1 2 |
sht1.range('a2',(rows,columns)).api.RemoveDuplicates(3) # 选定a2开始至(行号,列号)的区域,按照第3列的数据进行去重 |
公式操作
1 2 3 |
sht1.range('d1').formula = '=sum(e1+f1)' # 插入公式 sht1.range('d1').formula # 读取公式 sht1.range('d1').formula_array |
怎么样,你学废了么?
版权声明
转载保留版权: 大D技研室 | 《Python读写Excel库:xlwings从入门到放弃》
本文链接地址:https://www.dadclab.com/archives/7776.jiecao
转载须知:如果您需要转载本文,请将版权信息,版权授权方式,以及本文的链接地址注明,谢谢合作。