xlwings模块详解


中文文档:https://www.kancloud.cn/gnefnuy/xlwings-docs/1127454

import xlwings
#查找包路径
print(xlwings.__path__)
#['D:\\python_mcw\\venv\\lib\\site-packages\\xlwings']
#查看版本
print(xlwings.__version__)
#0.25.1

1. 脚本: 从Python与Excel进行自动化交互

建立与工作簿的连接:

import xlwings as xw
# wb = xw.Book()  # 这将创建一个新的工作簿
# wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件
wb = xw.Book(r'D:\学习笔记\第2章 用Python对 Excel读写数据\2.9 修改工作簿、工作表、单元格\招生表.xls')# 在Windows上:使用原始字符串来转义反斜杠

执行之后创建工作簿

 执行之后打开wps,打开表格文件

 执行之后打开表格

如果您在两个Excel实例中打开了相同的文件,则需要完全限定它并包含应用程序实例。 您将通过xw.apps.keys()找到您的应用实例密钥(PID):

>>> xw.apps[10559].books['FileName.xlsx']

实例化工作表对象

import xlwings as xw
# wb = xw.Book()  # 这将创建一个新的工作簿
wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件
sht = wb.sheets['mcwSheet1']

执行一次,就创建一个新的工作簿,数字循环到4了。sheets里面的是已有的工作表名字。创建好的工作簿好像默认只有一个工作表

 在Range内读取/写入值非常简单:

写入和读取单个单元格的内容

 打开了的,执行程序再次打开一个是只读的,并且将第一个单元格重新赋值了,现在应该是没有保存到磁盘的

import xlwings as xw
# wb = xw.Book()  # 这将创建一个新的工作簿
wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件
sht = wb.sheets['mcw'] #获取工作簿中的指定工作表
sht.range('A1').value = 'Foo 1'  #设置单个单元格值
print(sht.range('A1').value) #读取单个单元格的值

写入多行多列数据(指定起始点): 

从A1单元格为起始点,设置多个值。值是一个大列表,大列表里有小列表。小列表是单行所有列的数值,大列表是所有行的数值集合。小列表每个元素才是单个单元格的内容。

读取多行多列数据:

获取到的就是之前设置的值。两层列表,外层包含所有行的。内层列表是单行所有列的数据。内层列表每个元素才是每个单元格的值

功能强大的转换器处理大多数感兴趣的数据类型,包括Numpy数组和Pandas DataFrames两个方向:

三个列表,第一个值为None

import xlwings as xw
# wb = xw.Book()  # 这将创建一个新的工作簿
wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件
sht = wb.sheets['mcw'] #获取工作簿中的指定工作表
import pandas as pd
df = pd.DataFrame([[1,2], [3,4]], columns=['a', 'b'])
print(df)  #columns生成的是列标题,前面列表是列标题下的每行数据。每行数据好像都不是从第一列开始的,第一列
            #第一列可能是数值的行序号(又或者是列表索引),从0开始。行上并不包含第一行,列标题
sht.range('A1').value = df   #将这种数据作为这个单元格为起始点的值,
mcw=sht.range('A1').options(pd.DataFrame, expand='table').value #获取pd的数值
mcw2=sht.range('A1').expand().value  #获取表中的数值
print(mcw)
print(mcw2)
程序

 Matplotlib数字可以在Excel中显示为图片:

import xlwings as xw
# wb = xw.Book()  # 这将创建一个新的工作簿
wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件
sht = wb.sheets['mcw'] #获取工作簿中的指定工作表
import matplotlib.pyplot as plt
fig = plt.figure()
mcw=plt.plot([1, 2, 3, 4, 5])#像是个列表
mcw2=sht.pictures.add(fig, name='MyPlot', update=True)
print(mcw,type(mcw)) #2是个图片,将plt图片加入到
print(mcw2) #表格中
程序

 
如果你设置update = True,你可以在Excel上调整大小并定位图:后续调用同名的pictures.add()('MyPlot')会更新图片而不改变它的位置或大小。

大小,位置和其他属性可以在pictures.add()中设置为参数,或者通过操作图片 返回的对象,参见xlwings.Picture()

例如:

import matplotlib.pyplot as plt
import xlwings as xw

fig = plt.figure()
plt.plot([1, 2, 3])

sht = xw.Book().sheets[0]
sht.pictures.add(fig, name='MyPlot', update=True,
                     left=sht.range('B5').left, top=sht.range('B5').top)
#添加left和top参数
程序

 除以2好像是变小了

import matplotlib.pyplot as plt
import xlwings as xw

fig = plt.figure()
plt.plot([1, 2, 3])

sht = xw.Book().sheets[0]
# sht.pictures.add(fig, name='MyPlot', update=True,
#                      left=sht.range('B5').left, top=sht.range('B5').top) ##添加left和top参数
plot = sht.pictures.add(fig, name='MyPlot', update=True)
plot.height /= 2
plot.width /= 2
程序

得到一个Matplotlib数字

以下是一些如何获得matplotlib“figure”对象的示例:

  • 通过PyPlot界面:

    import matplotlib.pyplot as plt
    fig = plt.figure()
    plt.plot([1, 2, 3, 4, 5])    
    

    或:

    import matplotlib.pyplot as plt
    plt.plot([1, 2, 3, 4, 5])
    fig = plt.gcf()    
    
  • 通过面向对象的接口:

    from matplotlib.figure import Figure
    fig = Figure(figsize=(8, 6))
    ax = fig.add_subplot(111)
    ax.plot([1, 2, 3, 4, 5])    
    
  • 通过Pandas:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
    ax = df.plot(kind='bar')
    fig = ax.get_figure()   
import matplotlib.pyplot as plt
import xlwings as xw

fig = plt.figure()
plt.plot([1, 2, 3, 4, 5])

sht = xw.Book().sheets[0]
# sht.pictures.add(fig, name='MyPlot', update=True,
#                      left=sht.range('B5').left, top=sht.range('B5').top) ##添加left和top参数
plot = sht.pictures.add(fig, name='MyPlot', update=True)
plot.height /= 2
plot.width /= 2
程序

 生成一个工作簿

import xlwings as xw

app = xw.App(visible=True, add_book=False)
app.display_alerts = False  # 关闭一些提示信息,可以加快运行速度。 默认为 True。
app.screen_updating = True  # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度。
wb = app.books.add()
sht = wb.sheets.active
print(sht)
print(wb,app)
程序

import xlwings as xw

app = xw.App(visible=True, add_book=False)
'''工作簿'''
# wb = app.books.add() # 新建工作簿。
# wb = app.books.open(r'mcw.xlsx') # 打开现有的工作簿
wb = app.books.active() # 获取当前活动的工作簿#这个有问题,执行失败
print(wb,type(wb)) #TypeError: 'Book' object is not callable
app = xw.App(visible=True, add_book=True)  #添加工作簿为真就添加,否就不添加
import xlwings as xw

app = xw.App(visible=True, add_book=False)  #添加工作簿为真就添加,否就不添加,但是配合下面这条就可以创建工作簿
wb = app.books.add()                   # 新建工作簿。
import xlwings as xw
wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件,每次运行都重新打开一个
sht = wb.sheets['mcw']  #
# sht = wb.sheets.active                 # 获取当前活动的工作表,这个不清楚是干嘛的
# sht = wb.sheets[0]                     # 按索引获取工作表 
# sht = wb.sheets['Sheet2']              # 按表名获取工作表 
# sht1 = wb.sheets.add()                 # 新建工作表,默认新建的放在最前面。 
sht1 = wb.sheets.add('新建工作表', after=sht)   # 新建工作表,放在sht工作表后面。放在了mcw工作表后面
print(sht1)

读取单元格

  1. b3 = sht.range('b3')

import xlwings as xw
wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件,每次运行都重新打开一个
sht = wb.sheets['mcw']  #
b3 = sht.range('b3')
print(sht,b3)
程序

获取指定单元格或指定单元格范围的内容

import xlwings as xw
wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件,每次运行都重新打开一个
sht = wb.sheets['mcw']  #
b3 = sht.range('b3') #获取单元格
# 获取 b3 中的值
v = b3.value
#也可以根据行列号读取
b3_value = sht.range(3,2).value
#读取一段区间内的值
a1_c4_value = sht.range('a1:c4').options(ndim=2).value       # 加上 option 读取二维的数据
a1_c4_value2 = sht.range((1,1),(4,3)).options(ndim=2).value   # 和上面读取的内容一样。
print(sht,b3)
print('m1',v)
print('m2',b3_value)
print('m3',a1_c4_value)
print('m4',a1_c4_value2)
程序

 """ 写入 就是把值赋值给读取的单元格就可以了"""

 """设置单元格大小"""

import xlwings as xw
wb = xw.Book('mcw.xlsx')  # 连接到当前工作目录中的现有文件,每次运行都重新打开一个
sht = wb.sheets['mcw']  #
"""设置单元格大小"""
sht.autofit()    # 自动调整单元格大小。注:此方法是在单元格写入内容后,再使用,才有效。
sht.range(6,1).value='自动调整单元格大小。注:此方法是在单元格写入内容后,再使用,才有效。'
sht.range(1,4).column_width = 55    # 设置第4列 列宽。(1,4)为第1行第4列的单元格
sht.range(1,4).row_height = 55     # 设置第1行 行高