xlwings 是一个开源软件包,允许在 Windows 和 macOS 上使用 Python 自动化 Excel。用 Python 编写 Excel 宏和 UDF(UDF 仅适用于 Windows)。xlwings - 使用 Python 让 Excel 飞起来!
完全支持 Numpy 阵列和 Pandas Series/DataFrames,xlwings 支持的工作簿易于分发,并可在 Windows 和 Mac 上使用
免费的 xlwings 包括 xlwings 包中除 pro 文件夹以外的所有文件,即 xlwings.pro 子包。xlwings PRO 的目的是为 xlwings 的持续维护和增强提供资金。
pip install xlwings
# or conda:
conda install xlwings
# 安装所有依赖
pip install "xlwings[all]"
# 安装或升级到最新版本
pip install --upgrade xlwings
pip install -U xlwings
建立与工作簿的连接:
import xlwings as xw
# 这将创建一个新工作簿
wb = xw.Book()
# 连接到打开的文件或当前工作目录中的文件
wb = xw.Book('file.xlsx')
# 在Windows上:使用原始字符串转义反斜杠
wb = xw.Book(r'C:\path\to\file.xlsx')
# 如果在两个 Excel 实例中打开同一个文件
# 则需要完全限定该文件并包含应用程序实例
# 可通过 xw.apps.keys() 找到应用程序实例密钥(PID)
xw.apps[10559].books['file.xlsx']
实例化 sheet 对象:
sheet = wb.sheets['Sheet1']
从范围读取/写入值非常简单:
>>> sheet.range('A1').value = 'Foo 1'
>>> sheet.range('A1').value
'Foo 1'
范围扩展:
sheet.range('A1').value = [['Foo 1', 'Foo 2', 'Foo 3'],
[10.0, 20.0, 30.0]]
sheet.range('A1').expand().value
# [['Foo 1', 'Foo 2', 'Foo 3'], [10.0, 20.0, 30.0]]
pandas 的应用:
>>> import pandas as pd
>>> df = pd.DataFrame([[1,2], [3,4]], columns=['a', 'b'])
>>> sheet.range('A1').value = df
>>> sheet.range('A1').options(pd.DataFrame, expand='table').value
0.0 1.0 2.0
1.0 3.0 4.0
Matplotlib 图形的插入:
>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> plt.plot([1, 2, 3, 4, 5])
[<matplotlib.lines.Line2D at 0x1071706a0>]
>>> sheet.pictures.add(fig, name='MyPlot', update=True)
<Picture 'MyPlot' in <Sheet [Workbook4]Sheet1>>
保存 Excel:
wb.save()
wb.save(r'C:\path\to\new_file_name.xlsx')
wb.save('file_name.xlsx')
读取 Excel
在将数据读取/写入活动的工作表时,不需要文件对象:
>>> import xlwings as xw
>>> xw.Range('A1').value = 'something'
xw.Book
提供了连接表格文件的最简单方法:如果同一文件在多个实例中打开,它会在所有应用程序实例中查找该文件并返回错误。要连接到活动应用程序实例中的文件,请使用xw.books
,要引用特定应用程序,请使用:
# 或者类似 xw.apps[10559] 的东西对于现有的应用程序
# 通过 xw.apps.keys() 获取可用的PID
>>> app = xw.App()
>>> app.books['Book1']
请注意,您通常应将应用程序用作上下文管理器,因为这将确保Excel实例已关闭并再次正确清理:
with xw.App() as app:
book = app.books['Book1']
以下是读取/定义 Excel 或者创建一个 文件对象(xw.Book 和 xw.books):
# 新的电子簿
xw.Book()
xw.books.add()
# 未保存 book
xw.Book('Book1')
xw.books['Book1']
# 通过全名(路径)
xw.Book(r'C:/path/to/file.xlsx')
xw.books.open(r'C:/path/to/file.xlsx')
一些激活和选择方法:
# 活动应用程序(即Excel实例)
>>> app = xw.apps.active
# 活动 book
>>> wb = xw.books.active # in active app
>>> wb = app.books.active # in specific app
# Active sheet
>>> sheet = xw.sheets.active # in active book
>>> sheet = wb.sheets.active # in specific book
# Range on active sheet
>>> xw.Range('A1') # on active sheet of active book of active app
可以使用A1表示法、Excel基于1开头的索引(1-based indices)元组、命名范围或两个范围对象实例化范围:
xw.Range('A1')
xw.Range('A1:C3')
xw.Range((1,1))
xw.Range((1,1), (3,3))
xw.Range('NamedRange')
xw.Range(xw.Range('A1'), xw.Range('B2'))
# 完全的操作
xw.apps[763].books[0].sheets[0].range('A1')
xw.apps(10559).books(1).sheets(1).range('A1')
xw.apps[763].books['Book1'].sheets['Sheet1'].range('A1')
xw.apps(10559).books('Book1').sheets('Sheet1').range('A1')
范围索引/切片:
>>> rng = xw.Book().sheets[0].range('A1:D5')
>>> rng[0, 0]
# <Range [Workbook1]Sheet1!$A$1>
>>> rng[1]
# <Range [Workbook1]Sheet1!$B$1>
>>> rng[:, 3:]
# <Range [Workbook1]Sheet1!$D$1:$D$5>
>>> rng[1:3, 1:3]
# <Range [Workbook1]Sheet1!$B$2:$C$3>
范围快捷方式:
>>> sheet = xw.Book().sheets['Sheet1']
>>> sheet['A1']
# <Range [Book1]Sheet1!$A$1>
>>> sheet['A1:B5']
# <Range [Book1]Sheet1!$A$1:$B$5>
>>> sheet[0, 1]
# <Range [Book1]Sheet1!$B$1>
>>> sheet[:10, :10]
# <Range [Book1]Sheet1!$A$1:$J$10>
对象层次结构(链式操作),以下显示了对象层次结构的示例,即如何从应用程序到范围对象并一直返回: