1.xlwings 介绍

启动 Excel 应用并打开工作簿

import xlwings as xw

# 启动 Excel 应用
app = xw.App(visible=True)  # visible=True 会显示 Excel 窗口,设置为 False 时窗口隐藏
# 打开工作簿
wb = app.books.open('path_to_your_workbook.xlsx')

# 对工作簿进行操作
sheet = wb.sheets[0]  # 访问第一个工作表
print(sheet.range('A1').value)  # 读取 A1 单元格的值

创建新工作簿

import xlwings as xw

# 启动 Excel 应用
app = xw.App(visible=True)
# 创建新的工作簿
wb = app.books.add()

# 添加数据
sheet = wb.sheets[0]
sheet.range('A1').value = "Hello, World!"

# 保存文件
wb.save('new_workbook.xlsx')

# 关闭工作簿
wb.close()

2. 读取和写入数据

读取单元格的值

你可以通过 range 来访问单元格,读取其值:

sheet = wb.sheets[0]
value = sheet.range('A1').value  # 获取 A1 单元格的值
print(value)

写入数据到单元格

你可以直接将数据写入到单元格中:

sheet = wb.sheets[0]
sheet.range('A1').value = "Hello, Excel!"

读取一个范围的数据

你可以读取一个单元格区域的数据,返回的是一个二维列表:

values = sheet.range('A1:B3').value  # 获取 A1 到 B3 区域的值
print(values)

写入一个范围的数据

同样地,你也可以向一个区域写入数据:

sheet.range('A1:B3').value = [[1, 2], [3, 4], [5, 6]]  # 向 A1:B3 区域写入数据

3. 工作簿和工作表的管理

获取所有工作表的名称

sheet_names = wb.sheets.names
print(sheet_names)

访问特定工作表

你可以通过工作表的名称或索引来访问特定的工作表:

sheet = wb.sheets['Sheet1']  # 通过工作表名称访问
# 或者通过索引访问
sheet = wb.sheets[0]  # 通过索引访问第一个工作表

创建新的工作表

wb.sheets.add('NewSheet')  # 创建新的工作表并命名

删除工作表

wb.sheets['NewSheet'].delete()  # 删除名为 'NewSheet' 的工作表

4. Excel 公式操作

你可以通过 xlwings 操作 Excel 公式,就像在 Excel 中直接输入公式一样:

sheet.range('A1').value = 10
sheet.range('A2').value = 20
sheet.range('A3').formula = "=A1+A2"  # 在 A3 单元格中设置公式

5. 运行宏

xlwings 还允许你在 Excel 中运行 VBA 宏。你可以通过 macro 方法调用已定义的宏。

# 运行名为 'MyMacro' 的宏
wb.macro('MyMacro')()

6. 自动化操作

你可以创建一个 Excel 实例并将 visible 参数设置为 False,这样 Excel 就会在后台运行,不显示窗口。

import xlwings as xw

# 启动 Excel 应用,但不显示窗口
app = xw.App(visible=False)
# 打开工作簿
wb = app.books.open('path_to_your_workbook.xlsx')

# 执行操作
sheet = wb.sheets[0]
sheet.range('A1').value = "Hello, World!"

# 保存并关闭工作簿
wb.save('modified_workbook.xlsx')
wb.close()

# 退出 Excel 应用
app.quit()

7. 与 pandas 集成

xlwings 可以与 pandas 集成,轻松地将 Excel 表格导入到 pandas DataFrame 中,或者将 DataFrame 导入到 Excel 表格中。

从 Excel 导入数据到 pandas

import xlwings as xw
import pandas as pd

# 启动 Excel 应用
app = xw.App(visible=False)
# 打开工作簿
wb = app.books.open('path_to_your_workbook.xlsx')

# 将工作表的内容导入到 pandas DataFrame 中
sheet = wb.sheets[0]
df = sheet.range('A1').expand().options(pd.DataFrame).value

print(df)

# 退出应用
app.quit()

从 pandas 导入数据到 Excel

import xlwings as xw
import pandas as pd

# 创建一个简单的 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# 启动 Excel 应用
app = xw.App(visible=False)
# 创建新的工作簿
wb = app.books.add()

# 将 DataFrame 数据写入工作表
sheet = wb.sheets[0]
sheet.range('A1').value = df

# 保存文件
wb.save('output.xlsx')

# 退出应用
app.quit()

8. 退出应用

不要忘记在脚本结束时调用 app.quit() 来退出 Excel 应用程序,这样可以避免 Excel 进程在后台继续运行。

app.quit()

9. 与 Excel 中的图表交互

xlwings 允许你创建和修改 Excel 图表。

创建一个简单的图表

import xlwings as xw

# 启动 Excel 应用
app = xw.App(visible=True)
# 创建一个新的工作簿
wb = app.books.add()

# 获取第一个工作表
sheet = wb.sheets[0]

# 向单元格写入数据
sheet.range('A1').value = ['Jan', 'Feb', 'Mar', 'Apr', 'May']
sheet.range('B1').value = [10, 20, 30, 40, 50]

# 插入图表
chart = sheet.charts.add()  # 创建图表对象
chart.chart_type = 'column_clustered'  # 设置图表类型为柱状图
chart.set_source_data(sheet.range('A1:B5'))  # 设置数据源

# 保存文件
wb.save('chart_example.xlsx')

# 退出应用
app.quit()

修改现有图表

如果你已经有了图表,可以通过 xlwings 修改它的属性。

import xlwings as xw

# 打开已有的工作簿
app = xw.App(visible=True)
wb = app.books.open('chart_example.xlsx')
sheet = wb.sheets[0]

# 获取现有图表
chart = sheet.charts[0]
chart.chart_type = 'line'  # 将柱状图更改为折线图

# 保存并退出
wb.save()
app.quit()

10. 自定义 Excel 任务栏按钮

xlwings 支持通过 VBA 创建自定义的任务栏按钮,调用 Python 函数。

创建按钮并绑定到 Python 函数

import xlwings as xw

# 启动 Excel 应用
app = xw.App(visible=True)
wb = app.books.add()

# 获取工作表
sheet = wb.sheets[0]

# 添加一个按钮到工作表
button = sheet.buttons.add(left=100, top=100, width=100, height=40)
button.text = 'Run Python'

# 绑定 Python 函数到按钮
button.on_action = lambda: print("Button clicked!")  # 这里可以调用一个 Python 函数

# 保存并退出
wb.save('button_example.xlsx')
app.quit()

11. 调用 Python 函数作为 Excel 宏

xlwings 允许你创建自定义的 Excel 函数(UDF),即通过 Python 编写的 Excel 函数,这样就可以在 Excel 中像使用内置函数一样使用你的 Python 函数。

创建自定义函数并在 Excel 中使用

import xlwings as xw

# 定义 Python 函数
def multiply(x, y):
    return x * y

# 启动 Excel 应用
app = xw.App(visible=True)
wb = app.books.add()

# 注册自定义函数
xw.func(multiply)

# 使用该函数
sheet = wb.sheets[0]
sheet.range('A1').value = 5
sheet.range('B1').value = 10
sheet.range('C1').formula = '=multiply(A1, B1)'

# 保存并退出
wb.save('udf_example.xlsx')
app.quit()

12. 从 Excel 中读取并修改图像

你可以通过 xlwings 插入或修改工作簿中的图像。

插入图像

import xlwings as xw

# 启动 Excel 应用
app = xw.App(visible=True)
wb = app.books.add()

# 获取工作表
sheet = wb.sheets[0]

# 插入图像到工作表
sheet.pictures.add('path_to_image.jpg', left=100, top=100)

# 保存并退出
wb.save('image_example.xlsx')
app.quit()

13. 操作 Excel 数据验证

你可以使用 xlwings 设置 Excel 单元格的数据验证,例如下拉菜单、日期选择等。

设置数据验证(下拉菜单)

import xlwings as xw

# 启动 Excel 应用
app = xw.App(visible=True)
wb = app.books.add()

# 获取工作表
sheet = wb.sheets[0]

# 设置数据验证,添加下拉菜单
validation_range = sheet.range('A1')
validation_range.validation.add(
    type='list',
    alert_style='warning',
    operator='between',
    formula1='"Option 1,Option 2,Option 3"'  # 选项
)

# 保存并退出
wb.save('validation_example.xlsx')
app.quit()

14. 操作 Excel 的条件格式

xlwings 也支持在 Excel 中应用条件格式。例如,你可以高亮显示某些单元格。

设置条件格式

import xlwings as xw

# 启动 Excel 应用
app = xw.App(visible=True)
wb = app.books.add()

# 获取工作表
sheet = wb.sheets[0]

# 向 A1:A5 添加一些数据
sheet.range('A1').value = 10
sheet.range('A2').value = 20
sheet.range('A3').value = 30
sheet.range('A4').value = 40
sheet.range('A5').value = 50

# 添加条件格式:将大于 30 的单元格设置为红色
sheet.range('A1:A5').api.FormatConditions.Add(
    Type=1, Operator=5, Formula1='30'
).Interior.Color = 255  # 设置为红色

# 保存并退出
wb.save('conditional_format_example.xlsx')
app.quit()

15. 向 Excel 插入超链接

你还可以使用 xlwings 在工作表中插入超链接。

import xlwings as xw

# 启动 Excel 应用
app = xw.App(visible=True)
wb = app.books.add()

# 获取工作表
sheet = wb.sheets[0]

# 插入超链接
sheet.range('A1').value = 'Click Here'
sheet.range('A1').api.Hyperlinks.Add(
    Anchor=sheet.range('A1'),
    Address='https://www.example.com',
    TextToDisplay='Click Here'
)

# 保存并退出
wb.save('hyperlink_example.xlsx')
app.quit()