Python利器openpyxl之操作excel表格


Posted in Python onApril 17, 2021

python处理数据时,可以将数据保存至excel文件中,此处安利一个python利器,openpyxl,可以自动化处理数据值excel表格中。

1、安装

pip install openpyxl

2、使用

在使用前,需理清excel的几个概念

  • workbook:工作薄,即一个excel文件
  • worksheet:工作表,一个excel文件包含多个sheet,即包含多个工作表
  • colunm:列,excel中一竖列
  • row:行,excel中一横行
  • cell:单元格,组成工作表的最小单位

2.1 Workbook对象

创建工作薄

from openpyxl import Workbook

# 创建一个工作簿
w=Workbook()

# 获取当前工作sheet
w_s=w.active
# 指定sheet的标题
w_s.title="demo1"

# 创建一个工作表,index指定创建的工作表的位置,默认在最后面,title指定工作表的名称
w_s=w.create_sheet(index=0, title="demo2")
# 指定sheet按钮的颜色
w_s.sheet_properties.tabColor="FFA500"

# 保存文件
w.save('data/demo.xlsx')

其中当创建一个一个工作簿时,会默认创建一个名字为Sheet的工作表。以下即上面代码所创建的excel工作簿(即excel文件)

Python利器openpyxl之操作excel表格

加载工作簿

from openpyxl import load_workbook
# 打开一个工作簿,
w=load_workbook("data/demo.xlsx")

# 获取工作簿下所有工作表的名称,以下两种用法作用一样,官方推荐第一种第一种用法
sheet_names1=w.sheetnames
# sheet_names2=w.get_sheet_names()

# 指定当前工作表,以下两种用法作用一样,官方推荐第一种第一种用法
w_s1=w["demo1"]
# w_s2=w.get_sheet_by_name("demo2")

# 删除一个工作表
w.remove(w["demo2"])

sheet_names2=w.sheetnames

# 保存文件
w.save('data/demo.xlsx')

print(sheet_names1)
print(sheet_names2)

>>>输出结果
['demo2', 'demo1']
['demo1']

2.2 worksheet对象

常用属性

  • title:表格的标题
  • dimensions:表格的大小,这里的大小是指含有数据的表格的大小,即:左上角的坐标:右下角的坐标,
  • max_row:表格的最大行
  • min_row:表格的最小行
  • max_column:表格的最大列
  • min_column:表格的最小列
  • rows:按行获取单元格(Cell对象) - 生成器
  • columns:按列获取单元格(Cell对象) - 生成器
  • freeze_panes:冻结窗格,冻结单元格上边所有行和左边所有列,但单元格所在行列不冻结 ,在果冻页面时,冻结的行和列始终保持不动
  • values:按行获取表格的内容(数据) - 生成器

常用方法

  • iter_rows:按行获取所有单元格,内置属性有(min_row,max_row,min_col,max_col)
  • iter_cols:按列获取所有的单元格
  • append:在表格末尾添加数据,参数为一列表或者元祖
  • merge_cells:合并多个单元格
  • unmerge_cells:移除合并的单元格

现在有这样一个excel表格:

Python利器openpyxl之操作excel表格

from openpyxl import load_workbook


w=load_workbook("data/猫眼电影.xlsx")
w_s=w[w.sheetnames[0]]                          # 选择第一个工作表
print("工作表标题:",w_s.title)
print("工作表最大行数:",w_s.max_row)
print("工作表最小行数:",w_s.min_row)
print("工作表的大小(左上角到右下角的坐标):",w_s.dimensions)
print("工作表最大列数:",w_s.max_column)
print("工作表最小列数",w_s.min_column)
w_s.freeze_panes="B2"                           # 冻结第一列和第一行,
# w_s.freeze_panes = 'B1'                       # 冻结列A
# w_s.freeze_panes = 'C1'                       # 冻结列A和B
# w_s.freeze_panes = 'C2'                       # 冻结行1和列A和列B
# w_s.freeze_panes = 'A1'                       # 无冻结
# w_s.freeze_panes = None                       # 无冻结
# w_s.freeze_panes = 'A2'                       # 设置第一行为冻结
w.save("data/猫眼电影.xlsx")

>>>输出结果
工作表标题: 猫眼电影
工作表最大行数: 101
工作表最小行数: 1
工作表的大小(左上角到右下角的坐标): A1:E101
工作表最大列数: 5
工作表最小列数 1
from openpyxl import load_workbook


w=load_workbook("data/猫眼电影.xlsx")
w_s=w[w.sheetnames[0]]                  # 选择第一个工作表

# 获取第一行所有cell,返回一个生成器
rows=w_s.iter_rows(min_row=1,max_row=1,min_col=1)

# 获取第一行的第一行到第五行的cell,返回一个生成器
cols=w_s.iter_cols(min_col=1,max_col=1,min_row=1,max_row=5)

for row in rows:
    print(row)
for col in cols:
    print(col)
# 写入一行数据
w_s.append([1,2,3,4,5])

# 合并单元格,A1至D1合并到A1
w_s.merge_cells('A1:D1')

# 拆分单元格,此处需要注意的是若先合并再拆分单元格,拆分后的单元格不再恢复拆分前的格式和数值
w_s.unmerge_cells('A1:D1')
w.save("data/猫眼电影.xlsx")

>>>输出结果
(<Cell '猫眼电影'.A1>, <Cell '猫眼电影'.B1>, <Cell '猫眼电影'.C1>, <Cell '猫眼电影'.D1>, <Cell '猫眼电影'.E1>)
(<Cell '猫眼电影'.A1>, <Cell '猫眼电影'.A2>, <Cell '猫眼电影'.A3>, <Cell '猫眼电影'.A4>, <Cell '猫眼电影'.A5>)

如下图,合并再拆分,cell之前的格式和值时不再存在。

Python利器openpyxl之操作excel表格

2.3 Cell对象

获取cell方法

1、通过坐标定位的方法

cell1=w_s["A"][:5]
cell2=w_s["A5"]

2、通过iter_rows()迭代方法,指定行列范围

rows = w_s.iter_rows(min_col=1, max_col=w_s.max_column, min_row=1, >max_row=1)
for row in rows:
   for cell in row:
       print(cell)
print("+"*20)
cols = w_s.iter_cols(min_row=1, max_row=5, min_col=1, max_col=1)
for col in cols:
   for cell in col:
       print(cell)

>>>输出结果
<Cell '猫眼电影'.A1>
<Cell '猫眼电影'.B1>
<Cell '猫眼电影'.C1>
<Cell '猫眼电影'.D1>
<Cell '猫眼电影'.E1>
++++++++++++++++++++
<Cell '猫眼电影'.A1>
<Cell '猫眼电影'.A2>
<Cell '猫眼电影'.A3>
<Cell '猫眼电影'.A4>
<Cell '猫眼电影'.A5>

3、通过指定具体行列方法

cell3=w_s.cell(row=1,column=1)

4、迭代全部行或列

for row in w_s.rows:
   for cell in row:
      cell.value=None
       
for column in w_s.columns:
   for cell in column:
       cell.value=None

5、迭cell赋值

cell.value="xxx"

2.4 样式设置

目前官方提供的styles提供的样式有以下几块:

Font: 来设置文字的大小,颜色和下划线等

PatternFill: 填充图案和渐变色

Border: 单元格的边框

Alignment: 单元格的对齐方式等

Font:

from openpyxl.styles import Font
font = Font(name='宋体',size = 11,bold=True,italic=True,strike=True,color='000000')
cell.font = font

设置字体为“宋体”,大小为11,bold为加粗,italic为斜体,strike为删除线,颜色为黑色

PatternFill:

from openpyxl.styles import PatternFill
fill = PatternFill(fill_type = "solid", fgColor="9AFF9A")
cell.fill = fill

fill_type指定填充类型,fgColor指定填充颜色(必须为RGB值,RGB颜色对照表)。另外需注意的是,fill_type若没有特别指定>类型,则后续的参数都无效,平时所用也是solid(完全填充,无渐变)和None最多,官方提供的还有
[‘none', ‘solid'', ‘darkDown', ‘darkGray', ‘darkGrid', ‘darkHorizontal', ‘darkTrellis', ‘darkUp', ‘darkVertical', ‘gray0625', ‘gray125', ‘lightDown', ‘lightGray', ‘lightGrid', ‘lightHorizontal', ‘lightTrellis', ‘lightUp', ‘lightVertical', 'mediumGray']

PatternFill:

from openpyxl.styles import Border,Side

border = Border(left=Side(border_style='thin', color='000000'),
right=Side(border_style='thin', color='000000'),
top=Side(border_style='thin', color='000000'),
bottom=Side(border_style='thin', color='000000'))
cell.border = border

官方提供的样式还有:

[‘dashDot', ‘dashDotDot', ‘dashed', ‘dotted', ‘double', ‘hair', ‘medium', >‘mediumDashDot', ‘mediumDashDotDot', ‘mediumDashed', ‘slantDashDot', ‘thick', 'thin']

Alignment:

from openpyxl.styles import Alignment

align = Alignment(horizontal=‘left',vertical=‘center',wrap_text=True)
cell.alignment = align

horizontal: 水平方向对齐方式,左对齐left,居中center和右对齐right,分散对齐distributed,跨列居中centerContinuous,两端对齐justify,填充fill,常规general

vertical:垂直方向对齐方式,居中center,靠上top,靠下bottom,两端对齐justify,分散对齐distributed

wrap_text:自动换行

3、案例

掌握以上就基本平时够用了,自己写了一个案例。

现在有这样一个txt文件,需要把它写进excel文件中

Python利器openpyxl之操作excel表格

代码如下:

from openpyxl import Workbook
import json
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

# 定义表头的样式
style_head = {
    "border": Border(left=Side(style='medium', color='FF000000'), right=Side(style='medium', color='FF000000'),
                     top=Side(style='medium', color='FF000000'), bottom=Side(style='medium', color='FF000000')),
    "fill": PatternFill("solid", fgColor="9AFF9A"),
    "font": Font(color="1E90FF", bold=True),
    "alignment": Alignment(horizontal="center", vertical="center")
}
# 定义表内容样式
style_content = {
    "border": Border(left=Side(style='thin', color='FF000000'), right=Side(style='thin', color='FF000000'),
                     top=Side(style='thin', color='FF000000'), bottom=Side(style='thin', color='FF000000')),
    "alignment": Alignment(horizontal='left', vertical='center'),
    "font": Font(name="黑体")}


def get_data():
    with open("data/demo猫眼电影TOP100.txt", 'r', encoding='UTF8') as f:
        # 迭代读取文件的每一行
        for line in f.readlines():
            # 将读取到的内容转化为python对象
            data = json.loads(line)
            yield data


def write_to_excel():
    # 创建一个工作簿
    w = Workbook()
    # 获取当前工作表
    w_s = w.active
    # 更改当前工作表名称
    w_s.title = "猫眼电影"
    # 设置行的高度
    w_s.row_dimensions[1].height = 20
    # 设置列的宽度
    w_s.column_dimensions["B"].width = 15
    w_s.column_dimensions["C"].width = 35
    w_s.column_dimensions["D"].width = 24
    # 写入表头信息
    title = ["排名", "电影名", "链接", "上映时间", "评分"]
    w_s.append(title)
    # 迭代方式取出表头(第一行)每个cell,指定样式
    for row in w_s.iter_rows(max_row=1, min_col=1):
        for cell in row:
            cell.border = style_head["border"]
            cell.fill = style_head["fill"]
            cell.font = style_head["font"]
            cell.alignment = style_head["alignment"]
    # 从txt文件中获取相关数据
    datas = get_data()
    for data in datas:
        # 写入表内容
        w_s.append(list(data.values()))
    # 迭代方式取出表中每个cell,指定样式
    for row in w_s.iter_rows(min_row=2, min_col=1):
        for cell in row:
            cell.border = style_content["border"]
            cell.alignment = style_content["alignment"]
            cell.font = style_content["font"]
    # 保存excel文件
    w.save("data/猫眼电影.xlsx")


if __name__ == "__main__":
    write_to_excel()

完成后:

Python利器openpyxl之操作excel表格

总结

到此这篇关于Python利器openpyxl之操作excel表格的文章就介绍到这了,更多相关Python openpyxl操作excel内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 图片验证码代码分享
Jul 04 Python
Python科学计算环境推荐——Anaconda
Jun 30 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
Python调用C++程序的方法详解
Jan 24 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
Django之路由层的实现
Sep 09 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
Django显示可视化图表的实践
May 10 Python
详解Python魔法方法之描述符类
May 26 Python
Pyhton爬虫知识之正则表达式详解
Apr 01 Python
Pytest实现setup和teardown的详细使用详解
pytest配置文件pytest.ini的详细使用
Apr 17 #Python
用Python简陋模拟n阶魔方
Python OpenCV快速入门教程
python小程序之飘落的银杏
Python Numpy之linspace用法说明
Apr 17 #Python
用Python的绘图库(matplotlib)绘制小波能量谱
You might like
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
解决python replace函数替换无效问题
2020/01/18 Python
pyqt5中动画的使用详解
2020/04/01 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
python线程优先级队列知识点总结
2021/02/28 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
英语专业毕业个人求职自荐信
2013/09/21 职场文书
医学毕业生自荐信
2013/10/11 职场文书
如何做好总经理助理
2013/11/12 职场文书
《最佳路径》教学反思
2014/04/13 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
诚信承诺书
2015/01/19 职场文书
中学推普周活动总结
2015/05/07 职场文书
欢送领导祝酒词
2015/08/12 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
使用Ajax实现进度条的绘制
2022/04/07 Javascript