当前位置: 首页 > news >正文

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列表
    • openpyxlworkbook.get_sheet_names()方法将在后续版本废除,可以通过workbook.sheetnames属性来获取所有的sheetname
  • 获取到对应的sheetname名称后,可以通过workbook.get_sheet_by_name(sheetname)的方法获取对应的sheet,然后对sheet中的单元格进行操作
    • openpyxlworkbook.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.rowssheet.columns属性可以很好对按行或按列对表格进行迭代遍历,但是有时我们在遍历的过程中希望知道当前遍历对象的索引,迭代遍历不能很好的满足我们的需求。
sheet.rowssheet.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:设置线条的属性
        • 可选属性:dashDotdashDotDotdasheddotteddoublehairmediummediumDashDotmediumDashDotDotmediumDashedslantDashDotthickthin
        • 线条的可选属性较多,一般选择常用的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的操作加载文件&#xff0c;获取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的项目&#xff0c;详细步骤我就不一一说明 注解&#xff1a;大家记得将这个项目开源&#xff0c;还有记得获取自己的私钥&#xff0c;私钥操作如下&#xff1a; node依赖下载&#xff1a; "axios": "cors": "express"…...

蕨型叶分形

目录 要点 基本语句 EraseMode 习题 1 设置颜色 2 旋转蕨型叶图 3 枝干 4 塞平斯基三角形 要点 蕨型叶是通过一个点的反复变换产生的&#xff0c;假设x是一个含有两个分量的向量&#xff0c;可以用来表示平面内的一个点&#xff0c;则可以用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" 按三个回车&#xff0c;跳过设置密码&am…...

JVM理论(六)执行引擎--垃圾回收

概述 垃圾: 指的是在运行程序中没有任何指针指向的对象垃圾回收目的: 为了及时清理空间使得程序可以正常运行垃圾回收机制: JVM采取的是自动内存管理,即JVM负责对象的创建以及回收,将程序员从繁重的内存管理释放出来,更加专注业务的开发垃圾回收区域: 频繁收集Young区(新生代)…...

贪心算法重点内容

贪心算法重点内容 4.1部分背包 按照单位重量的价值排序 4.2最小生成树 两种算法 4.3单源最短路径 4.4哈夫曼树...

基于深度学习的高精度交通信号灯检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度交通信号灯检测识别可用于日常生活中检测与定位交通信号灯目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的交通信号灯目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…...

【3D目标检测】DSVT-2023CVPR

论文&#xff1a;https://arxiv.org/pdf/2301.06051.pdf 作者&#xff1a;北大&#xff0c;华为 代码&#xff1a;https://github.com/Haiyang-W/DSVT &#xff08; OpenPCDet 框架已集成&#xff09; 讲解&#xff1a;实时部署&#xff01;DSVT&#xff1a;3D动态稀疏体素Tr…...

我在VScode学Python(Python函数,Python模块导入)

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 &#xff08;1&#xff09;关于Python基本语法学习---->可以参考我的这篇博客《我在VScode学Python》 &#xff08;2&#xff09;pip是必须的在我们学习python这门语言的过程中Python ----&#xff1e;&a…...

【目标跟踪】1、基础知识

文章目录 一、卡尔曼滤波二、匈牙利匹配 一、卡尔曼滤波 什么是卡尔曼滤波&#xff1f;——状态估计器 卡尔曼滤波用于在包含不确定信息的系统中做出预测&#xff0c;对系统下一步要做什么进行推测&#xff0c;且会结合推测值和观测值来得到修正后的最优值卡尔曼滤波就是利用…...

33. 搜索旋转排序数组

题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], n…...

接口自动化测试要做什么?8个步骤讲的明明白白(小白也能看懂系列)

先了解下接口测试流程&#xff1a; 1、需求分析 2、Api文档分析与评审 3、测试计划编写 4、用例设计与评审 5、环境搭建&#xff08;工具&#xff09; 6、执行用例 7、缺陷管理 8、测试报告 那"接口自动化测试"怎么弄&#xff1f;只需要在上篇文章的基础上再梳理下就…...

Flutter 自定义 虚线 分割线

学习使用Flutter 进行 虚线 自定义控件 练习 // 自定义虚线 &#xff08;默认是垂直方向&#xff09; class DashedLind extends StatelessWidget {final Axis axis; // 虚线方向final double dashedWidth; // 根据虚线的方向确定自己虚线的宽度final double dashedHeight; //…...

Java毕业设计—爱宠医院管理系统设计与实现

爱宠医院管理系统 获取数论文、代码、答辩PPT、安装包&#xff0c;可以查看文章底部 一、 如何安装及配置环境 要运行整个爱宠医院管理系统需要安装数据库&#xff1a;MySQL 5.5&#xff0c;开发工具&#xff1a;JDK 1.8&#xff0c;开发语开发平台&#xff1a;Eclipse&…...

AI时代带来的图片造假危机,该如何解决

一、前言 当今&#xff0c;图片造假问题非常泛滥&#xff0c;已经成为现代社会中一个严峻的问题。随着AI技术不断的发展&#xff0c;人们可以轻松地通过图像编辑和AI智能生成来篡改和伪造图片&#xff0c;使其看起来真实而难以辨别&#xff0c;之前就看到过一对硕士夫妻为了骗…...

【动态规划】简单多状态

文章目录 动态规划&#xff08;简单多状态&#xff09;1. 按摩师2. 打家劫舍 ||3. 删除并获得点数4. 粉刷房子5. 最佳买卖股票时机含冷冻期6. 买卖股票的最佳时机含手续费7. 买卖股票的最佳时机 |||8. 买卖股票的最佳时机 IV 动态规划&#xff08;简单多状态&#xff09; 1. 按…...

科技资讯|苹果计划本月推出Vision Pro头显开发套件,电池有重大更新

根据消息源 aaronp613 分享的信息&#xff0c;苹果计划本月底面向开发者&#xff0c;发布 Vision Pro 头显开发套件。消息源还指出苹果更新了 Vision Pro 头显电池组的代号&#xff0c;共有 A2781&#xff0c;A2988 和 A2697 三种不同的型号&#xff0c;目前尚不清楚三者之间的…...

k8s 将pod节点上的文件拷贝到本地

要将 Kubernetes&#xff08;k8s&#xff09;中 Pod 节点上的文件拷贝到本地&#xff0c;可以通过使用 kubectl cp 命令来实现。kubectl cp 命令允许你在本地系统和 Pod 之间复制文件和目录。 下面是使用 kubectl cp 命令的语法&#xff1a; kubectl cp <namespace>/&l…...

Git简介与工作原理:了解Git的基本概念、版本控制系统和分布式版本控制的工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...