赞
踩
Python处理Excel方面常用的有xlrd、xlwt等7个库,根据对官方网站及网络的查询,在我比较关注的操作系统、python3支持、新旧Excel文件处理,读写改几个方面进行了筛选。
对我而言,由于使用的windows系统,日常处理需要兼顾新旧Excel文件处理,读写改肯定是都能支持最好,因此毫不犹豫选择了xlwings作为Python处理Excel的入口。
xlwings是一个可以实现从Excel调用Python,也可在python中调用Excel的库。开源免费,一直在更新。
特点:
xlvings的宗旨就是让Excel飞起来!
xlwings官方文档:https://docs.xlwings.org/en/stable/index.html
使用pip进行安装:
pip install xlwings
或conda:
conda install xlwings
Anaconda已经预安装了xlwings
但可能版本比较落后,我们可以通过:
pip:
pip install --upgrade xlwings
或conda:
conda install -c conda-forge xlwings
更新到最新版本。
接下来我们用一个示例运行xlwings。
具体代码如下:
import xlwings as xw
# 打开excel,参数visible表示处理过程是否可视,add_book表示是否打开新的Excel程序
with xw.App(visible=True,add_book=False) as app:
# 创建一个工作薄
book = app.books.add()
# 工作薄中创建一个sheet表
sht = book.sheets.add()
# 向表格的A1单元格写入“Hello Python”
sht.range('A1').value = 'Hello Python'
# 保存
book.save('d:\\Products\\python_excel\\helloworld.xlsx')
执行代码,在指定目录创建helloworld.xlsx文件
并按照要求添加文字Hello Python
在我们操作之前可以先了解下xlwings的基础规范:
- 新建:创建一个不存在的工作薄或者工作表
- 打开:打开一个已经存在的工作薄
- 引用:就是告诉程序,你要操作哪个对象。比如你打开了A、B、C三个工作薄,现在你想操作A工作薄,就要先引用A
- 激活:我们可以同时打开多个工作薄,但是一次只能操作一个工作簿,我们正在操作的这个工作薄称为**当前活动工作薄。
在xlwings中:
- Excel程序用App来表示,多个Excel程序集合用Apps表示;
- 单个工作簿用Book表示,工作簿集合用Books表示;
- 单个工作表用Sheet表示,工作表集合用Sheets表示;
- 区域用Range表示,既可以是一个单元格,也可以是一片单元格区域。
对Excel进行操作的主要用例及常用函数:
import xlwings as xw xw.App # 打开一个excel应用 xw.Book # 创建一个工作薄 xw.Sheet # 创建一个工作表 # 创建app app=xw.App(visible=True,add_book=False) # visible设置是否展示工作簿,True展示,False不展示;add_book 是否添加工作簿,True添加,False不添加 app.display_alerts = False # 关闭提示信息 app.screen_updating = False # 关闭显示更新 # 关闭app app.kill() # 通过杀掉进程,强制Excel app退出 app.quit() # 退出excel程序,不保存任何工作簿 # 创建新的工作簿 wb = app.books.add() # 打开已经存在的工作簿 wb = app.books.open('绝对或者相对路径的excel文件') wb = xw.Book('绝对或者相对路径的excel文件') # 激活工作簿 wb.activate() wb.activate(steal_focus=True) # 如果steal_focus=True, 则把窗口显示到最上层,并且把焦点从Python切换到Excel # 关闭工作簿 wb.close() # 保存工作簿 wb.save() wb.save('存储路径') # 新建工作表 sht = wb.sheets.add() sht = wb.sheets.add('test',after='sheet2') #参数1为工作表名称,省略的话为Excel默认名称,参数2为插入位置,可选before或者after # 引用某一个工作表 sht = wb.sheets('sheet1') # 指定名称获取sheet工作表 sht = wb.sheets(1) # 根据序号获取 sht = xw.sheets.active #获取当前活动的工作表 # sheet对象常用的调用方法 sht.clear() # 清除工作表所有内容和格式 sht.clear_contents() # 清除工作表的所有内容但是保留原有格式 sht.delete() # 删除工作表 sht.autofit('c') # 自动调整列宽 sht.autofit('r') # 自动调整行高 sht.autofit() # 自动调整行高列宽 sht.select() # 在活动工作簿中选择 # 可以通过属性获取获取工作表的名称、所有单元格的区域对象、当前工作表的索引值 sht.name sht.cells sht.index sht.names # 引用区域与单元格操作 xw.Range('A1:D4') xw.Range((1,1), (4,4)) xw.Range(xw.Range('A1'),xw.Range('D4')) xw.Range(xw.Range('A1:E6'),xw.Range('C3:D7')) xw.Range('NamedRange') app.range("A1") # 注意是小写的range sht.range('A1') xw.books['MyBook.xlsx'].sheets[0].range('A1') sht['A1'] sht['A1:D4'] sht[0,5] sht[:5,:5] # 区域管理可以通过如下方式 range.offset(row_offset=5,column_offset=2) #表示偏移,row_offset行偏移量(正数表示向下偏移,负数相反),column_offset列偏移量(正数表示向右偏移,负数相反) 注意:是将选区范围进行偏移,内容不进行偏移 range.expand(mode='down') # 扩展区域,参数可选取 'down' , 'right' ,'table' ,类似我们使用向下、向右或者下右方的区域扩展操作。 range.resize(row_size=4, column_size=2) #表示调整选中区域的大小,参数表示调整后区域的行、列的数量。4 range.current_region #表示全选 类似Ctrl + A # 区域或单元格存储数据 sht.range('A1').value=1 #储存单个值 ".value“属性 sht.range('A1').value=[1,2,3] # 将列表[1,2,3]储存在A1:C1中 sht.range('A1').options(transpose=True).value=[1,2,3] # 将列表[1,2,3]储存在A1:A3中 sht.range('A1').options(expand='table').value=[[1,2],[3,4]] # 将2x2表格,即二维数组,储存在A1:B2中,如第一行1,2,第二行3,4 # 区域或单元格读取数据 a=sht.range('A1').value # 将A1的值,读取到a变量中 print(a) a=sht.range('A1:A2').value #将A1到A2的值,读取到a列表中 print(a) a=sht.range('A1:B2').value # 将第一行和第二行的数据按二维数组的方式读取 print(a) # 区域或单元格清除与删除 rng.clear_contents() # 清除range的内容 rng.clear() # 清除格式和内容 rng.delete(shift=None) # 删除 # 区域或单元格其他设置 rng.number_format # 获取数字格式 rng.number_format = '0.00%' # 设置数字格式 rng.insert(shift=None, copy_origin='format_from_left_or_above') rng.row# 返回区域第一行的行号 rng.column # 返回区域的第一列的号,注意返回的列号不是ABCD,而是1234 # 获取行高 或者设置行高 rng.row_height rng.row_height = 20 # 获取列宽或设置列宽 rng.column_width rng.column_width = 20 # 自适应行高列宽 rng.autofit() rng.columns.autofit() rng.rows.autofit() # 合并单元格 rng.merge(across=False) rng.merge_area # 返回合并单元格区域 rng.merge_cells # 返回True或者False,测试是否在合并单元格区域 rng.unmerge() # 取消单元格合并 # 背景色 rng.color # 获取指定区域的背景色 xw.Range('A1').color = (255,255,255) # 设置背景色 xw.Range('A2').color = None # 去除背景色
案例:某单位经费有一级项目2个(公用经费、运行维保),每个一级项目下各有5个二级项目,经系统导出今年1月、2月经费执行情况,当月未产生费用的项目不在excel中出现,费用按照开支时间排序,顺序不固定,需要统计1至2月的一级项目及各二级项目总的资金执行率。
总预算表test1.xlsx:
一月执行情况test1_1.xlsx:
二月执行情况test1_2.xlsx:
代码及结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。