夜雨聆风学习资料网

ARTICLE · 1011686

pyexcel-xlsx:让你关注数据本身,而非 xlsx 格式

pyexcel-xlsx:让你关注数据本身,而非 xlsx 格式

pyexcel-xlsx 是一个轻量级的 xlsx/xlsm 读写封装库,在 GitHub 上获得了 121 个 Star:

图:正文顶部截图
正文顶部截图
图:README区域截图
README区域截图

如果你用 Python 处理过 Excel 文件,大概率接触过 openpyxl。openpyxl 功能全面,但 API 偏底层,每次读写都要关心工作簿、工作表、单元格这些概念。pyexcel-xlsx 在 openpyxl 之上做了一层封装,利用 openpyxl 的 read_only 和 write_only 模式,把 xlsx 文件的读写简化成了字典操作。

pyexcel-xlsx 属于 pyexcel 生态的一个组件。pyexcel 为多种表格格式提供统一 API,pyexcel-xlsx 负责其中 xlsx 和 xlsm 格式的读写。安装 pyexcel 0.2.2 以上版本后,pyexcel-xlsx 会自动注册,不需要显式 import。

核心用法

pyexcel-xlsx 的 API 围绕两个函数展开:get_data 用于读取,save_data 用于写入。数据在两者之间以 Python 字典流转,字典的键是工作表名称,值是二维列表。

写入一个 xlsx 文件:

from pyexcel_xlsx import save_datafrom collections import OrderedDictdata = OrderedDict()data.update({"Sheet 1": [[1, 2, 3], [4, 5, 6]]})data.update({"Sheet 2": [["row 1", "row 2", "row 3"]]})save_data("your_file.xlsx", data)

读取同样简洁:

from pyexcel_xlsx import get_datadata = get_data("your_file.xlsx")

返回的 data 结构与写入时一致,一个 dict 对应整个工作簿,每个 key 对应一张工作表,value 是行列组成的二维数组。

内存读写

pyexcel-xlsx 支持从 BytesIO 对象读写,这对 Web 场景很实用。文件上传时可以从 request.FILES 直接读取,文件下载时把数据写入 BytesIO 再返回给客户端:

from io import BytesIOfrom pyexcel_xlsx import save_dataio = BytesIO()save_data(io, data)# 将 io 传给 HTTP response 触发下载

读取上传文件:

data = get_data(uploaded_file_io)

整个过程不需要落地到磁盘,纯内存操作。

分页读取

处理大文件时,pyexcel-xlsx 提供了按行列分页读取的能力。四个参数控制读取范围:start_row、row_limit、start_column、column_limit:

partial_data = get_data("huge_file.xlsx", start_row=2, row_limit=3)

限定列范围:

partial_data = get_data("huge_file.xlsx", start_column=1, column_limit=2)

行列可以组合使用,按需加载数据片段,避免一次性把大文件全部读入内存。

作为 pyexcel 插件

如果项目用了 pyexcel 统一接口,集成更简单。安装 pyexcel-xlsx 后无需显式 import:

import pyexcel as pesheet = pe.get_book(file_name="your_file.xlsx")sheet.save_as("another_file.xlsx")

文件上传场景中用 file_type 和 file_content 参数处理二进制内容:

with open("file.xlsx", "rb") as f:    content = f.read()    r = pe.get_book(file_type="xlsx", file_content=content)

已知限制

pyexcel-xlsx 定位是数据读写,不支持字体、颜色和图表。auto_detect_int 参数在 Python 3 下无效,因为 openpyxl 默认将整数检测为 int 类型。skip_hidden_row_and_column 参数启用后无法使用 read_only 模式,会有性能损失。

小结

pyexcel-xlsx 的定位很明确:它是 openpyxl 之上的薄封装层,把 xlsx 读写简化为对 Python 字典的操作。如果你只需要提取或写入数据而不需要格式控制,它的 API 体积和上手成本都会低于直接使用 openpyxl。作为 pyexcel 生态的组成部分,它也能与 pyexcel 无缝配合,用统一接口处理多种表格格式。

相关学习资料