vools.xl - Excel 读写库
基于 LibXL v3.8.0 的 Excel 文件读写库,支持 .xls 和 .xlsx 格式。
功能特点
- 高性能:使用原生 LibXL C/C++ 库,读写速度远超纯 Python 实现
- 零依赖:不需要安装 Excel 或其他 COM 组件
- 三层 API:对象级 API、批量矩阵 API、便捷函数三种使用方式
- 格式丰富:支持字体、颜色、对齐、边框、填充等单元格格式
- 工作表操作:支持添加、删除、重命名工作表,合并单元格等
- 公式支持:支持读写 Excel 公式
- Pandas 集成:与 pandas DataFrame 无缝互转
- 批量操作:支持二维矩阵批量读写,性能提升 4x+
- 表格展示:内置文本表格展示器,支持控制台快速预览数据
快速开始
方式1:便捷函数(最简单)
from vools.xl import read_excel, write_excel
# 写入 Excel
data = [
{'name': 'Alice', 'age': 25, 'city': 'New York'},
{'name': 'Bob', 'age': 30, 'city': 'Los Angeles'},
]
write_excel('output.xls', data, sheet_name='Users')
# 读取 Excel
data = read_excel('input.xls')
for row in data:
print(row['name'], row['age'])
方式2:批量矩阵读写(性能最优)
from vools.xl import read_excel_matrix, write_excel_matrix
# 批量写入 - 性能比逐单元格快 4x+
data = [
['Name', 'Age', 'City'],
['Alice', 25, 'New York'],
['Bob', 30, 'Los Angeles'],
]
write_excel_matrix('output.xlsx', data)
# 批量读取
matrix = read_excel_matrix('input.xlsx', rows=1000, cols=10)
for row in matrix:
print(row[0], row[1])
方式3:pandas DataFrame(数据分析)
from vools.xl import read_excel_df, write_excel_df
import pandas as pd
# 写入
df = pd.DataFrame({'name': ['Alice', 'Bob'], 'age': [25, 30]})
write_excel_df('output.xlsx', df)
# 读取
df = read_excel_df('input.xlsx')
print(df.describe())
方式4:控制台表格预览
from vools.xl import show_table
# 预览二维列表
data = [
['Name', 'Age', 'City'],
['Alice', 25, 'New York'],
['Bob', 30, 'Los Angeles'],
]
show_table(data, title='用户信息表')
# 预览 Sheet
from vools.xl import Book
with Book() as book:
sheet = book.add_sheet('Data')
sheet.write_str(0, 0, 'Name')
sheet.write_str(0, 1, 'Age')
sheet.write_str(1, 0, 'Alice')
sheet.write_num(1, 1, 25)
sheet.show(title='Sheet 预览')
# 或使用 show_table(sheet)
方式5:对象级 API(功能最全)
from vools.xl import Book
# 创建工作簿(默认 xlsx 格式)
with Book() as book:
# 添加工作表
sheet = book.add_sheet('Sheet1')
# 写入数据
sheet.write_str(0, 0, 'Name')
sheet.write_str(0, 1, 'Age')
sheet.write_str(1, 0, 'Alice')
sheet.write_num(1, 1, 25)
# 设置格式
fmt = book.add_format()
fmt.bold = True
fmt.align_h = 2 # 居中
sheet.write_str(0, 0, 'Name', fmt)
sheet.write_str(0, 1, 'Age', fmt)
# 合并单元格
sheet.set_merge(2, 2, 0, 2)
sheet.write_str(2, 0, 'Merged Cell')
# 保存文件(默认 xlsx)
book.save('output.xlsx')
# 如需 xls 格式,传入 xml_format=False
with Book(xml_format=False) as book:
sheet = book.add_sheet('Sheet1')
book.save('output.xls')
模块架构
vools/xl/
├── __init__.py # 主入口,导出所有公共 API
├── _core/ # 核心层
│ ├── __init__.py
│ ├── loader.py # DLL 加载器(单例模式)
│ └── api.py # 低层 C API 封装(ctypes 声明 + 枚举常量)
├── _objects/ # 对象封装层
│ ├── __init__.py
│ ├── book.py # Book 类(工作簿)
│ ├── sheet.py # Sheet 类(工作表)
│ ├── format.py # Format 类(单元格格式)
│ └── font.py # Font 类(字体)
├── _highlevel/ # 高级便捷函数
│ ├── __init__.py
│ └── utils.py # read_excel, write_excel 等
├── _utils/ # 工具函数
│ ├── __init__.py
│ └── helpers.py # 地址转换、颜色转换等
└── _dlls/ # 内置 DLL 文件
└── libxl.dll
API 参考
Book 类
| 方法 | 说明 |
|---|---|
Book(xml_format=False) |
创建工作簿,xml_format=True 时为 xlsx 格式 |
load(filename) |
加载 Excel 文件 |
save(filename) |
保存 Excel 文件 |
release() |
释放资源(推荐使用 with 语句自动管理) |
add_sheet(name, init_sheet=None) |
添加工作表 |
insert_sheet(index, name, init_sheet=None) |
插入工作表 |
get_sheet(index) |
获取工作表 |
del_sheet(index) |
删除工作表 |
move_sheet(src, dst) |
移动工作表 |
add_format(init_format=None) |
添加单元格格式 |
add_font(init_font=None) |
添加字体 |
add_custom_num_format(fmt) |
添加自定义数字格式 |
date_pack(year, month, day, ...) |
日期打包为 Excel 日期值 |
date_unpack(value) |
Excel 日期值解包 |
color_pack(r, g, b) |
RGB 颜色打包 |
color_unpack(color) |
颜色值解包为 RGB |
Sheet 类
数据读写:
| 方法 | 说明 |
|---|---|
cell_type(row, col) |
获取单元格类型 |
read_str(row, col) |
读取字符串 |
write_str(row, col, value, fmt=None) |
写入字符串 |
read_num(row, col) |
读取数字 |
write_num(row, col, value, fmt=None) |
写入数字 |
read_bool(row, col) |
读取布尔值 |
write_bool(row, col, value, fmt=None) |
写入布尔值 |
read_formula(row, col) |
读取公式 |
write_formula(row, col, expr, fmt=None) |
写入公式 |
read_blank(row, col) |
读取空白单元格 |
write_blank(row, col, fmt=None) |
写入空白单元格 |
read_error(row, col) |
读取错误类型 |
write_error(row, col, error, fmt=None) |
写入错误 |
read_comment(row, col) |
读取批注 |
write_comment(row, col, value, ...) |
写入批注 |
remove_comment(row, col) |
删除批注 |
行列操作:
| 方法 | 说明 |
|---|---|
col_width(col) |
获取列宽 |
row_height(row) |
获取行高 |
set_col(first, last, width, fmt=None, hidden=False) |
设置列属性 |
set_row(row, height, fmt=None, hidden=False) |
设置行属性 |
row_hidden(row) |
检查行是否隐藏 |
set_row_hidden(row, hidden) |
设置行隐藏 |
col_hidden(col) |
检查列是否隐藏 |
set_col_hidden(col, hidden) |
设置列隐藏 |
insert_row(first, last) |
插入行 |
insert_col(first, last) |
插入列 |
remove_row(first, last) |
删除行 |
remove_col(first, last) |
删除列 |
clear(row_first, row_last, col_first, col_last) |
清除区域 |
copy_cell(row_src, col_src, row_dst, col_dst) |
复制单元格 |
合并单元格:
| 方法 | 说明 |
|---|---|
set_merge(row_first, row_last, col_first, col_last) |
合并单元格 |
get_merge(row, col) |
获取合并区域 |
merge_size() |
合并单元格数量 |
merge_by_index(index) |
按索引获取合并区域 |
del_merge(row, col) |
删除合并 |
del_merge_by_index(index) |
按索引删除合并 |
属性:
| 属性 | 说明 |
|---|---|
name |
工作表名称(可读写) |
first_row |
首行索引(只读) |
last_row |
末行索引(只读) |
first_col |
首列索引(只读) |
last_col |
末列索引(只读) |
hidden |
隐藏状态(可读写) |
display_gridlines |
显示网格线(可读写) |
print_gridlines |
打印网格线(可读写) |
zoom |
缩放比例(可读写) |
landscape |
横向打印(可读写) |
paper |
纸张大小(可读写) |
header |
页眉(可读写) |
footer |
页脚(可读写) |
Format 类
| 属性/方法 | 说明 |
|---|---|
font |
字体对象(可读写) |
num_format |
数字格式(可读写) |
align_h |
水平对齐(可读写) |
align_v |
垂直对齐(可读写) |
wrap |
自动换行(可读写) |
rotation |
文字旋转角度(可读写) |
indent |
缩进(可读写) |
shrink_to_fit |
缩小字体填充(可读写) |
set_border(style) |
设置所有边框样式 |
set_border_color(color) |
设置所有边框颜色 |
border_left/right/top/bottom |
各边边框样式(可读写) |
border_left/right/top/bottom_color |
各边边框颜色(可读写) |
fill_pattern |
填充模式(可读写) |
pattern_foreground_color |
图案前景色(可读写) |
pattern_background_color |
图案背景色(可读写) |
locked |
锁定单元格(可读写) |
hidden |
隐藏公式(可读写) |
Font 类
| 属性 | 说明 |
|---|---|
size |
字号(可读写) |
bold |
粗体(可读写) |
italic |
斜体(可读写) |
strike_out |
删除线(可读写) |
color |
字体颜色(可读写) |
name |
字体名称(可读写) |
script |
上下标(可读写):0=正常, 1=上标, 2=下标 |
underline |
下划线类型(可读写) |
便捷函数
| 函数 | 说明 |
|---|---|
read_excel(filename, sheet_index=0, header=True, ...) |
读取 Excel 为字典列表 |
write_excel(filename, data, sheet_name='Sheet1', ...) |
字典列表写入 Excel |
read_excel_rows(filename, ...) |
读取 Excel 为二维列表 |
write_excel_rows(filename, data, ...) |
二维列表写入 Excel |
read_excel_matrix(filename, rows=None, cols=None, ...) |
批量读取二维矩阵 |
write_excel_matrix(filename, data, ...) |
批量写入二维矩阵 |
read_excel_df(filename, sheet_name=0, header=1, ...) |
读取为 pandas DataFrame |
write_excel_df(filename, df, sheet_name='Sheet1', ...) |
DataFrame 写入 Excel |
Sheet 批量方法
| 方法 | 说明 |
|---|---|
sheet.write_matrix(data, start_row=1, start_col=0) |
批量写入二维矩阵 |
sheet.read_matrix(rows, cols, start_row=1, start_col=0) |
批量读取矩阵 |
sheet.read_range(row_first, row_last, col_first, col_last) |
按范围批量读取 |
工具函数
| 函数 | 说明 |
|---|---|
rowcol_to_addr(row, col, absolute=False) |
行列索引转 Excel 地址 |
addr_to_rowcol(addr) |
Excel 地址转行列索引 |
rgb_to_color(red, green, blue) |
RGB 转 LibXL 颜色值 |
color_to_rgb(color) |
LibXL 颜色值转 RGB |
表格展示器
| 函数/方法 | 说明 |
|---|---|
show_table(data, title=None, has_header=True, ...) |
在控制台打印二维表格数据(支持 list/Sheet/Book/DataFrame) |
sheet.show(title=None, has_header=True, ...) |
Sheet 对象方法,在控制台显示当前工作表 |
book.show(title=None, has_header=True, ...) |
Book 对象方法,在控制台显示所有工作表 |
sheet_to_2d_list(sheet, has_header=True) |
将 Sheet 转换为二维列表 |
book_to_sheets_data(book, sheet_names=None) |
将 Book 转换为多个二维列表 |
dataframe_to_2d_list(df, show_index=False) |
将 DataFrame 转换为二维列表 |
枚举常量
单元格类型 (CellType):
CELLTYPE_EMPTY- 空CELLTYPE_NUMBER- 数字CELLTYPE_STRING- 字符串CELLTYPE_BOOLEAN- 布尔CELLTYPE_BLANK- 空白CELLTYPE_ERROR- 错误
水平对齐 (AlignH):
ALIGNH_GENERAL- 常规ALIGNH_LEFT- 左对齐ALIGNH_CENTER- 居中ALIGNH_RIGHT- 右对齐ALIGNH_FILL- 填充ALIGNH_JUSTIFY- 两端对齐ALIGNH_MERGE- 合并ALIGNH_DISTRIBUTED- 分散对齐
垂直对齐 (AlignV):
ALIGNV_TOP- 顶端ALIGNV_CENTER- 居中ALIGNV_BOTTOM- 底端ALIGNV_JUSTIFY- 两端对齐ALIGNV_DISTRIBUTED- 分散对齐
边框样式 (BorderStyle):
BORDERSTYLE_NONE- 无边框BORDERSTYLE_THIN- 细BORDERSTYLE_MEDIUM- 中BORDERSTYLE_DASHED- 虚线BORDERSTYLE_DOTTED- 点线BORDERSTYLE_THICK- 粗BORDERSTYLE_DOUBLE- 双线BORDERSTYLE_HAIR- hair
填充模式 (FillPattern):
FILLPATTERN_NONE- 无FILLPATTERN_SOLID- 实心FILLPATTERN_GRAY50- 50% 灰FILLPATTERN_GRAY75- 75% 灰FILLPATTERN_GRAY25- 25% 灰
常用颜色 (Color):
COLOR_BLACK- 黑色COLOR_WHITE- 白色COLOR_RED- 红色COLOR_GREEN- 绿色COLOR_BLUE- 蓝色COLOR_YELLOW- 黄色COLOR_AUTO- 自动
使用示例
1. 基本读写
from vools.xl import Book
with Book() as book:
sheet = book.add_sheet('Data')
# 写入表头
headers = ['Name', 'Age', 'City']
for i, h in enumerate(headers):
sheet.write_str(0, i, h)
# 写入数据
data = [
('Alice', 25, 'New York'),
('Bob', 30, 'Los Angeles'),
]
for row_idx, row_data in enumerate(data, start=1):
sheet.write_str(row_idx, 0, row_data[0])
sheet.write_num(row_idx, 1, row_data[1])
sheet.write_str(row_idx, 2, row_data[2])
book.save('data.xls')
2. 带格式的表格
from vools.xl import Book
from vools.xl._core.api import ALIGNH_CENTER, FILLPATTERN_SOLID, COLOR_YELLOW
with Book() as book:
sheet = book.add_sheet('Report')
# 表头格式
header_fmt = book.add_format()
header_fmt.bold = True
header_fmt.align_h = ALIGNH_CENTER
header_fmt.fill_pattern = FILLPATTERN_SOLID
header_fmt.pattern_foreground_color = COLOR_YELLOW
# 写入表头
headers = ['ID', 'Product', 'Price', 'Qty']
for i, h in enumerate(headers):
sheet.write_str(0, i, h, header_fmt)
# 设置列宽
sheet.set_col(0, 0, 8)
sheet.set_col(1, 1, 30)
sheet.set_col(2, 3, 12)
book.save('report.xls')
3. 公式与合并单元格
from vools.xl import Book
with Book() as book:
sheet = book.add_sheet('Calc')
# 标题(合并单元格)
sheet.set_merge(0, 0, 0, 3)
title_fmt = book.add_format()
title_fmt.bold = True
title_fmt.align_h = 2 # 居中
title_fmt.size = 14
sheet.write_str(0, 0, 'Sales Report', title_fmt)
# 数据
sheet.write_str(2, 0, 'Product A')
sheet.write_num(2, 1, 100)
sheet.write_num(2, 2, 10)
sheet.write_str(3, 0, 'Product B')
sheet.write_num(3, 1, 200)
sheet.write_num(3, 2, 5)
# 合计公式
sheet.write_str(5, 0, 'Total:')
sheet.write_formula(5, 1, 'SUMPRODUCT(B3:B4,C3:C4)')
book.save('calc.xls')
4. 使用便捷函数
from vools.xl import read_excel, write_excel
# 简单写入
data = [
{'name': '张三', 'age': 28, 'department': '研发部'},
{'name': '李四', 'age': 32, 'department': '市场部'},
{'name': '王五', 'age': 25, 'department': '财务部'},
]
write_excel('employees.xls', data, sheet_name='员工信息')
# 简单读取
employees = read_excel('employees.xls')
for emp in employees:
print(f"{emp['name']} - {emp['department']}")
注意事项
-
Trial 版本限制:未注册的 LibXL 会在 A1 单元格自动写入 trial 提示,且首个工作表写入 A1 会返回失败。注册后可正常使用。
-
资源管理:Book 对象使用完需要调用
release()释放资源。推荐使用with语句自动管理。 -
行号列号:所有行号列号均从 0 开始计数,与 Excel 界面中的 A1(第1行第1列)对应关系为:row=0, col=0。
-
xlsx 格式:创建 Book 时传入
xml_format=True可创建 xlsx 格式文件。 -
注册码:使用
book.set_key(name, key)设置注册码去除 trial 版本限制。
SqlCel 函数映射 (vools.xl + vools.data Table)
SqlCel 提供了丰富的 Excel 自定义函数库 (D_FIND/D_VLOOKUP/D_SUMIF 等)。本节给出 SqlCel UDF 与 vools.xl + vools.data Table 方法的映射,便于从 Excel 公式迁移到 Python。
| SqlCel UDF | 描述 | Python 等价 |
|---|---|---|
D_FIND(range, value) |
查找值所在行 | Table.where(f"{col} == '{value}'") |
D_VLOOKUP(value, range, col, exact) |
垂直查找 | Table.where(f"{key} == '{value}'").select(col) |
D_SUMIF(range, criteria, sum_range) |
条件求和 | Table.where(criteria).sum(sum_col) |
D_COUNTIF(range, criteria) |
条件计数 | Table.where(criteria).rows() |
D_AVERAGEIF(range, criteria, avg_range) |
条件平均值 | Table.where(criteria).avg(avg_col) |
D_SELECT(range, conditions) |
条件查询 | Table.where(conditions) |
D_GROUPBY(range, group_col, agg_col, func) |
分组聚合 | Table.group_by(group_col).agg({agg_col: func}) |
D_SORT(range, sort_col, desc) |
排序 | Table.order_by(sort_col, desc=desc) |
D_DISTINCT(range) |
去重 | Table.distinct() |
D_LIMIT(range, n) |
限制行数 | Table.limit(n) |
D_FILTER(range, conditions) |
多条件过滤 | Table.where(conditions).filter(predicate) |
示例对比:
=SUMIF(D2:D100, ">30", E2:E100)
table.where('age > 30').sum('salary')
=VLOOKUP("Alice", A2:D100, 4, FALSE)
table.where('name == "Alice"').select('salary').column('salary')[0]
=COUNTIF(B2:B100, "NYC")
table.where('city == "NYC"').rows()
引擎适配 (Engine Adapter)
vools.xl 支持 pandas 风格的 engine 参数,可在不同 Excel 引擎间切换:
from vools.xl import read_excel_df, write_excel_df, get_engine, list_engines
# 查看已注册引擎
print(list_engines()) # ['odf', 'openpyxl', 'vools', 'xlrd']
# 默认使用 vools 引擎 (基于 LibXL)
df = read_excel_df('input.xlsx')
# 切换到 openpyxl
df = read_excel_df('input.xlsx', engine='openpyxl')
# 自定义引擎
from vools.xl import register_engine, BaseEngine
class MyEngine(BaseEngine):
name = 'myengine'
def read_df(self, filename, **kwargs): ...
def write_df(self, filename, df, **kwargs): ...
register_engine('myengine', MyEngine())
常见问题
Q: 为什么写入 A1 单元格返回 False? A: 未注册的 LibXL trial 版本会在 A1 写入 trial 提示,导致用户无法写入 A1。注册后即可正常使用。
Q: 支持哪些 Excel 格式? A: 支持 .xls (BIFF8) 和 .xlsx (Office Open XML) 格式。
Q: 需要安装 Excel 吗? A: 不需要。LibXL 是独立的库,不依赖 Excel 或任何 COM 组件。
Q: 支持大文件吗? A: 支持。LibXL 性能优秀,可高效处理大型 Excel 文件。
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vools_xl-0.7.3.tar.gz.
File metadata
- Download URL: vools_xl-0.7.3.tar.gz
- Upload date:
- Size: 54.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6c8f0beccecddc2af4e396af7286c1d186fe5ec84be33062cbc3bdfd4db4bb7
|
|
| MD5 |
f673f5077708cc159d2d73b99c5552eb
|
|
| BLAKE2b-256 |
de491fbc023ff3331f8cd483eb9a78762518798f97d210f706617204b494512f
|
File details
Details for the file vools_xl-0.7.3-py3-none-any.whl.
File metadata
- Download URL: vools_xl-0.7.3-py3-none-any.whl
- Upload date:
- Size: 50.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14f9800f452d5791396d1fa0ee7b2ec8fddc289426c148a3122343a0745f84d4
|
|
| MD5 |
0540e4bf4c64d7a9ecbc082ad4947706
|
|
| BLAKE2b-256 |
c1e589996ab8436f7f87de5376f01b2e5b46d19fc6a5808eb3f42c747bb38d29
|