用Python操作字节流中的Excel文档
Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络传输或内存中处理敏感信息时。本文将介绍如何使用Python创建和保存Excel文件到字节流,以及读取和修改字节流中的Excel文件。
文章目录
- Python创建Excel文件并保存到字节流
- Python直接读取字节流中的Excel文件
- Python编辑字节流中的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 = valueelse: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 = 12row.Style.HorizontalAlignment = HorizontalAlignType.Leftrow.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).Valuerow_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 = 11row.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工作簿保存到字节流,以及读取和修改字节流中的Excel工作簿。
申请免费License
相关文章:

用Python操作字节流中的Excel文档
Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络…...
python 桶排序(Bucket Sort)
桶排序(Bucket Sort) 桶排序是一种分布式排序算法,适用于对均匀分布的数据进行排序。它的基本思想是:将数据分到有限数量的桶中,每个桶分别排序,最后将所有桶中的数据合并。 桶排序的步骤: 划…...
Elasticsearch:探索 Elastic 向量数据库的深度应用
Elasticsearch:探索 Elastic 向量数据库的深度应用 一、Elasticsearch 向量数据库简介 1. Elasticsearch 向量数据库的概念 Elasticsearch 本身是一个基于 Lucene 的搜索引擎,提供了全文搜索和分析的功能。随着技术的发展,Elasticsearch 也…...
【每日学点鸿蒙知识】属性变量key、waterflow卡顿问题、包无法上传、Video控件播放视频、Vue类似语法
1、HarmonyOS 属性变量常量是否可以作为object对象的key? a: object new Object() this.a[Constants.TEST_KEY] "456" 可以先定义,再赋值 2、首页点击回到waterflow的首节点,0~index全部节点被重建,导致卡顿 使用s…...

小程序中引入echarts(保姆级教程)
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...
基于 Node.js 的 ORM(对象关系映射)工具——Sequelize介绍与使用,并举案例分析
便捷性介绍 支持多种数据库,包括 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。Sequelize 提供了丰富的功能,帮助开发者用 JavaScript(或 TypeScript)代码操作数据库,而无需直接书写 SQL 语句。 Se…...
python 插入排序(Insertion Sort)
插入排序(Insertion Sort) 插入排序是一种简单的排序算法。它的基本思想是:将数组分为已排序部分和未排序部分,然后逐个将未排序部分的元素插入到已排序部分的正确位置。插入排序类似于整理扑克牌的过程。 插入排序的步骤&#…...

电子应用设计方案81:智能AI冲奶瓶系统设计
智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务,特别是在夜间或忙碌时,减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例,满足不同年龄段婴…...
JAVA高并发总结
JAVA高并发编程总结 在现代应用中,高并发编程是非常重要的一部分,尤其是在分布式系统、微服务架构、实时数据处理等领域。Java 提供了丰富的并发工具和技术,帮助开发者在多线程和高并发的场景下提高应用的性能和稳定性。以下是 Java 高并发编…...

【AIGC】使用Java实现Azure语音服务批量转录功能:完整指南
文章目录 引言技术背景环境准备详细实现1. 基础架构设计2. 实现文件上传功能3. 提交转录任务crul4. 获取转录结果 使用示例结果示例最佳实践与注意事项总结 引言 在当今数字化时代,将音频内容转换为文本的需求越来越普遍。无论是会议记录、视频字幕生成,…...

arcgis模版空库怎么用(一)
这里以某个项目的数据为例: 可以看到,属性表中全部只有列标题,无数据内容 可能有些人会认为空库是用来往里面加入信息的,其实不是,正确的用法如下: 一、下图是我演示用的数据,我们可以看到其中…...

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇)
【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇) 文章目录 [TOC](文章目录) 前言一、main.c二、GPIO.c三、PWMA.c四、ADC.c五、CMP.c六、Timer.c七、PMSM.c八、参考资料总结 前言 【电机控制】STC8H无感方波驱动—反电动势过零检测六步换向法 …...

小程序配置文件 —— 13 全局配置 - window配置
全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段,window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色; 状态栏:顶部位置,有网络信号、时间信息、电池信息等;导航条:有一个当…...
全球域名市场科普之域名交易平台介绍——Sedo与Afternic
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...

leetcode108:将有序数组转化为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确…...
截图技术方案
安卓截屏技术附带悬浮窗自动存储功能_安卓截图浮窗-CSDN博客 https://chat.baidu.com/search?dyTabStrMCwxMiwzLDEsMiwxMyw3LDYsNSw5&pdcsaitab&setypecsaitab&extParamsJson%7B%22apagelid%22%3A%2210990774271994514433%22%2C%22enter_type%22%3A%22a_ai_index%…...

程序员测试日常小工具
作为一名程序员,或者测试人员,日常工作最常用的工具有哪些,截图,截图漂浮,翻译,日期处理,api调用..., 当你拿到一串报文后,想要json转换时,是不是要打…...
Kubernetes: NetworkPolicy 的实践应用
一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范,用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...

HTML5滑块(Slider)
HTML5 的滑块(Slider)控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例: <…...
数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)
编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...

开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 罗克韦尔PLC,但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控,引入了开疆智能Etherne…...