Python操作Excel文件,修改Excel样式(openpyxl)
秋风阁-北溪入江流
文章目录
- 安装依赖库`openpyxl`
- `openpyxl`的操作
- 加载文件,获取sheet
- 加载文件`load_workbook`
- 获取sheet
- 遍历单元格
- 迭代遍历
- 索引遍历
- 单元格行高和列宽的修改
- Excel列号与字母的转换
- Excel行高修改
- Excel列宽修改
- Excel表格文字对齐属性设置
- 修改单元格框线
- 保存Excel文件
- `openpyxl`实战,Excel样式优化
在操作Excel表格时,我们有时需要对Excel表中的内容样式进行修改。当Excel文件过大的情况下修改样式单元格较多,修改麻烦,可采用代码脚本的方式来进行Excel样式的修改
安装依赖库openpyxl
pip install openpyxl
openpyxl的操作
加载文件,获取sheet
加载文件load_workbook
在Excel中,一般把一个文件称为工作薄。在openpyxl中可以通过load_workbook()方法来加载一个文件,返回Workbook对象。Workbook对象会保存Excel表中的所有相关信息。
from openpyxl import load_workbookload_workbook(file_path)
获取sheet
在一个Excel文件中会有多个sheet表格,所以当操作Excel文件时,需要对多个sheet分别处理。在对多个sheet表格进行处理时,可以通过先获取表格内部所有的sheetname,然后在通过sheetname获取对应的sheet
openpyxl中可以通过workbook.get_sheet_names()方法来获取所需所有sheetname列表- 在
openpyxl中workbook.get_sheet_names()方法将在后续版本废除,可以通过workbook.sheetnames属性来获取所有的sheetname
- 在
- 获取到对应的
sheetname名称后,可以通过workbook.get_sheet_by_name(sheetname)的方法获取对应的sheet,然后对sheet中的单元格进行操作- 在
openpyxl中workbook.get_sheet_by_name(sheetname)方法将在后续版本废除,可以通过workbook.[sheetname]属性来获取对应的sheet
- 在
sheetnames = workbook.get_sheet_names()for sheetname in sheetnames:sheet = workbook.get_sheet_by_name(sheetname)...
openpyxl中可以通过workbook.sheetnames的方法获取所有的sheetname。推荐使用openpyxl中可以通过workbook.[sheetname]的方法根据sheetname获取对应的sheet。推荐使用
sheetnames = workbook.sheetnamesfor sheetname in sheetnames:sheet = workbook[sheetname]...
遍历单元格
Excel表格格式作为二维的结构化文件存储格式,对其数据遍历读取修改可以按照行的方式或列的方式进行遍历。
迭代遍历
在openpyxl中可以通过sheet.rows按行获取数据或sheet.columns按列获取数据。获取到每一行或者每一列的数据后在对其迭代遍历即可获取到具体的单元格cell,可以通过cell.value获取单元格的具体值。
按行遍历:
for row in sheet.rows:for cell in row:value = cell.value...
按列遍历:
for col in sheet.columns:for cell in col:value = cell.value...
索引遍历
通过sheet.rows和sheet.columns属性可以很好对按行或按列对表格进行迭代遍历,但是有时我们在遍历的过程中希望知道当前遍历对象的索引,迭代遍历不能很好的满足我们的需求。
在sheet.rows和sheet.columns属性中返回的是一个迭代器,所以不能直接根据索引获取内容,所以需要先将其转换成列表然后获取索引来实现遍历
注意,索引遍历因为将sheet的属性转存了,所以在索引遍历中对内容的修改并不会影响到Workbook对象,所以索引遍历的优点是仅能获取到对应的索引,并不能对属性进行修改。
按行索引:
rows = list(sheet.rows)for row_index in range(sheet.max_row):for col_index in range(len(rows[row_index])):value = rows[row_index][col_index].value...
按列索引:
columns = list(sheet.columns)for col_index in range(sheet.max_column):for row_index in range(len(columns[col_index])):value = columns[col_index][row_index].value...
单元格行高和列宽的修改
Excel列号与字母的转换
在Excel中,行号以数字1为下标开始索引,列号以字母A为下标开始索引。在编程语言中一般以下标0为下标开始索引。所以在处理列的时候需要将数字下标转换为相应的字母下标来获取对应的列。openpyxl提供列专门的转换工具。
openpyxl.utils.get_column_letter(index: int):实现数字下标到列号字母的转换openpyxl.utils.column_index_from_string(str_col: str):实现列号字母到数字下标到转换
Excel行高修改
在进行Excel行高的修改时,需要先根据对应的行号获取到对应的行,然后对行高修改。
在openpyxl中通过sheet.row_dimensions[row_number]获取到对应的行,修改sheet.row_dimensions[row_number].height属性来修改行高。
rows = list(sheet.rows)for row_index in range(sheet.max_row):for col_index in range(len(rows[row_index])):sheet.row_dimensions[row_index + 1].height = 100
Excel列宽修改
在进行Excel列宽的修改时,需要先根据对应的列号索引获取对应列的字母下标,然后根据字母下标获取对应列,对列宽修改。
在openpyxl中通过sheet.column_dimensions[col_number]获取到对应的列,修改sheet.column_dimensions[col_number].width属性来修改列宽。
columns = list(sheet.columns)for col_index in range(sheet.max_column):for row_index in range(len(columns[col_index])):sheet.column_dimensions[get_column_letter(col_index + 1)].width = 100
Excel表格文字对齐属性设置
在对Excel的行高和列宽属性进行修改后,由于文字的对齐设置往往会导致部分单元格中字体的显示效果不好。这时我们可以设置文字的对齐属性来修改文字在单元格中的排布。
在Excel中,对齐属性是针对单元格而言的,所以我们需要获取到对应的单元格而不是行列。对齐属性可以分为水平对齐属性和垂直对齐属性,需要对这两个维度的属性分别进行设置。
- 获取单元格:在
openpyxl中获取单元格是根据sheet按照先列后行的维度进行获取
cell = sheet[f"{get_column_letter(col_number)}{row_number}"]
- 对齐属性:在
openpyxl中对齐属性通过对象Alignment进行设置修改- 水平方向:
horizontal属性left:左对齐center:水平居中right:右对齐justify:两端对齐
- 垂直方向:
vertical属性top:顶端对齐center:垂直居中bottom:底端对齐
- 水平方向:
from openpyxl.styles import Alignmentalignment = Alignment(horizontal="justify", vertical="center")
- 修改对齐属性:通过修改单元格的
alignment属性来修改对齐属性
from openpyxl.styles import Alignmentalignment = Alignment(horizontal="justify", vertical="center")
sheet[f"{get_column_letter(col_number)}{row_number}"].alignment = alignment
修改单元格框线
在Excel中,针对表格的框线同样也是针对单元格而言的。openpyxl中修改框线通过Border对象来设置。由于边框线分别有上下左右四个方向的框线,所以需要分别对四个方向的框线进行设置。在Boder对象中通过Side属性来设置某一方向上的线条。
Border对象:单元格框线- 方向:
top:上边框线条设置bottom:下边框线条设置left:左边框线条设置right:右边框线条设置
- 线条属性
Side对象:style:设置线条的属性- 可选属性:
dashDot、dashDotDot、dashed、dotted、double、hair、medium、mediumDashDot、mediumDashDotDot、mediumDashed、slantDashDot、thick、thin - 线条的可选属性较多,一般选择常用的
thin线条即可
- 可选属性:
color:设置线条颜色,类型HEX格式的颜色属性,默认黑色
- 方向:
- 修改单元格边框:通过修改单元格的
border属性来修改边框颜色
from openpyxl.styles.borders import Border, Sidethin_border = Border(top=Side(style='thin'),bottom=Side(style='thin'),left=Side(style='thin'),right=Side(style='thin')
)
sheet[f"{get_column_letter(col_number)}{row_number}"].border = thin_border
保存Excel文件
在上文中提到,调用openpyxl.load_workbook()方法会返回一个Workbook对象,对象中包含了Excel中的相关信息属性,我们在后文中对Excel的修改,本质上都是对Workbook对象的属性进行修改,所以在保存是是需要调用workbook.save(file_path)即可将修改后的内容写入Excel文件中。
openpyxl实战,Excel样式优化
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter, column_index_from_string
from openpyxl.styles import Alignment
from openpyxl.styles.borders import Border, Sidedef pref_excel_style(file_path):"""优化Excel样式根据单元格内文字长度优化行高和列宽优化单元格边框样式"""# 边框样式thin_border = Border(top=Side(style='thin'),bottom=Side(style='thin'),left=Side(style='thin'),right=Side(style='thin'),)# 对齐属性alignment = Alignment(horizontal="justify", vertical="center")# 获取工作博workbook = load_workbook(file_path)# 根据sheet名称来获取当前工作表,逐sheet修改for sheetname in workbook.sheetnames:sheet = workbook[sheetname]columns = list(sheet.columns)rows = list(sheet.rows)# 列遍历获取每列最长cell,修改单元格宽度for col_index in range(sheet.max_column):try:max_col_len = max(len(cell.value) for cell in columns[col_index] if cell.value is not None)# 修改cell宽度if max_col_len <= 5:sheet.column_dimensions[get_column_letter(col_index + 1)].width = 10elif 5 < max_col_len < 75:sheet.column_dimensions[get_column_letter(col_index + 1)].width = max_col_len * 1.5else:sheet.column_dimensions[get_column_letter(col_index + 1)].width = 100except ValueError as error:# 捕获在多个sheet的情况下,其余sheet内无数据导致的调用max()方法异常...# 行遍历获取没行最长cell,修改行高和超出长度单元格排布属性for row_index in range(sheet.max_row):try:max_row_len = max(len(cell.value) for cell in rows[row_index] if cell.value is not None)if max_row_len > 100:sheet.row_dimensions[row_index + 1].height = max_row_len * 2for col_index in range(sheet.max_column):# 修复文字内容过长情况下修改cell高度文字的排版情况sheet[f"{get_column_letter(col_index + 1)}{row_index + 1}"].alignment = alignmentexcept ValueError as error:...# 所有数据添加单元格for row in sheet.rows:for cell in row:cell.border = thin_borderworkbook.save(file_path)
以上的行高和列宽与单元格文字长度是经过多次试验后得到了修改样式后显示效果较优的关系,可根据自身需求更改。
相关文章:
Python操作Excel文件,修改Excel样式(openpyxl)
秋风阁-北溪入江流 文章目录 安装依赖库openpyxlopenpyxl的操作加载文件,获取sheet加载文件load_workbook获取sheet 遍历单元格迭代遍历索引遍历 单元格行高和列宽的修改Excel列号与字母的转换Excel行高修改Excel列宽修改 Excel表格文字对齐属性设置修改单元格框线保…...
AutoSAR系列讲解(实践篇)7.6-实验:配置SWCRTE(下)
阅读建议: 实验篇是重点,有条件的同学最好跟着做一遍,然后回头对照着AutoSAR系列讲解(实践篇)7.5-OS原理进阶_ManGo CHEN的博客-CSDN博客理解其配置的目的和意义。本篇是接着AutoSAR系列讲解(实践篇)7.4-实验:配置SWC&RTE_ManGo CHEN的博客-CSDN博客的实验篇接着做…...
【node】使用express+gitee搭建图床,并解决防盗链问题
首先创建一个gitee的项目,详细步骤我就不一一说明 注解:大家记得将这个项目开源,还有记得获取自己的私钥,私钥操作如下: node依赖下载: "axios": "cors": "express"…...
蕨型叶分形
目录 要点 基本语句 EraseMode 习题 1 设置颜色 2 旋转蕨型叶图 3 枝干 4 塞平斯基三角形 要点 蕨型叶是通过一个点的反复变换产生的,假设x是一个含有两个分量的向量,可以用来表示平面内的一个点,则可以用Axb的形式对其进行变换。 基本…...
DevOps系列文章之 Git知识大全
Git常用命令 配置Git-SSH 配置Git的user name以及Git要关联的邮箱email git config --global user.name your name git config --global user.email your email 生成密钥 ruby 复制代码 $ ssh-keygen -t rsa -C "your email" 按三个回车,跳过设置密码&am…...
JVM理论(六)执行引擎--垃圾回收
概述 垃圾: 指的是在运行程序中没有任何指针指向的对象垃圾回收目的: 为了及时清理空间使得程序可以正常运行垃圾回收机制: JVM采取的是自动内存管理,即JVM负责对象的创建以及回收,将程序员从繁重的内存管理释放出来,更加专注业务的开发垃圾回收区域: 频繁收集Young区(新生代)…...
贪心算法重点内容
贪心算法重点内容 4.1部分背包 按照单位重量的价值排序 4.2最小生成树 两种算法 4.3单源最短路径 4.4哈夫曼树...
基于深度学习的高精度交通信号灯检测系统(PyTorch+Pyside6+YOLOv5模型)
摘要:基于深度学习的高精度交通信号灯检测识别可用于日常生活中检测与定位交通信号灯目标,利用深度学习算法可实现图片、视频、摄像头等方式的交通信号灯目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…...
【3D目标检测】DSVT-2023CVPR
论文:https://arxiv.org/pdf/2301.06051.pdf 作者:北大,华为 代码:https://github.com/Haiyang-W/DSVT ( OpenPCDet 框架已集成) 讲解:实时部署!DSVT:3D动态稀疏体素Tr…...
我在VScode学Python(Python函数,Python模块导入)
我的个人博客主页:如果’真能转义1️⃣说1️⃣的博客主页 (1)关于Python基本语法学习---->可以参考我的这篇博客《我在VScode学Python》 (2)pip是必须的在我们学习python这门语言的过程中Python ---->&a…...
【目标跟踪】1、基础知识
文章目录 一、卡尔曼滤波二、匈牙利匹配 一、卡尔曼滤波 什么是卡尔曼滤波?——状态估计器 卡尔曼滤波用于在包含不确定信息的系统中做出预测,对系统下一步要做什么进行推测,且会结合推测值和观测值来得到修正后的最优值卡尔曼滤波就是利用…...
33. 搜索旋转排序数组
题目描述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], n…...
接口自动化测试要做什么?8个步骤讲的明明白白(小白也能看懂系列)
先了解下接口测试流程: 1、需求分析 2、Api文档分析与评审 3、测试计划编写 4、用例设计与评审 5、环境搭建(工具) 6、执行用例 7、缺陷管理 8、测试报告 那"接口自动化测试"怎么弄?只需要在上篇文章的基础上再梳理下就…...
Flutter 自定义 虚线 分割线
学习使用Flutter 进行 虚线 自定义控件 练习 // 自定义虚线 (默认是垂直方向) class DashedLind extends StatelessWidget {final Axis axis; // 虚线方向final double dashedWidth; // 根据虚线的方向确定自己虚线的宽度final double dashedHeight; //…...
Java毕业设计—爱宠医院管理系统设计与实现
爱宠医院管理系统 获取数论文、代码、答辩PPT、安装包,可以查看文章底部 一、 如何安装及配置环境 要运行整个爱宠医院管理系统需要安装数据库:MySQL 5.5,开发工具:JDK 1.8,开发语开发平台:Eclipse&…...
AI时代带来的图片造假危机,该如何解决
一、前言 当今,图片造假问题非常泛滥,已经成为现代社会中一个严峻的问题。随着AI技术不断的发展,人们可以轻松地通过图像编辑和AI智能生成来篡改和伪造图片,使其看起来真实而难以辨别,之前就看到过一对硕士夫妻为了骗…...
【动态规划】简单多状态
文章目录 动态规划(简单多状态)1. 按摩师2. 打家劫舍 ||3. 删除并获得点数4. 粉刷房子5. 最佳买卖股票时机含冷冻期6. 买卖股票的最佳时机含手续费7. 买卖股票的最佳时机 |||8. 买卖股票的最佳时机 IV 动态规划(简单多状态) 1. 按…...
科技资讯|苹果计划本月推出Vision Pro头显开发套件,电池有重大更新
根据消息源 aaronp613 分享的信息,苹果计划本月底面向开发者,发布 Vision Pro 头显开发套件。消息源还指出苹果更新了 Vision Pro 头显电池组的代号,共有 A2781,A2988 和 A2697 三种不同的型号,目前尚不清楚三者之间的…...
k8s 将pod节点上的文件拷贝到本地
要将 Kubernetes(k8s)中 Pod 节点上的文件拷贝到本地,可以通过使用 kubectl cp 命令来实现。kubectl cp 命令允许你在本地系统和 Pod 之间复制文件和目录。 下面是使用 kubectl cp 命令的语法: kubectl cp <namespace>/&l…...
Git简介与工作原理:了解Git的基本概念、版本控制系统和分布式版本控制的工作原理
🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~ἳ…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
