用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()方法将其保存到指定的bytesbytearray中。以下是操作步骤示例:

  1. 导入所需模块。
  2. 创建Workbook对象从而新建一个Excel工作簿,新建的工作簿中会有三个默认工作表。
  3. 使用Workbook.Worksheets.get_Item()方法获取一个工作表。
  4. 定义数据列表,或从其他地方导入数据。
  5. 通过Worksheet.Range.get_Item().Value.NumberValue属性写入数据到工作表中。
  6. 通过CellRange.Style中的属性设置单元格格式。
  7. 使用Worksheet.AutoFitColumn()方法自动调整列宽。
  8. 创建Stream对象。
  9. 使用Workbook.SaveToStream()方法将Excel工作簿保存到Stream对象。
  10. Stream对象转换为bytesbytearray,或写入已有的bytearray中。
  11. 释放资源。

代码示例

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工作簿保存为字节流

Python直接读取字节流中的Excel文件

我们可以使用Workbook.LoadFromStream(Stream(bytes))方法直接从字节流中加载PDF文档,然后遍历工作表中已使用的单元格的行和列,通过Worksheet.AllocatedRange.get_Item().Value属性直接读取单元格数据。以下是操作步骤示例:

  1. 导入所需模块。
  2. 创建Workbook对象。
  3. 使用Workbook.LoadFromStream(Stream(bytes))方法从字节流中加载Excel文件。
  4. 使用Workbook.Worksheets.get_Item()方法获取指定工作表。
  5. 遍历工作表中已使用的行和列,使用Worksheet.AllocatedRange.get_Item().Value属性获取单元格数据。
  6. 输出单元格数据或用于其他操作。
  7. 释放资源。

代码示例

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文件的数据

Python编辑字节流中的Excel文件

同样,我们也可以使用Workbook.LoadFromStream(Stream(bytes))方法直接从bytesbytearray中加载PDF文档,并对其进行修改编辑,然后使用Workbook.SaveToStream()方法将其保存回字节流中,从而实现编辑字节流中的Excel文件。以下是操作步骤示例:

  1. 导入所需模块。
  2. 创建Workbook对象。
  3. 使用字节流创建Stream对象。
  4. 使用Workbook.LoadFromStream()方法从Stream对象加载Excel文件。
  5. 使用Workbook.Worksheets.get_Item()方法获取指定工作表。
  6. 根据需要修改格式。
  7. 使用Workbook.SaveToStream()方法将Excel工作簿保存回Stream对象。
  8. Stream对象转换为bytesbytearray
  9. 将字节流写入文件或用于其他用途。
  10. 释放资源。

代码示例

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工作簿保存到字节流,以及读取和修改字节流中的Excel工作簿。

申请免费License

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.Net加密与Java互通

.Net加密与Java互通 文章目录 .Net加密与Java互通前言RSA生成私钥和公钥.net加密出数据传给Java端采用java方给出的公钥进行加密采用java方给出的私钥进行解密 .net 解密来自Java端的数据 AES带有向量的AES加密带有向量的AES解密无向量AES加密无向量AES解密 SM2(国密)SM2加密Sm…

elasticsearch-java客户端jar包中各模块的应用梳理

最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求,现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为:co.elastic.clients:elasticsearch-…

119.【C语言】数据结构之快速排序(调用库函数)

目录 1.C语言快速排序的库函数 1.使用qsort函数前先包含头文件 2.qsort的四个参数 3.qsort函数使用 对int类型的数据排序 运行结果 对char类型的数据排序 运行结果 对浮点型数据排序 运行结果 2.题外话:函数名的本质 1.C语言快速排序的库函数 cplusplus网的介绍 ht…

JVM实战—G1垃圾回收器的原理和调优

1.G1垃圾回收器的工作原理 (1)ParNew CMS的组合有哪些痛点 Stop the World是最大的问题。无论是新生代GC还是老年代GC,都会或多或少产生STW现象,这对系统的运行是有一定影响的。 所以JVM对垃圾回收器的优化,都是朝减少STW的目标去做的。在这…

HuatuoGPT-o1:基于40K可验证医学问题的两阶段复杂推理增强框架,通过验证器引导和强化学习提升医学模型的推理能力

HuatuoGPT-o1:基于40K可验证医学问题的两阶段复杂推理增强框架,通过验证器引导和强化学习提升医学模型的推理能力 论文大纲理解1. 确认目标2. 分析过程3. 实现步骤4. 效果展示 解法拆解全流程提问俩阶段详细分析 论文:HuatuoGPT-o1, Towards …

HTML——45.单元格合并

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表格</title></head><body><!--合并单元格&#xff1a;1.在代码中找到要合并的单元格2.在要合并的所有单元格中&#xff0c;保留要合并的第一个单元格…

electron在arm64架构交叉编译遇到libnotify/notify.h文件找不到错误记录

问题描述 在按照官方文档进行arm64下electron编译时出现下面的错误&#xff0c;编译环境为ubuntun22.04.5。 问题分析 由于当前目标架构是arm64&#xff0c;所以从上图可知sysroot为build/linux/debian_bullseye_arm64-sysroot&#xff0c;进入到该目录下查看libnotify的头文…

我的创作纪念日与2024年年报

我的创作纪念日 机缘 原来是你&#xff01; 收获 在创作的过程中都有哪些收获 获得了14668粉丝的关注。获得了正向或者反向的反馈&#xff1a;1万多赞、426评论、140多万阅读量等。认识和哪些志同道合的领域同行&#xff1a;有且再寻觅。 日常 &#x1f3e0;个人主页&…

点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定(升级版)

文章目录 1、updateInviteCodeStatus2、handleLock3、InviteCodeController4、InviteCodeService5、CrudRepository 点击锁定按钮&#xff0c;锁定按钮要变成解锁按钮&#xff0c;然后状态要从待绑定变成 已锁定&#xff1a;https://blog.csdn.net/m0_65152767/article/details…

使用npm包的工程如何引入mapboxgl-enhance/maplibre-gl-enhance扩展包

作者&#xff1a;刘大 前言 在使用iClient for MapboxGL/MapLibreGL项目开发中&#xff0c;往往会对接非EPSG:3857坐标系的地图&#xff0c;由于默认不支持&#xff0c;因此需引入mapboxgl-enhance/maplibre-gl-enhance扩展包。 在使用Vue等其他框架&#xff0c;通过npm包下载…

[2474].第04节:Activiti官方画流程图方式

我的后端学习大纲 Activiti大纲 1.安装位置&#xff1a; 2.启动&#xff1a;

UnityRenderStreaming使用记录(三)

测试UnityRenderStreaming在Ubuntu24.04.1LTS上的表现 先放上运行图操作系统 Ubuntu24.04.1LTSUnity测试工程环境相关修改遇到的问题 先放上运行图 操作系统 Ubuntu24.04.1LTS 系统下载地址 https://cn.ubuntu.com/download/desktop安装UnityHub https://blog.csdn.net/AWNUXC…

电脑主机后置音频插孔无声?还得Realtek高清晰音频管理器调教

0 缘起 一台联想电脑&#xff0c;使用Windows 10 专业版32位&#xff0c;电脑主机后置音频插孔一直没有声音&#xff0c;所以音箱是接在机箱前面版的前置音频插孔上的。 一天不小心捱到了音箱的音频线&#xff0c;音频线头断在音频插孔里面了&#xff0c;前置音频插孔因此用不…

【项目】智能BI洞察引擎 测试报告

目录 一、项目背景BI介绍问题分析项目背景 二、项目功能三、功能测试1、登录测试测试用例测试结果 2、注册测试测试用例测试结果出现的bug 3、上传文件测试测试用例测试结果 4、AI生成图表测试测试用例测试结果 5、分析数据页面测试&#xff08;异步&#xff09;测试用例测试结…

年会头投票小游戏

原型预览 源码 https://github.com/open-frame/vote 原型源文件 https://download.csdn.net/download/qq_42618566/90206788

活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;基础知识”活动&#xff0c;培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动&#xff0c;扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…

springboot499基于javaweb的城乡居民基本医疗信息管理系统(论文+源码)_kaic

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

Java高级

1.反射 每个类都有一个唯一的类对象&#xff0c;该对象是 java.lang.Class 类型。【是 Java 类的元数据&#xff08;metadata&#xff09;对象&#xff0c;包含了该类的结构信息和其他相关数据】 获取类对象 1.什么是类对象 public class Daughter extends Parent{ …

HarmonyOS NEXT 实战之元服务:静态案例效果---我的热门应用服务

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index import { authentica…

libvirt学习

文章目录 libvirt 简介节点、Hypervisor和域libvirt 安装和配置libvirt的XML配置文件libvirt APIMain libvirt APIsError handlingSpecial specific APIs 建立到Hypervisor的连接libvirt API使用编译libvirt工具virshvirt-clonevirt-dfvirt-imagevirt-installvirt-topvirt-what…