使用Python操作字节流中的Excel文档
作者:Eiceblue
Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络传输或内存中处理敏感信息时。本文将介绍如何使用Python创建和保存Excel文件到字节流,以及读取和修改字节流中的Excel文件。
本文所使用的方法需要用到Spire.XLS for Python,PyPI:pip install spire.xls
。
Python创建Excel文件并保存到字节流
我们可以通过创建一个Workbook实例从而创建一个Excel工作簿,然后向其中添加数据并设置好格式,最后使用Workbook.SaveToStream()方法将其保存到指定的bytes或bytearray中。以下是操作步骤示例:
- 导入所需模块。
- 创建Workbook对象从而新建一个Excel工作簿,新建的工作簿中会有三个默认工作表。
- 使用Workbook.Worksheets.get_Item()方法获取一个工作表。
- 定义数据列表,或从其他地方导入数据。
- 通过Worksheet.Range.get_Item().Value或.NumberValue属性写入数据到工作表中。
- 通过CellRange.Style中的属性设置单元格格式。
- 使用Worksheet.AutoFitColumn()方法自动调整列宽。
- 创建Stream对象。
- 使用Workbook.SaveToStream()方法将Excel工作簿保存到Stream对象。
- 将Stream对象转换为bytes或bytearray,或写入已有的bytearray中。
- 释放资源。
代码示例
from spire.xls import Workbook, FileFormat, Stream, Color, HorizontalAlignType # 创建一个工作簿实例 workbook = Workbook() # 获取第一个工作表 sheet = workbook.Worksheets.get_Item(0) # 创建或读取一个二维数据列表 data = [ ["书名", "作者", "出版年份", "类型", "价格 (人民币)"], ["了不起的盖茨比", "F. Scott Fitzgerald", 1925, "小说", 10.99], ["杀死一只知更鸟", "Harper Lee", 1960, "小说", 8.99], ["1984", "George Orwell", 1949, "反乌托邦", 7.99], ["傲慢与偏见", "Jane Austen", 1813, "浪漫", 6.99], ["麦田里的守望者", "J.D. Salinger", 1951, "小说", 9.99], ["美丽新世界", "Aldous Huxley", 1932, "反乌托邦", 8.49], ["霍比特人", "J.R.R. Tolkien", 1937, "奇幻", 12.99], ["动物庄园", "George Orwell", 1945, "寓言", 5.99], ["指环王", "J.R.R. Tolkien", 1954, "奇幻", 14.99], ["白鲸", "Herman Melville", 1851, "冒险", 11.99] ] # 将数据插入到工作表中 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(77, 189, 155) headerRow.Style.Font.FontName = "宋体" headerRow.Style.Font.Size = 14 headerRow.Style.Font.IsBold = True 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 row.Style.Color = Color.FromRgb(255, 253, 208) if i % 2 == 0: row.Style.Color = Color.FromRgb(255, 248, 183) # 自动调整列宽 for i in range(sheet.AllocatedRange.Columns.Count): sheet.AutoFitColumn(i + 1) # 创建一个流对象 stream = Stream() # 将工作簿保存到流中 workbook.SaveToStream(stream, FileFormat.Version2016) # 将流转换为字节 bytes_data = stream.ToArray() # 将字节写入文件或按需要使用 with open("output/CreateExcelByStream.xlsx", "wb") as file: file.write(bytes_data)
运行结果
Python直接读取字节流中的Excel文件
我们可以使用Workbook.LoadFromStream(Stream(bytes))方法直接从字节流中加载PDF文档,然后遍历工作表中已使用的单元格的行和列,通过Worksheet.AllocatedRange.get_Item().Value属性直接读取单元格数据。以下是操作步骤示例:
- 导入所需模块。
- 创建Workbook对象。
- 使用Workbook.LoadFromStream(Stream(bytes))方法从字节流中加载Excel文件。
- 使用Workbook.Worksheets.get_Item()方法获取指定工作表。
- 遍历工作表中已使用的行和列,使用Worksheet.AllocatedRange.get_Item().Value属性获取单元格数据。
- 输出单元格数据或用于其他操作。
- 释放资源。
代码示例
from spire.xls import Workbook, Stream # 创建一个字节对象或使用现有的字节对象 with open("output/CreateExcelByStream.xlsx", "rb") as file: bytes_data = file.read() # 创建一个工作簿实例 workbook = Workbook() # 从字节流加载Excel文件 workbook.LoadFromStream(Stream(bytes_data)) # 获取第一个工作表 sheet = workbook.Worksheets.get_Item(0) # 从工作表读取数据 # 创建一个列表来存储数据 data = [] for i in range(sheet.AllocatedRange.Rows.Count): # 获取一行数据 row = sheet.AllocatedRange.Rows.get_Item(i) # 创建一个列表来存储该行的数据 row_data = [] for j in range(row.Cells.Count): # 获取单元格的值 cellValue = sheet.AllocatedRange.get_Item(i + 1, j + 1).Value row_data.append(cellValue) data.append(row_data) # 打印数据或按需使用 for row in data: print(row) # 释放资源 workbook.Dispose()
运行结果
Python编辑字节流中的Excel文件
同样,我们也可以使用Workbook.LoadFromStream(Stream(bytes))方法直接从bytes或bytearray中加载PDF文档,并对其进行修改编辑,然后使用Workbook.SaveToStream()方法将其保存回字节流中,从而实现编辑字节流中的Excel文件。以下是操作步骤示例:
- 导入所需模块。
- 创建Workbook对象。
- 使用字节流创建Stream对象。
- 使用Workbook.LoadFromStream()方法从Stream对象加载Excel文件。
- 使用Workbook.Worksheets.get_Item()方法获取指定工作表。
- 根据需要修改格式。
- 使用Workbook.SaveToStream()方法将Excel工作簿保存回Stream对象。
- 将Stream对象转换为bytes或bytearray。
- 将字节流写入文件或用于其他用途。
- 释放资源。
代码示例
from spire.xls import Workbook, Stream, HorizontalAlignType, Color, FileFormat # 创建一个字节对象或使用现有的字节对象 with open("output/CreateExcelByStream.xlsx", "rb") as file: bytes_data = file.read() # 创建一个工作簿实例 workbook = Workbook() # 从字节流加载Excel文件 stream = Stream(bytes_data) workbook.LoadFromStream(stream) stream.Close() # 删除多余的工作表 #for i in range(1, workbook.Worksheets.Count): # workbook.Worksheets.Remove(workbook.Worksheets.get_Item(i)) # 获取第一个工作表 sheet = workbook.Worksheets.get_Item(0) # 修改标题行的样式 headerRow = sheet.AllocatedRange.Rows.get_Item(0) headerRow.Style.Font.Bold = False headerRow.Style.Font.FontName = "Calibri" headerRow.Style.Font.Size = 12 headerRow.Style.HorizontalAlignment = HorizontalAlignType.Left headerRow.Style.Color = Color.FromRgb(92, 64, 131) # 修改数据行的样式 for i in range(1, sheet.AllocatedRange.Rows.Count): row = sheet.AllocatedRange.Rows.get_Item(i) row.Style.Font.FontName = "Calibri" row.Style.Font.Size = 11 row.Style.Color = Color.FromRgb(255, 237, 206) if i % 2 == 0: row.Style.Color = Color.FromRgb(255, 228, 181) # 自动调整列宽 for i in range(sheet.AllocatedRange.Columns.Count): sheet.AutoFitColumn(i + 1) # 保存修改后的Excel文件 streamTemp = Stream() workbook.SaveToStream(streamTemp, FileFormat.Version2016) # 将流转换回字节 bytes_data = streamTemp.ToArray() # 将字节写入文件或按需使用 with open("output/ModifiedExcel.xlsx", "wb") as file: file.write(bytes_data)
运行结果
到此这篇关于使用Python操作字节流中的Excel文档的文章就介绍到这了,更多相关Python操作字节流Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!