1.安装 openpyxl 组件

pip install openpyxl -i https://mirrors.aliyun.com/pypi/simple/

新建Excel

# coding=utf-8
from openpyxl import Workbook
wb = Workbook() # 新建工作簿
ws = wb.active # 获取工作表
ws.append(['姓名', '学号', '年龄']) # 追加一行数据
ws.append(['张三', "1101", 17]) # 追加一行数据
ws.append(['李四', "1102", 18]) # 追加一行数据
wb.save(r'测试1.xlsx') # 保存到指定路径,保存的文件必须不能处于打开状态,因为文件打开后文件只读

打开并读取文件

# coding=utf-8
from openpyxl import load_workbook
wb = load_workbook(r'测试1.xlsx') # 获取已存在的工作簿
ws = wb.active # 获取工作表
for row in ws.values: # 输出所有数据
print(row)

工作簿对象

wb.active :获取第一张工作表对象

wb[sheet_name] :获取指定名称的工作表对象

wb.sheetnames :获取所有工作表名称

wb.worksheets:获取所有工作表对象,wb.worksheets[0]可以根据索引获取工作表,0代表第一个

wb.create_sheet(sheet_name,index=“end”):创建并返回一个工作表对象,默认位置最后,0代表第一个

wb.copy_worksheet(sheet):在当前工作簿复制指定的工作表并返回复制后的工作表对象

wb.remove(sheet):删除指定的工作表

ws.save(path):保存到指定路径path的Excel文件中,若文件不存在会新建,若文件存在会覆盖

# coding=utf-8
from openpyxl import load_workbook
wb = load_workbook(r"测试1.xlsx")
"""获取工作表"""
active_sheet = wb.active # 获取第一个工作表
print(active_sheet) # 输出工作表:<Worksheet "Sheet">
by_name_sheet = wb["Sheet"] # 根据工作表名称获取工作表
by_index_sheet = wb.worksheets[0] # 根据工作表索引获取工作表
"""获取所有工作表"""
print("获取所有",wb.sheetnames)
"""新建工作表"""
New_Sheet = wb.create_sheet("New") # 在最后新建工作表
First_Sheet = wb.create_sheet("First",index=0) # 在开头新建工作表
print("新建后",wb.sheetnames)
"""复制工作表"""
Copy_Sheet = wb.copy_worksheet(active_sheet) # 复制第一个工作表
Copy_Sheet.title = "Copy"
print("复制后",wb.sheetnames)
"""删除工作表"""
wb.remove(First_Sheet) # 根据指定的工作表对象删除工作表
wb.remove(New_Sheet)
print("删除后",wb.sheetnames)
wb.save(r"测试2.xlsx")

工作表对象

ws.title:获取或设置工作表名

ws.max_row:工作表最大行数

ws.max_column:工作表最大列数

ws.append(list):表格末尾追加数据

ws.merge_cells(‘A2:D2’):合并单元格

ws.unmerge_cells(‘A2:D2’):解除合并单元格。

# coding=utf-8
from openpyxl import load_workbook
wb = load_workbook(r'测试1.xlsx') # 获取已存在的工作簿
ws = wb.active
print("工作表名",ws.title)
ws.title = "学生信息表"
print("修改后工作表名",ws.title)
print("最大行数",ws.max_row)
print("最大列数",ws.max_column)
ws.append(["王五","1103",17])
print("最大行数",ws.max_row)
wb.save(r"测试3.xlsx")

单元格读取

ws[‘A1’]:根据坐标获取单个单元格对象

ws.cell(row, column, value=None):根据行列获取单个单元格对象

ws[1]:获取第一行所有单元格对象,ws[“1”]也可

ws[“A”]:获取第A列所有单元格对象

ws["A”:“B”]:获取A到B列所有单元格对象,ws[“A:B”]也可

ws[1:2]:获取1到2行所有单元格对象,ws[“1:2”]也可

ws[“A1”:“B2”]:获取A1到B2范围所有单元格对象,ws[“A1:B2”]也可。

ws.values:获取所有单元格数据的可迭代对象,可以通过for循环迭代或通过list(ws.values)转换为数据列表

ws.rows:获取所有数据以行的格式组成的可迭代对象

ws.columns:获取所有数据以列的格式组成的可迭代对象

ws.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None):获取指定边界范围并以行的格式组成的可迭代对象,默认所有行

ws.iter_cols(min_col=None, max_col=None, min_row=None, max_row=None): 获取指定边界范围并以列的格式组成的可迭代对象,默认所有列

单元格对象

cell.value :获取或设置值

cell.column : 数字列标

cell.column_letter : 字母列标

cell.row : 行号

cell.coordinate : 坐标,例如’A1’

cell.data_type : 数据类型, ’s‘ = string字符串,‘n’ = number数值,会根据单元格值自动判断

cell.number_format :单元格格式,默认”General“常规,详见excel自定义数据类型

# coding=utf-8
from openpyxl import Workbook
wb = Workbook() # 新建工作簿
ws = wb.active
"""获取与设置单元格值的两种方式"""
cell1 = ws.cell(1,1) # 先获取第一行第一列的单元格对象
cell1.value = 18 # 再设置单元格对象的值
print("值",cell1.value)
print("数字列标",cell1.column)
print("字母列标",cell1.column_letter)
print("行号",cell1.row)
print("坐标",cell1.coordinate)
cell2 = ws.cell(2,1,17) # 直接在获取单元格的时候设置值
"""使用公式和不适用公式"""
cell3 = ws.cell(3,1,"=A1+A2") # 直接输入公式具有计算功能
cell4 = ws.cell(4,1,"=A1+A2")
cell4.data_type = 's' # 指定单元格数据类型为文本可以避免公式被计算
"""设置格式和不设置格式"""
cell5 = ws.cell(5,1,3.1415) # 默认常规格式
cell6 = ws.cell(6,1,3.1415)
cell6.number_format = "0.00" # 设置格式为保留两位小数
wb.save(r'测试4.xlsx') # 保存到指定路径

单元格样式

cell.font :获取或设置单元格Font对象 (字体名称,字体大小,是否加粗,字体颜色等)

cell.border : 获取或设置单元格边框

cell.alignment : 获取或设置单元格水平/垂直对齐方式

cell.fill:获取或设置单元格填充颜色

from openpyxl import Workbook
from openpyxl.styles import Font, Border, Side, Alignment,PatternFill
from copy import copy
wb = Workbook()
ws = wb.active
"""获取单元格并设置单元格值为 姓名 """
cell = ws.cell(1,1,"姓名")
"""设置单元格文字样式"""
cell.font = Font(bold=True, # 加粗
italic=True, # 倾斜
name="楷体", # 字体
size=13, # 文字大小
color="FF0000" # 字体颜色为红色
)
"""复制单元格样式"""
cell2 = ws.cell(1,2,"学号")
cell2.font = copy(cell.font)
"""设置单元格边框为黑色边框"""
cell.border = Border(bottom=Side(style='thin', color='000000'),
right=Side(style='thin', color='000000'),
left=Side(style='thin', color='000000'),
top=Side(style='thin', color='000000'))
"""设置单元格对齐方式为水平垂直居中"""
cell.alignment = Alignment(horizontal='center',vertical='center')
"""设置单元格底纹颜色为黄色"""
cell.fill = PatternFill(fill_type='solid', start_color='FFFF00')
"""
白色:FFFFFF,黑色:000000,红色:FF0000,黄色:FFFF00
绿色:00FF00,蓝色:0000FF,橙色:FF9900,灰色:C0C0C0
常见颜色代码表:https://www.osgeo.cn/openpyxl/styles.html#indexed-colours
"""
wb.save(r"测试5.xlsx")

列宽与行高

ws.row_dimensions[行号]:获取行对象(非行数据,包括行的相关属性、行高等)

ws.column_dimensions[字母列标]:获取列对象(非行数据,包括行的相关属性、列宽等)

get_column_letter(index):根据列的索引返回字母

column_index_from_string(string):根据字母返回列的索引

row.height:获取或设置行高

column.width:获取或设置列宽

from openpyxl import Workbook
from openpyxl.utils import get_column_letter,column_index_from_string
wb = Workbook()
ws = wb.active
"""行"""
row = ws.row_dimensions[1] # 获取第一行行对象
print("行号",row.index)
row.height = 20 # 设置行高
print("行高",row.height)
"""列"""
column = ws.column_dimensions["A"] # 根据字母列标获取第一列列对象
column = ws.column_dimensions[get_column_letter(1)] # 根据数字列标获取第一列列对象
print("字母列标",column.index)
print("数字列标",column_index_from_string(column.index))
column.width = 15 # 设置列宽
print("列宽",column.width)
wb.save(r'测试6.xlsx')

如何根据输入内容计算其在excel的列宽是多少?

合并表格

# coding=utf-8
from openpyxl import Workbook,load_workbook
import os
dir_path = "学生名单" # 要合并文件的文件夹地址
"""读取文件夹下的所有excel文件"""
files = []
for file in os.listdir(dir_path): # 获取当前目录下的所有文件
files.append(os.path.join(dir_path,file)) # 获取文件夹+文件名的完整路径
"""以第一个文件为基本表"""
merge_excel = load_workbook(files[0])
merge_sheet = merge_excel.active
"""遍历剩余文件,追加到基本表"""
for file in files[1:]:
wb = load_workbook(file)
ws = wb.active
for row in list(ws.values)[1:]: # 从第二行开始读取每一行并追加到基本表
merge_sheet.append(row)
merge_excel.save("高一学生汇总.xlsx")

拆分表格

# coding=utf-8
from openpyxl import Workbook,load_workbook
import os
file_path = "高一学生汇总.xlsx" # 要拆分的文件地址
split_dir = "拆分结果" # 拆分文件后保存的文件夹
group_item = "班级" # 拆分的依据字段
"""打开拆分的excel文件并读取标题"""
wb = load_workbook(file_path)
ws = wb.active
title = []
for cell in ws[1]:
title.append(cell.value)
"""开始分组,分组结果保存到字典,键为班级名,值为班级学生列表"""
group_result = {} # 存储分组结果
group_index = title.index(group_item) # 获取拆分依据字段的索引
for row in list(ws.values)[1:]:
class_name = row[group_index] # 获取分组依据数据,即班级名
if class_name in group_result: # 如果分组存在就追加,不存在就新建
group_result[class_name].append(row)
else:
group_result[class_name] = [row]
"""创建输出文件夹"""
if not os.path.exists(split_dir): # 如果不存在文件夹就新建
os.mkdir(split_dir)
os.chdir(split_dir) # 进入拆分文件夹
"""打印并输出分组后的数据"""
for class_name,students in group_result.items():
new_wb = Workbook() # 新建excel
new_ws = new_wb.active
new_ws.append(title) # 追加标题
for student in students:
new_ws.append(student) # 讲分组数组追加到新excel中
new_wb.save("{}.xlsx".format(class_name))

如何根据输入内容计算其在excel的列宽是多少?

利用GBK编码方式,非汉字字符占1个长度,汉字字符占2个长度

from openpyxl import Workbook
from openpyxl.utils import get_column_letter,column_index_from_string
wb = Workbook()
ws = wb.active
column = ws.column_dimensions[get_column_letter(1)] # 根据数字列标获取第一列列对象
value = "我爱中国ILoveChain" # 4*2+10*1+1=19
column.width = len(str(value).encode("GBK"))+1 # 根据内容设置列宽,+1既可以补充误差又可以让两边留有一定的空白,美观
print("列宽",column.width) # 输出:19
ws.cell(1,1,value)
wb.save(r'测试6.xlsx')

原文链接:https://blog.csdn.net/qq_40910781/article/details/127270735

Python openpyxl使用教程的更多相关文章

  1. 用命令访问D:\python学习\wendjia教程\aa.py

    用命令访问D:\python学习\wendjia教程\aa.py d:                                -----------切换到D盘 cd python学习\wend ...

  2. Python小白好教程

    提供一些Python的基础教程. Crossin的编程教师:网址:http://crossincode.com/home/ 廖雪峰的官方网站 网址:http://www.liaoxuefeng.com ...

  3. 七牛云存储Python SDK使用教程 - 上传策略详解

    文 七牛云存储Python SDK使用教程 - 上传策略详解 七牛云存储 python-sdk 七牛云存储教程 jemygraw 2015年01月04日发布 推荐 1 推荐 收藏 2 收藏,2.7k  ...

  4. Python学习入门教程,字符串函数扩充详解

    因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习 ...

  5. Python基础入门教程

    Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...

  6. 小白必看Python视频基础教程

    Python的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名.Python的火热,也带动了工程师们的就业热.可能你也想通过学习加入这个炙手可热的行业,可以看看Python视频基础教程,小 ...

  7. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

  8. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  9. Python数据分析基础教程

    Python数据分析基础教程(第2版)(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1_FsReTBCaL_PzKhM0o6l0g 提取码:nkhw 复制这段内容后 ...

  10. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

随机推荐

  1. JS逆向实战5--JWT TOKEN x_sign参数

    什么是JWT JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式).它是在Web环境下 ...

  2. web安全学习(sql注入1)

    web安全学习(sql注入1) 一.简介 sql语句就是数据库语句,而sql注入就是用户将自己构造的恶意sql语句提交,然后服务器执行提交的危险语句.sql注入可能造成信息泄露以及服务器被控制等危害. ...

  3. 利用nginx自带的反向代理以及轮询功能实现应用的负载均衡

    针对中间件部署的应用(war包),可使用nginx自带的反向代理以及轮询功能,实现应用的负载均衡. 一.架构图 二.环境准备 准备2套环境,如19.1.0.18:7001,19.1.0.16:7001 ...

  4. 带你了解NLP的词嵌入

    摘要:今天带领大家学习自然语言处理中的词嵌入的内容. 本文分享自华为云社区<[MindSpore易点通]深度学习系列-词嵌入>,作者:Skytier. 1 特征表示 在自然语言处理中,有一 ...

  5. Go语言核心36讲29

    在上篇文章中,我们主要说的是互斥锁,今天我和你来聊一聊条件变量(conditional variable). 前导内容:条件变量与互斥锁 我们常常会把条件变量这个同步工具拿来与互斥锁一起讨论.实际上, ...

  6. KubeEdge的云边协同设计原理

    1.云端组件与K8s Master的关系 cloudCore和K8s master,非侵入的映射 2.EdgeController详解 -边缘节点管理 -应用状态元数据云边协同 3.DeviceCon ...

  7. 6、将两个字符串连接起来,不使用strcat函数

    /* 将两个字符串连接起来,不使用strcat函数 */ #include <stdio.h> #include <stdlib.h> void strCat(char *pS ...

  8. oracle 内置函数(二)字符函数

    主要函数: 大小写转换函数 获取子字符串函数(字符串截取) 获取字符串长度函数 字符串连接函数 去除子字符串函数 字符替换函数 字符串出现次数 字符串按照特定符号拆分多行 一.大小写转换 1.uppe ...

  9. 云小课|云小课教您如何选择Redis实例类型

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:购买Redis实例 ...

  10. 【Java SE进阶】Day11 网络编程、TCP应用程序

    一.网络编程入门 1.软件架构 C/S:QQ.迅雷 B/S 共同点:都离不开网络的支持 网络编程:在一定的协议下,实现两台计算机通信 2.网络通信协议 通信协议:需遵守的规则,只有遵守才能通信 主要包 ...