Technology Sharing

  • 首页
  • 资料分享
  • 在线工具
    • 随机密码生成器
  • 介绍
  • RSS
  • privacy
  • 云产品推广
    • 腾讯云
    • 阿里云
Share IT knowledge
  1. 首页
  2. linux
  3. 正文

Python操作Excel (openpyxl模块)

2022年9月21日 249点热度 0人点赞 2条评论

openpyxl:不需要 Excel 软件,仅支持 .xlsx 格式文件并进行增删改查

安装
openpyxl是一个非标准库,因此需要自行安装,安装过程并不困难,Windows/Mac用户均可以在命令行(CMD)/终端(Terminal)中使用pip安装。

pip install openpyxl

前置知识

Excel表格结构介绍

读取Excel

1.载入Excel

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
print(workbook.sheetnames)

备注:load_workbook只能打开已经存在的Excel,不能创建新的工作簿

2.根据名称获取工作表(sheet)

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']

如果只有一张工作表也可以用:sheet = workbook.active

3.获取表格内容所在的范围

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
print(sheet.dimensions)

4.获取某个单元格的具体内容

方法一:指定坐标

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
cell = sheet['B2']
print(cell.value)

方法二:指定行列数

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
cell = sheet.cell(row=2, column=2)    # 获取2行2列内容
print(cell.value)

5.获取某个单元格的行、列、坐标

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
# cell = sheet.cell(row=2, column=2)
cell = sheet['B2']
print(cell.row, cell.column, cell.coordinate)

6.获取多个格子的值

指定坐标范围的值

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
alls = sheet['A1:B3']
for all in alls:
    for cell in all:
        print(cell.value)

指定列的值

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
columns = sheet['A:C']
for column in columns:
    for cell in column:
        print(cell.value)

指定行的值

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
rows = sheet['2:4']
for row in rows:
    for cell in row:
        print(cell.value)

指定范围的值

方法一:按行获取

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
for row in sheet.iter_rows(min_row=2,max_row=5,min_col=1,max_col=3):
    for cell in row:
        print(cell.value)

方法二:按列获取

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
for row in sheet.iter_cols(min_row=2,max_row=5,min_col=1,max_col=3):
    for cell in row:
        print(cell.value)

7.读取所有的行

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
for cell in sheet.rows:
    print(cell)

Excel写入

1.保存Excel

workbook.save(filename='test.xlsx')
  • 如果读取和写入Excel的路径相同则为对原文件进行修改,
  • 如果读取和写入Excel的路径不同则为保存成新的文件

2.写入单元格

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
cell = sheet['F1']
cell.value = 'hobby'
workbook.save(filename='test.xlsx')

3.追加一行或多行数据

在已有数据后面追加sheet.append(列表)

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
data1 = ['大强', 33, '深圳']
sheet.append(data1)
data2 = ['二强', 32, '广州']
sheet.append(data2)
workbook.save(filename='test.xlsx')
from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
data = [['大强', 33, '深圳'],
         ['二强', 32, '广州'],
         ['三强', 31, '潮汕']]
for i in data:
    sheet.append(i)
workbook.save(filename='test.xlsx')

4.将公式写入单元格并保存

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
sheet['B12'] = '=AVERAGE(B2:B11)'      # 求平均数
workbook.save(filename='test.xlsx')

5.插入空白行

插入一行(在idx行上面插入一行)

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
sheet.insert_rows(idx=2)
workbook.save(filename='test.xlsx')

插入多行(在idx行上面插入多行)

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
sheet.insert_rows(idx=2,amount=3)    # 插入三行
workbook.save(filename='test.xlsx')

6.插入空白列

插入一列(在idx列左列插入一列)

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
sheet.insert_cols(idx=2)
workbook.save(filename='test.xlsx')

插入多列(在idx列左列插入多列)

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
sheet.insert_cols(idx=2,amount=2)
workbook.save(filename='test.xlsx')

7.删除多行

从idx行开始删除多行(包括idx行以及下面的行)

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
sheet.delete_rows(idx=2,amount=3)
workbook.save(filename='test.xlsx')

8.删除多列

从idx列开始删除多列(包括idx列以及右边的列)

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
sheet.delete_cols(idx=4,amount=2)
workbook.save(filename='test.xlsx')

9. 移动范围数据

from openpyxl import load_workbook
workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']
sheet.move_range('D1:F2', rows=5, cols=-3)   # 移到5+1行,向左移三列 (数字为正为向下或者向右,数字为负为向上或者向右)
workbook.save(filename='test.xlsx')

10.创建新的Execl表格

from openpyxl import Workbook
workbook = Workbook()
ws = workbook.active
ws.title = u'新表格title'
workbook.save('新表格.xlsx')

Excel样式调整

1. 设置字体样式

Font(name字体名称, size大小, bold粗体, italic斜体, color颜色)
from openpyxl import load_workbook
from openpyxl.styles import Font

workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']

cell = sheet['A1']
font = Font(name="微软雅黑", size=12, bold=True, italic=True, color='FF0000')
cell.font = font
workbook.save(filename='这是一个新表格.xlsx')

2. 设置对齐样式

Alignment(horizontal水平对齐, vertical垂直对齐, text_rotation字体倾斜度, wrap_text自动换行)

from openpyxl import load_workbook
from openpyxl.styles import Alignment

workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']

cell = sheet['A2']
alignment = Alignment(horizontal='center', vertical='center', text_rotation=45, wrap_text=True)
cell.alignment = alignment
workbook.save(filename='这是一个新表格.xlsx')
  • 水平对齐参数:distributed, justify, center, left, fill, centerContinuous, right, general
  • 垂直对齐参数:bottom, distributed, justify, center, top

3. 设置边框样式

Side(style边线样式, color边线颜色)
Border(左 右 上 下 边线)

from openpyxl import load_workbook
from openpyxl.styles import Side, Border

workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']

cell = sheet['A2']
side = Side(style='thin', color='FF0000')
border = Border(left=side, right=side, top=side, bottom=side)
cell.border = border
workbook.save(filename='这是一个新表格.xlsx')

边线样式:double, mediumDashDotDot, slantDashDot, dashDotDot, dotted, hair, mediumDashed, dashed, dashDot, thin, mediumDashDot, medium, thick

4. 设置单元格填充样式

from openpyxl import load_workbook
from openpyxl.styles import PatternFill, GradientFill

workbook = load_workbook(filename='test.xlsx')
sheet = workbook['openpyxl测试']

cell1 = sheet['A2']
pattern_fill = PatternFill(fill_type='solid', fgColor='99CCFF')
cell1.fill = pattern_fill

cell2 = sheet['A3']
gradient_fill = GradientFill(stop=('FFFFFF', '99CCFF', '000000'))
cell2.fill = gradient_fill

workbook.save(filename='这是一个新表格.xlsx')

5. 设置行高和列宽

sheet.row_dimensions[1].height = 50 
sheet.column_dimensions['C'].width = 20 

6. 单元格合并与取消

合并

sheet.merge_cells('A1:B2')
sheet.merge_cells(start_row=1, start_column=3,
                  end_row=2, end_column=4)

取消合并

sheet.unmerge_cells('A1:B2')
sheet.unmerge_cells(start_row=1, start_column=3, 
                    end_row=2, end_column=4)
打赏微海报分享
标签: 暂无
最后更新:2022年9月21日

nico

Linux运维工程师 软考网络工程师 && 软考信息安全工程师

点赞
< 上一篇
下一篇 >

文章评论

  • Justin

    这篇文章的质量很高呀!写得很详细~ 话说你的文章是隐藏了发布时间吗?

    2022年9月22日
    回复
  • nico

    主题的原因吧

    2022年11月18日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    nico

    Linux运维工程师
    软考网络工程师 && 软考信息安全工程师

    最新 热点 随机
    最新 热点 随机
    linux部署JDK环境 [Solved] MariaDB import issue: Error at line 1: Unknown command '\-'. Could not retrieve mirrorlist http://mirrorlist.centos.org/ CentOS 7 Kubernetes如何删除卡在“Terminating”状态的命名空间 解决GitLab Runner签名无效 如何禁用 Ubuntu "Daemons using outdated libraries" 弹出窗口
    Git强制覆盖分支 Supervisor – 简化进程管理的得力工具 [Solved]ubuntu 20.04下nginx不支持TLS1.0/TLS1.1 Web3.0: 开启去中心化的互联网时代 解锁WordPress:上传文件大小限制调整指南 多发行版兼容:如何查看 Linux 系统版本
    最近评论
    woodcockkienzlelsj8o9+73s48g9rr3m0@gmail.com 发布于 10 个月前(07月17日) necessitatibus corporis et odit nam quo harum et c...
    RonaldG 发布于 10 个月前(07月07日) Very interesting topic, thank you for putting up.&...
    小黑 发布于 1 年前(12月28日) 不错
    nico 发布于 2 年前(02月09日) 嘻嘻嘻!!!
    Bruse 发布于 2 年前(02月09日) 我来啦!!!
    nico 发布于 2 年前(12月10日) 方便查询
    Justin 发布于 2 年前(12月10日) 写的很好,谢谢分享!我 Mark 一下~
    nico 发布于 3 年前(11月18日) 主题的原因吧
    Justin 发布于 3 年前(09月22日) 这篇文章的质量很高呀!写得很详细~ 话说你的文章是隐藏了发布时间吗?
    Justin 发布于 3 年前(08月27日) 好家伙,这标题乍一看还以为你打算进军英文技术写作领域了🤓

    COPYRIGHT © 2023 Technology Sharing. ALL RIGHTS RESERVED.

    备案图标 皖公网安备34132402000202 皖ICP备2023004851号-1