在处理 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 天的临时许可证。