xlwings实时操作WPS-Excel笔记
2020-12-07 本文已影响0人
啊啊啊海
由于工作需要用到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'))
如果你用的是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无效,有知道的大佬麻烦告诉我一声,谢谢——)
非专业,记录笔记方便自己忘记了再来查看,有不对的地方大佬们多多包涵!