在处理 excel 文件时,使用 python 中的字节流创建、读取和修改 excel 文件可以实现高效的数据操作和自动化。这种方法消除了对储存的直接读写以及对本地文件系统的依赖,非常适合云端或需要高效处理的环境。同时,这种途径还支持实时数据交换、系统集成和 web 应用中的即时反馈,帮助实现快速开发和灵活应用。本文将介绍如何使用 spire.xls for python 通过简单的 python 代码以字节流的方式动态处理 excel 工作簿。
安装 spire.xls for python
此教程需要 spire.xls for python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 windows 中。
pip install spire.xls
如果您不确定如何安装,请参考: 如何在 windows 中安装 spire.xls for python
动态创建 excel 文件并保存为字节流
借助 spire.xls for python,我们可以通过初始化 workbook 实例并填充数据来创建一个新的 excel 工作簿。工作簿准备就绪后,我们可以将其保存到 stream 对象,并将其转换成 bytes 对象以便进一步使用或存储。这种方法允许我们在内存中高效地生成 excel 文件,而无需依赖磁盘存储。
以下是使用 python 创建 excel 文件并将其保存为字节流的操作步骤:
- 创建一个 workbook 类的实例以初始化新的 excel 工作簿,默认包含三个工作表。
- 使用 workbook.worksheets.get_item() 方法获取工作表。
- 创建一个数据列表或从其他来源获取数据。
- 通过遍历行和列,使用 worksheet.range.get_item().value 或 numbervalue 属性填充工作表的数据。
- 使用 cellrange.style 中的属性设置单元格格式。
- 创建一个 stream 对象,并使用 workbook.savetostream() 方法将工作簿保存到其中。
- 使用 stream.toarray() 方法将流转换为 bytes 对象。
- python
from spire.xls import workbook, fileformat, stream, color, horizontalaligntype
# 创建workbook类的一个实例
workbook = workbook()
# 获取第一个工作表
sheet = workbook.worksheets.get_item(0)
# 创建一个二维列表作为数据源或从其他来源读取数据
data = [
["省份", "省会", "人口 (百万)", "面积 (平方公里)", "地区"],
["广东", "广州", 126, 179784, "华南"],
["山东", "济南", 100.5, 157100, "华东"],
["河南", "郑州", 96, 167000, "华中"],
["四川", "成都", 83.4, 485000, "西南"],
["江苏", "南京", 80.7, 102600, "华东"],
["河北", "石家庄", 75.5, 187700, "华北"],
["湖南", "长沙", 69.2, 211800, "华中"],
["浙江", "杭州", 65.4, 101800, "华东"],
["广西", "南宁", 56.2, 236700, "华南"],
["湖北", "武汉", 59.2, 185900, "华中"],
["福建", "福州", 41.5, 121400, "华东"]
]
# 将数据插入到工作表中
for i, row in enumerate(data):
for j, value in enumerate(row):
if isinstance(value, str):
sheet.range.get_item(i 1, j 1).value = value
else:
sheet.range.get_item(i 1, j 1).numbervalue = value
# 格式化标题行的新颜色
headerrow = sheet.allocatedrange.rows.get_item(0)
headerrow.style.color = color.fromrgb(0, 102, 204) # 蓝色标题
headerrow.style.font.fontname = "宋体"
headerrow.style.font.size = 14
headerrow.style.font.isbold = true
headerrow.style.font.color = color.fromrgb(255, 255, 255) # 白色文字
headerrow.style.horizontalalignment = horizontalaligntype.center
# 格式化数据行的新交替颜色
for i in range(1, sheet.allocatedrange.rows.count):
row = sheet.allocatedrange.rows.get_item(i)
row.style.font.fontname = "宋体"
row.style.font.size = 12
row.style.horizontalalignment = horizontalaligntype.left
if i % 2 == 0:
row.style.color = color.fromrgb(229, 243, 255) # 偶数行浅蓝色
else:
row.style.color = color.fromrgb(255, 255, 204) # 奇数行浅黄色
# 自动调整列宽
for i in range(sheet.allocatedrange.columns.count):
sheet.autofitcolumn(i 1)
# 创建stream对象
stream = stream()
# 将工作簿保存到流中
workbook.savetostream(stream, fileformat.version2016)
workbook.dispose()
# 将流转换为字节
bytes_data = stream.toarray()
# 将字节写入文件或按需使用
with open("output/createexcelbystream.xlsx", "wb") as file:
file.write(bytes_data)
用 python 读取字节流中的 excel 文件
要从字节流加载 excel 工作簿,我们可以将字节数据转换为 stream 对象并加载到 workbook 实例中。然后,我们就可以轻松获取工作表数据并在 python 应用程序中利用这些数据。
以下是从字节流读取 excel 文件的操作步骤:
- 创建表示 excel 文件的 bytes 对象或转换现有 bytearray 对象,也可使用现有的字节流。
- 用 bytes 对象创建 stream 实例。
- 创建 workbook 实例,并使用 workbook.loadfromstream() 方法从 stream 对象加载 excel 工作簿。
- 使用 workbook.worksheets.get_item() 方法获取工作表。
- 遍历行和列,使用 worksheet.allocatedrange.get_item().value 属性访问单元格值。
- 按需输出或使用获取的值。
- python
from spire.xls import workbook, stream
# 创建一个bytes对象或使用已有的一个
with open("output/createexcelbystream.xlsx", "rb") as file:
bytes_data = file.read()
# 创建workbook类的一个实例
workbook = workbook()
# 从字节流加载excel文件
stream = stream(bytes_data) # 将bytes_data转换为stream对象
workbook.loadfromstream(stream)
# 获取第一个工作表
sheet = workbook.worksheets.get_item(0)
# 读取工作表中的数据
# 创建一个列表来存储数据
data = []
for i in range(sheet.allocatedrange.rows.count):
# 检索一行数据
row_data = []
for j in range(sheet.allocatedrange.columns.count):
# 获取单元格的值
cellvalue = sheet.range.get_item(i 1, j 1).value # 或者 .text 如果需要获取显示文本
row_data.append(cellvalue)
data.append(row_data)
# 显示数据或按需使用
for row in data:
print([str(item) if item is not none else 'none' for item in row]) # 确保所有项都是字符串类型以便打印
# 释放资源
workbook.dispose()
用 python 编辑字节流中的 excel 文件
通过字节流修改 excel 文件使我们能够在不保存到磁盘的情况下动态更新数据。此方法需要将 excel 文件流加载到 workbook 实例中,使用 spire.xls for python 提供的类和方法对其内容或格式进行更改,然后将更改保存回字节流。
以下是使用 python 修改字节流中的 excel 工作簿的操作步骤:
- 创建表示 excel 文件的 bytes 对象或转换现有 bytearray 对象,也可使用现有的字节流。
- 用 bytes 对象创建 stream 实例,并使用 workbook.loadfromstream() 方法将其加载到 workbook 实例中。
- 使用 workbook.worksheets.get_item() 方法访问工作表。
- 使用 worksheet.allocatedrange.get_item().value 属性修改单元格值。
- 使用 cellrange.style 中的属性设置单元格格式,并使用 cellrange.borderaround() 或 cellrange.borderinside() 方法添加外边框或内边框。
- 使用 worksheet.autofitcolumn() 方法自动调整列宽。
- 使用 workbook.savetostream() 方法将工作簿保存到新的 stream 对象,并使用 stream.toarray() 方法将其转换回 bytes 或 bytearray。
- python
from spire.xls import workbook, stream, horizontalaligntype, color, fileformat
# 从文件读取字节数据
with open("output/createexcelbystream.xlsx", "rb") as file:
bytes_data = file.read()
# 创建workbook实例并从字节流加载excel文件
workbook = workbook()
stream = stream(bytes_data)
workbook.loadfromstream(stream)
stream.close() # 关闭流以释放资源
# 移除多余的worksheet
# for i in range(workbook.worksheets.count - 1, 0, -1):
# workbook.worksheets.removeat(i)
# 获取第一个工作表
sheet = workbook.worksheets.get_item(0)
# 修改标题行样式
headerrow = sheet.allocatedrange.rows.get_item(0)
headerrow.style.font.bold = true
headerrow.style.font.fontname = "微软雅黑"
headerrow.style.font.size = 12
headerrow.style.horizontalalignment = horizontalaligntype.left
headerrow.style.color = color.fromrgb(173, 216, 230) # 浅蓝色背景色
# 为标题行添加外边框
headerrow.borderaround()
# 修改数据行样式
for i in range(1, sheet.allocatedrange.rows.count):
row = sheet.allocatedrange.rows.get_item(i)
row.style.font.fontname = "微软雅黑"
row.style.font.size = 11
if i % 2 == 0:
row.style.color = color.fromrgb(240, 240, 240) # 偶数行浅灰色背景色
else:
row.style.color = color.fromrgb(255, 255, 255) # 奇数行白色背景色
# 自动调整列宽
for i in range(sheet.allocatedrange.columns.count):
sheet.autofitcolumn(i 1)
# 将修改后的excel文件保存到新的字节流中
streamtemp = stream()
workbook.savetostream(streamtemp, fileformat.version2016)
workbook.dispose() # 释放workbook对象资源
# 将字节流转换为字节数组,并写入新文件
bytes_data_modified = streamtemp.toarray()
with open("output/modifiedexcel.xlsx", "wb") as file:
file.write(bytes_data_modified)
# 确保关闭临时流以释放资源
streamtemp.close()
申请临时 license
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用javascript。获取有效期 30 天的临时许可证。