Python实用工具:xlwings零基础入门教程——轻松实现Excel与Python的无缝交互

一、xlwings库核心概述

xlwings是一款功能强大的Python库,其核心用途是实现Python与Excel之间的双向通信,用户可以通过Python脚本直接操控Excel的工作簿、工作表、单元格等元素,同时也能在Excel中调用Python函数。该库的工作原理是基于COM接口(Windows系统)和AppleScript(Mac系统)与Excel应用程序建立连接,从而实现对Excel的底层操作,无需依赖复杂的第三方插件。

xlwings的优点十分突出:支持.xlsx、.xls等多种Excel文件格式;可以保留Excel的宏、公式和格式;语法简洁易懂,贴近Excel的原生操作逻辑;支持在Excel中嵌入Python代码,实现自动化报表生成、数据清洗和分析等功能。缺点则是在非Windows和Mac系统(如Linux)上无法直接使用,因为其依赖于Excel应用程序的安装;在处理超大规模数据时,速度相较于pandas等库会稍慢一些。xlwings采用的是MIT开源许可证,用户可以自由地用于商业和非商业项目,无版权方面的限制。

二、xlwings库的安装与环境配置

2.1 安装xlwings

对于技术小白来说,xlwings的安装过程非常简单,只需要使用Python的包管理工具pip即可完成。首先需要确保你的电脑上已经安装了Python环境(推荐Python 3.7及以上版本),并且已经配置好了pip的环境变量。

打开命令提示符(Windows)或终端(Mac),输入以下命令:

pip install xlwings

等待安装完成后,就可以在Python脚本中导入xlwings库进行使用了。

2.2 验证安装是否成功

安装完成后,我们可以通过一个简单的Python脚本来验证xlwings是否安装成功。创建一个名为test_xlwings.py的文件,输入以下代码:

# 导入xlwings库
import xlwings as xw

# 打开一个新的Excel工作簿
wb = xw.Book()
# 获取工作簿中的第一个工作表
ws = wb.sheets[0]
# 在A1单元格中写入内容
ws.range('A1').value = 'Hello, xlwings!'
# 保存工作簿到指定路径
wb.save('test.xlsx')
# 关闭工作簿
wb.close()
print("xlwings安装成功,测试文件已生成!")

运行该脚本,如果没有报错,并且在脚本所在目录下生成了一个名为test.xlsx的Excel文件,打开后A1单元格显示“Hello, xlwings!”,则说明xlwings已经成功安装并可以正常使用。

2.3 Excel环境配置

xlwings的使用依赖于本地安装的Excel应用程序,Windows系统推荐使用Microsoft Excel 2010及以上版本,Mac系统推荐使用Microsoft Excel for Mac 2016及以上版本。不需要进行额外的配置,只需要确保Excel能够正常启动即可。

三、xlwings核心功能与基础用法

3.1 工作簿(Workbook)的操作

工作簿是Excel文件的核心载体,xlwings提供了多种方式来创建、打开和保存工作簿。

3.1.1 创建新的工作簿

使用xw.Book()方法可以创建一个新的Excel工作簿,该方法会自动启动Excel应用程序(如果尚未启动)。

import xlwings as xw

# 创建新的工作簿
wb = xw.Book()
# 查看工作簿的名称
print("新建工作簿名称:", wb.name)
# 关闭工作簿
wb.close()

代码说明:xw.Book()创建的是一个临时的工作簿,默认名称为“Book1”“Book2”等,使用wb.name可以查看工作簿的名称,最后通过wb.close()关闭工作簿。

3.1.2 打开已有的工作簿

如果需要对已存在的Excel文件进行操作,可以使用xw.Book(file_path)方法,其中file_path是Excel文件的路径(绝对路径或相对路径)。

import xlwings as xw

# 打开已有的工作簿(相对路径,文件需在脚本所在目录)
wb = xw.Book('test.xlsx')
print("已打开工作簿名称:", wb.name)
# 关闭工作簿
wb.close()

# 使用绝对路径打开工作簿(示例路径,需根据实际情况修改)
# wb = xw.Book(r'C:\Users\Admin\Desktop\data.xlsx')

代码说明:使用相对路径时,Excel文件需要和Python脚本在同一个目录下;使用绝对路径时,需要在路径前加r,避免转义字符的影响。

3.1.3 保存工作簿

对工作簿进行操作后,需要使用save()方法来保存修改,save()方法可以指定保存路径,如果不指定,则保存到原文件路径。

import xlwings as xw

wb = xw.Book()
ws = wb.sheets[0]
ws.range('A1').value = 'Python操作Excel'

# 保存到指定路径
wb.save('new_excel.xlsx')
wb.close()

代码说明:如果指定的保存路径中不存在该文件,save()方法会自动创建;如果已经存在,则会覆盖原文件。

3.2 工作表(Worksheet)的操作

工作表是工作簿中的子对象,一个工作簿可以包含多个工作表,xlwings提供了丰富的方法来对工作表进行添加、删除、重命名和选择等操作。

3.2.1 选择工作表

可以通过工作表的索引或名称来选择工作表,索引从0开始,对应Excel中的第一个工作表。

import xlwings as xw

wb = xw.Book('new_excel.xlsx')
# 通过索引选择第一个工作表
ws1 = wb.sheets[0]
print("通过索引选择的工作表名称:", ws1.name)

# 通过名称选择工作表(默认第一个工作表名称为Sheet1)
ws2 = wb.sheets['Sheet1']
print("通过名称选择的工作表名称:", ws2.name)
wb.close()

代码说明:新建的工作簿默认只有一个名为“Sheet1”的工作表,通过索引和名称两种方式都可以准确选择目标工作表。

3.2.2 添加新的工作表

使用wb.sheets.add()方法可以在工作簿中添加新的工作表,可以指定工作表的名称和位置。

import xlwings as xw

wb = xw.Book('new_excel.xlsx')
# 添加新的工作表,名称为"数据报表",位置在最后
new_ws = wb.sheets.add(name='数据报表')
print("新增工作表名称:", new_ws.name)

# 添加新的工作表,位置在第一个工作表之前
# new_ws2 = wb.sheets.add(name='汇总表', before=wb.sheets[0])
wb.save()
wb.close()

代码说明:name参数用于指定新工作表的名称,before参数用于指定新工作表插入的位置,after参数则可以指定插入到某个工作表之后。

3.2.3 重命名和删除工作表

使用ws.name属性可以修改工作表的名称,使用ws.delete()方法可以删除指定的工作表。

import xlwings as xw

wb = xw.Book('new_excel.xlsx')
ws = wb.sheets['数据报表']
# 重命名工作表
ws.name = '销售数据报表'
print("重命名后的工作表名称:", ws.name)

# 删除指定的工作表
# wb.sheets['销售数据报表'].delete()
wb.save()
wb.close()

代码说明:删除工作表时要格外小心,删除后无法撤销,建议在删除前进行数据备份。

3.3 单元格(Range)的操作

单元格是Excel中存储数据的最小单位,xlwings提供了灵活的方式来对单元格进行读写、格式设置等操作,这也是xlwings最核心的功能之一。

3.3.1 单元格的选择

可以通过单元格的地址(如A1、B2)、行和列的索引来选择单元格或单元格区域。

import xlwings as xw

wb = xw.Book('new_excel.xlsx')
ws = wb.sheets[0]
# 选择单个单元格(A1)
rng1 = ws.range('A1')
print("A1单元格的值:", rng1.value)

# 选择单元格区域(A1:C3)
rng2 = ws.range('A1:C3')
print("A1:C3区域的行数:", rng2.rows.count)
print("A1:C3区域的列数:", rng2.columns.count)

# 通过行和列索引选择单元格(第1行第1列,即A1)
rng3 = ws.range((1, 1))
print("第1行第1列单元格的值:", rng3.value)

# 通过行和列索引选择单元格区域(第1行第1列到第3行第3列,即A1:C3)
rng4 = ws.range((1, 1), (3, 3))
wb.close()

代码说明:使用range()方法选择单元格区域时,可以使用Excel的单元格地址格式,也可以使用元组的形式指定起始和结束位置,元组中的第一个元素是行号,第二个元素是列号。

3.3.2 单元格数据的读取

读取单元格数据是xlwings的常用操作,无论是单个单元格还是单元格区域,都可以通过value属性来获取数据。

import xlwings as xw

# 先向Excel中写入测试数据,再进行读取
wb = xw.Book()
ws = wb.sheets[0]
# 向A1:C3区域写入数据
data = [
    ['姓名', '年龄', '性别'],
    ['张三', 25, '男'],
    ['李四', 28, '女']
]
ws.range('A1').value = data

# 读取单个单元格的值
name = ws.range('A2').value
print("A2单元格的值(姓名):", name)

# 读取整行数据(第2行)
row_data = ws.range('2:2').value
print("第2行数据:", row_data)

# 读取整列数据(第1列)
col_data = ws.range('A:A').value
# 过滤掉空值
col_data = [x for x in col_data if x is not None]
print("第1列数据:", col_data)

# 读取单元格区域的数据
range_data = ws.range('A1:C3').value
print("A1:C3区域的数据:")
for row in range_data:
    print(row)
wb.close()

代码说明:读取单元格区域的数据时,会返回一个二维列表,其中每个子列表对应Excel中的一行数据;读取整行或整列数据时,会返回一个一维列表,包含该行或该列的所有非空值。

3.3.3 单元格数据的写入

向单元格中写入数据同样通过value属性,xlwings支持写入单个值、列表、二维列表等多种数据类型。

import xlwings as xw

wb = xw.Book()
ws = wb.sheets[0]
# 写入单个值
ws.range('A1').value = '学生信息表'
# 合并单元格(A1:C1)
ws.range('A1:C1').api.merge()

# 写入一维列表(一行数据)
ws.range('A2').value = ['姓名', '年龄', '成绩']

# 写入二维列表(多行多列数据)
student_data = [
    ['王五', 22, 95],
    ['赵六', 23, 88],
    ['孙七', 21, 92]
]
ws.range('A3').value = student_data

# 写入字典数据(按列写入)
score_dict = {'语文': 90, '数学': 85, '英语': 93}
ws.range('E2').value = list(score_dict.keys())
ws.range('E3').value = list(score_dict.values())

wb.save('student_info.xlsx')
wb.close()

代码说明:写入一维列表时,xlwings会自动将列表中的元素按行写入单元格;写入二维列表时,会按多行多列的形式写入;写入字典数据时,可以将键和值分别写入不同的列。

3.3.4 单元格格式的设置

xlwings还支持对单元格的格式进行设置,如字体大小、颜色、对齐方式、边框等,这些设置通过api属性调用Excel的底层接口实现。

import xlwings as xw

wb = xw.Book('student_info.xlsx')
ws = wb.sheets[0]
# 设置标题单元格格式(A1:C1)
title_rng = ws.range('A1:C1')
# 设置字体大小为16,加粗
title_rng.api.Font.Size = 16
title_rng.api.Font.Bold = True
# 设置背景颜色为浅蓝色
title_rng.api.Interior.Color = xw.utils.rgb_to_int((211, 223, 236))
# 设置水平居中对齐
title_rng.api.HorizontalAlignment = xw.constants.HAlign.xlHAlignCenter

# 设置表头单元格格式(A2:C2)
header_rng = ws.range('A2:C2')
header_rng.api.Font.Bold = True
header_rng.api.Interior.Color = xw.utils.rgb_to_int((226, 239, 218))

# 为数据区域添加边框(A3:C5)
data_rng = ws.range('A3:C5')
# 边框样式:细实线
border = xw.constants.BordersIndex.xlEdgeLeft
data_rng.api.Borders(border).LineStyle = xw.constants.LineStyle.xlContinuous
data_rng.api.Borders(xw.constants.BordersIndex.xlEdgeRight).LineStyle = xw.constants.LineStyle.xlContinuous
data_rng.api.Borders(xw.constants.BordersIndex.xlEdgeTop).LineStyle = xw.constants.LineStyle.xlContinuous
data_rng.api.Borders(xw.constants.BordersIndex.xlEdgeBottom).LineStyle = xw.constants.LineStyle.xlContinuous

wb.save()
wb.close()

代码说明:xw.utils.rgb_to_int()函数用于将RGB颜色值转换为Excel可以识别的整数;xw.constants模块中包含了Excel的各种常量,如对齐方式、边框样式等,方便用户进行格式设置。

四、xlwings高级应用实战案例

4.1 案例一:自动化生成销售数据报表

在日常工作中,我们经常需要根据原始数据生成销售报表,使用xlwings可以实现这一过程的自动化,减少重复的手工操作。

4.1.1 需求分析

假设我们有一份销售原始数据,包含销售日期、产品名称、销售额等信息,需要实现以下功能:

  1. 读取原始销售数据;
  2. 按产品名称汇总销售额;
  3. 将汇总结果写入Excel报表,并设置报表格式;
  4. 生成销售额柱状图。

4.1.2 代码实现

import xlwings as xw
import pandas as pd

# 1. 生成模拟销售数据(实际应用中可以从CSV、数据库读取)
sales_data = {
    '销售日期': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02', '2024-01-03'],
    '产品名称': ['产品A', '产品B', '产品A', '产品C', '产品B'],
    '销售额': [1000, 1500, 1200, 800, 1600]
}
df = pd.DataFrame(sales_data)
# 按产品名称汇总销售额
summary_df = df.groupby('产品名称')['销售额'].sum().reset_index()

# 2. 使用xlwings创建销售报表
wb = xw.Book()
ws = wb.sheets[0]
ws.name = '销售汇总报表'

# 写入报表标题
ws.range('A1').value = '2024年1月产品销售汇总报表'
ws.range('A1').api.Font.Size = 18
ws.range('A1').api.Font.Bold = True
ws.range('A1:D1').api.merge()
ws.range('A1').api.HorizontalAlignment = xw.constants.HAlign.xlHAlignCenter

# 写入汇总数据
ws.range('A3').value = ['产品名称', '总销售额(元)']
ws.range('A4').value = summary_df.values

# 设置数据区域格式
header_rng = ws.range('A3:B3')
header_rng.api.Font.Bold = True
header_rng.api.Interior.Color = xw.utils.rgb_to_int((220, 220, 220))
data_rng = ws.range(f'A4:B{3 + len(summary_df)}')
data_rng.api.Borders.LineStyle = xw.constants.LineStyle.xlContinuous

# 3. 插入销售额柱状图
chart_range = ws.range(f'A3:B{3 + len(summary_df)}')
chart = ws.charts.add(left=ws.range('D3').left, top=ws.range('D3').top, width=400, height=300)
chart.set_source_data(chart_range)
chart.chart_type = xw.constants.ChartType.xlColumnClustered
chart.name = '产品销售额柱状图'
chart.api.ChartTitle.Text = '各产品销售额对比'

# 4. 保存报表
wb.save('2024年1月销售汇总报表.xlsx')
wb.close()
print("销售汇总报表已生成!")

代码说明:本案例结合了pandas库和xlwings库,pandas用于数据的汇总分析,xlwings用于Excel报表的生成和格式设置,同时还实现了图表的插入,让报表更加直观。

4.2 案例二:在Excel中调用Python函数

xlwings的一个特色功能是可以在Excel中直接调用Python函数,这对于需要在Excel中进行复杂计算的用户来说非常实用。

4.2.1 需求分析

实现一个在Excel中计算两个数的乘积和求和的功能,具体步骤如下:

  1. 编写Python函数,实现求和和乘积计算;
  2. 在Excel中通过xlwings调用这些函数;
  3. 实现Excel中数据的实时计算。

4.2.2 代码实现

步骤1:编写Python函数脚本
创建一个名为excel_functions.py的文件,输入以下代码:

import xlwings as xw

@xw.func
def add_numbers(a, b):
    """计算两个数的和"""
    return a + b

@xw.func
def multiply_numbers(a, b):
    """计算两个数的乘积"""
    return a * b

代码说明:使用@xw.func装饰器可以将普通的Python函数转换为可以在Excel中调用的函数。

步骤2:在Excel中调用Python函数

  1. 打开Excel应用程序;
  2. 点击“xlwings”选项卡(安装xlwings后会自动添加);
  3. 点击“Import Functions”按钮,选择刚才创建的excel_functions.py文件;
  4. 在Excel单元格中输入公式:
  • 求和:=add_numbers(A1, B1)
  • 乘积:=multiply_numbers(A1, B1)
  1. 在A1和B1单元格中输入数字,即可看到计算结果。

步骤3:实现实时计算
如果修改A1或B1单元格中的数值,Excel会自动调用Python函数重新计算结果,实现数据的实时更新。

五、xlwings常见问题与解决方案

5.1 问题1:运行脚本时提示“找不到Excel应用程序”

解决方案

  1. 检查电脑上是否安装了Excel应用程序,xlwings依赖于Excel的安装;
  2. 对于Windows系统,确保Excel的COM组件已注册,可以通过命令提示符运行excel.exe /regserver进行注册;
  3. 对于Mac系统,确保Excel的AppleScript权限已开启。

5.2 问题2:处理大规模数据时速度较慢

解决方案

  1. 尽量减少对单元格的逐个操作,采用批量读写的方式(如写入二维列表);
  2. 结合pandas库,先使用pandas处理数据,再将结果写入Excel;
  3. 在操作过程中可以将Excel设置为不可见模式,减少界面渲染的时间:
   import xlwings as xw
   app = xw.App(visible=False)
   wb = app.books.open('data.xlsx')
   # 进行数据处理
   wb.save()
   wb.close()
   app.quit()

5.3 问题3:保存文件时提示“文件被占用”

解决方案

  1. 检查Excel文件是否被其他程序打开,关闭相关程序后再尝试保存;
  2. 确保脚本中使用wb.close()app.quit()方法关闭工作簿和Excel应用程序;
  3. 如果仍然无法解决,可以重启电脑后再运行脚本。

六、xlwings相关资源

  • Pypi地址:https://pypi.org/project/xlwings
  • Github地址:https://github.com/xlwings/xlwings
  • 官方文档地址:https://docs.xlwings.org

关注我,每天分享一个实用的Python自动化工具。