xlwings实时操作WPS-Excel笔记

由于工作需要用到xlwings实时操作Excel,在网上找了好久好久都没有找到解决的办法,后面无意间找到了一个方法,记录一下,以供需要的靓仔查阅。
xlwings中文文档地址:https://www.kancloud.cn/gnefnuy/xlwings-docs/1127450

连接到已经打开的Excel文件

import xlwings as xw
file = r'D:\jiankong\整点新模板6.0.xlsx'
wb = xw.Book(file)  #xlwings.Book默认是启动新进程的(之前使用office的时候好像可以直接连接到已经打开的excel文件,但是用WPS的话会直接新打开一个进程。)

解决方法

首先,找到xlwings安装目录下的文件:你的python安装位置\Python39\Lib\site-packages\xlwings_xlwindows.py,
然后,找到代码313行
self._xl=COMRetryObjectWrapper(DispatchEx('Excel.Application'))
默认使用的是win32com模块下面的DispatchEx方法,此方法会启动一个新进程,把DispatchEx修改为Dispatch就可以啦
self._xl = COMRetryObjectWrapper(Dispatch('Excel.Application'))

image.png

如果你用的是WPS,修改代码为:
self._xl = COMRetryObjectWrapper(Dispatch('ket.Application'))

image.png

常规操作

import xlwings as xw
app = xw.App()  # 新打开一个进程

# 禁用提示和屏幕刷新可以提升速度,操作完成后记得设置为True
app.display_alerts = False 
app.screen_updating = False
# 新建book
wb = app.books.add()
wb.save(r'保存的路径及文件名.xlsx')

wb = xw.Book(file)  # 连接到文件
wb.app.display_alerts = False  #禁用刷新,层关系app>books>sheets>range

# 新建Sheet
app.books.sheets.add(name='test')  #新建name为test的页面

# 选择要操作的sheet
ws = app.sheets('sheet1')  # 获取sheet1页
ws = app.sheets['sheet1'] 
ws = app.sheets.active # 当前激活的sheet
app.sheets('sheet1').select()  #激活选择的sheet

# Range
ws.range('A1').value = 'Hello Xlwings'  # A1单元格写入值‘Hello Xlwings’
ws.cells(1,1).value = 'Hello Xlwings'
ws.range('A1').value = [1,2,3,4,5]  #对应写入值到A1:E1
ws.range('A1').value = [[1],[2],[3],[4],[5]]  #对应值写入A1:A5
ws.range('A1').options(transpose=True).value = [1,2,3,4,5]  #对应值写入A1:A5

# DataFrame写入
ws.range('A1').value = df  # 默认有行索引,一般我们不需要
ws.range('A1').options(index=False,header=False).value = df  #header表示是否写入列名
arr = ws.range('A1').current_region.value  #Ctrl+A引用范围值

# 读取excel数据转DataFrame
df = ws.range('A1').options(pandas.DataFrame,expand='table',index=False)  #读取的数据默认第一列会转为行索引,添加index=False解决

# 单元格写入公式
ws.cells(1,1).formula = '=sum('A1:A5')'

# end
ws.range('A9999').end('up').row  #获取数据使用的最大行号,列号用column
ws.range('A9999').end('down').select()  # Ctrl+向下
ws.range('G1').end('left').select()  # Ctrl+向左
ws.range('G1').end('right').select()  # Ctrl+向右

# 删除行、列
ws.api.rows('1:4').Delete()  #删除1-4行
ws.api.Columns('A').Delete()  #删除A列

# 填充公式
ws.range('A1').api.AutoFill(ws.api.Range('A1:A8'))

# 设置行、列宽
ws.range('A1').row_width = 5
ws.range('A1').column_width = 5
ws.range('A1').row_height = 5  #行高
ws.autofit()  #自动调整单元格大小。注:此方法是在单元格写入内容后,再使用,才有效。

# 排序
ws.range('A1').current_region.api.Sort(Key1=ws.range('B1').api,Order1=1)  #1为升序,2为降序(测试的时候只有单个条件生效,添加key2无效,有知道的大佬麻烦告诉我一声,谢谢——)

非专业,记录笔记方便自己忘记了再来查看,有不对的地方大佬们多多包涵!

你可能感兴趣的:(xlwings实时操作WPS-Excel笔记)