浅谈Python_Openpyxl使用(最全总结)


Posted in Python onSeptember 05, 2019

Python_Openpyxl

1. 安装

pip install openpyxl

2. 打开文件

① 创建

from openpyxl import Workbook 
# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active

② 打开已有

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('文件名称.xlsx')

3. 储存数据

# 方式一:数据可以直接分配到单元格中(可以输入公式)
ws['A1'] = 42
# 方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
ws.append([1, 2, 3])
# 方式三:Python 类型会被自动转换
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")

4. 创建表(sheet)

# 方式一:插入到最后(default)
>>> ws1 = wb.create_sheet("Mysheet") 
# 方式二:插入到最开始的位置
>>> ws2 = wb.create_sheet("Mysheet", 0)

5. 选择表(sheet)

# sheet 名称可以作为 key 进行索引
>>> ws3 = wb["New Title"]
>>> ws4 = wb.get_sheet_by_name("New Title")
>>> ws is ws3 is ws4
True

6. 查看表名(sheet)

# 显示所有表名
>>> print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']
# 遍历所有表
>>> for sheet in wb:
... print(sheet.title)

7. 访问单元格(call)

① 单一单元格访问

# 方法一
>>> c = ws['A4']
# 方法二:row 行;column 列
>>> d = ws.cell(row=4, column=2, value=10)
# 方法三:只要访问就创建
>>> for i in range(1,101):
...     for j in range(1,101):
...      ws.cell(row=i, column=j)

② 多单元格访问

# 通过切片
>>> cell_range = ws['A1':'C2']
# 通过行(列)
>>> colC = ws['C']
>>> col_range = ws['C:D']
>>> row10 = ws[10]
>>> row_range = ws[5:10]
# 通过指定范围(行 → 行)
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
...  for cell in row:
...    print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2> 
# 通过指定范围(列 → 列)
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
...  for cell in row:
...    print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
# 遍历所有 方法一
>>> ws = wb.active
>>> ws['C9'] = 'hello world'
>>> tuple(ws.rows)
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
...
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
# 遍历所有 方法二
>>> tuple(ws.columns)
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
...
<Cell Sheet.C8>,
<Cell Sheet.C9>))

8. 保存数据

>>> wb.save('文件名称.xlsx')

9. 其他

① 改变 sheet 标签按钮颜色

ws.sheet_properties.tabColor = "1072BA"

② 获取最大行,最大列

# 获得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)

③ 获取每一行,每一列

sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。
sheet.columns类似,不过里面是每个tuple是每一列的单元格。
# 因为按行,所以返回A1, B1, C1这样的顺序
for row in sheet.rows:
  for cell in row:
    print(cell.value)

# A1, A2, A3这样的顺序
for column in sheet.columns:
  for cell in column:
    print(cell.value)

④ 根据数字得到字母,根据字母得到数字

from openpyxl.utils import get_column_letter, column_index_from_string

# 根据列的数字返回字母
print(get_column_letter(2)) # B
# 根据字母返回列的数字
print(column_index_from_string('D')) # 4

⑤ 删除工作表

# 方式一
wb.remove(sheet)
# 方式二
del wb[sheet]

⑥ 矩阵置换(行 → 列)

rows = [
  ['Number', 'data1', 'data2'],
  [2, 40, 30],
  [3, 40, 25],
  [4, 50, 30],
  [5, 30, 10],
  [6, 25, 5],
  [7, 50, 10]]

list(zip(*rows))

# out
[('Number', 2, 3, 4, 5, 6, 7),
 ('data1', 40, 40, 50, 30, 25, 50),
 ('data2', 30, 25, 30, 10, 5, 10)]

# 注意 方法会舍弃缺少数据的列(行)
rows = [
  ['Number', 'data1', 'data2'],
  [2, 40  ], # 这里少一个数据
  [3, 40, 25],
  [4, 50, 30],
  [5, 30, 10],
  [6, 25, 5],
  [7, 50, 10],
]
# out
[('Number', 2, 3, 4, 5, 6, 7), ('data1', 40, 40, 50, 30, 25, 50)]

10. 设置单元格风格

① 需要导入的类

from openpyxl.styles import Font, colors, Alignment

② 字体

下面的代码指定了等线24号,加粗斜体,字体颜色红色。直接使用cell的font属性,将Font对象赋值给它。

bold_itatic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED, bold=True)

sheet['A1'].font = bold_itatic_24_font

③ 对齐方式

也是直接使用cell的属性aligment,这里指定垂直居中和水平居中。除了center,还可以使用right、left等等参数。

# 设置B1中的数据垂直居中和水平居中
sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

④ 设置行高和列宽

# 第2行行高
sheet.row_dimensions[2].height = 40
# C列列宽
sheet.column_dimensions['C'].width = 30

⑤ 合并和拆分单元格

  • 所谓合并单元格,即以合并区域的左上角的那个单元格为基准,覆盖其他单元格使之称为一个大的单元格。
  • 相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。
# 合并单元格, 往左上角写入数据即可
sheet.merge_cells('B1:G1') # 合并一行中的几个单元格
sheet.merge_cells('A1:C3') # 合并一个矩形区域中的单元格
  • 合并后只可以往左上角写入数据,也就是区间中:左边的坐标。
  • 如果这些要合并的单元格都有数据,只会保留左上角的数据,其他则丢弃。换句话说若合并前不是在左上角写入数据,合并后单元格中不会有数据。
  • 以下是拆分单元格的代码。拆分后,值回到A1位置。
sheet.unmerge_cells('A1:C3')

最后举个例子

import datetime
from random import choice
from time import time
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter

# 设置文件 mingc
addr = "openpyxl.xlsx"
# 打开文件
wb = load_workbook(addr)
# 创建一张新表
ws = wb.create_sheet()
# 第一行输入
ws.append(['TIME', 'TITLE', 'A-Z'])

# 输入内容(500行数据)
for i in range(500):
  TIME = datetime.datetime.now().strftime("%H:%M:%S")
  TITLE = str(time())
  A_Z = get_column_letter(choice(range(1, 50)))
  ws.append([TIME, TITLE, A_Z])

# 获取最大行
row_max = ws.max_row
# 获取最大列
con_max = ws.max_column
# 把上面写入内容打印在控制台
for j in ws.rows: # we.rows 获取每一行数据
  for n in j:
    print(n.value, end="\t")  # n.value 获取单元格的值
  print()
# 保存,save(必须要写文件名(绝对地址)默认 py 同级目录下,只支持 xlsx 格式)
wb.save(addr)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python标准算法实现数组全排列的方法
Mar 17 Python
详解python3实现的web端json通信协议
Dec 29 Python
利用python画一颗心的方法示例
Jan 31 Python
小白入门篇使用Python搭建点击率预估模型
Oct 12 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
Python文件路径名的操作方法
Oct 30 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
Python连接SQLite数据库并进行增册改查操作方法详解
Feb 18 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 Python
python实现人工智能Ai抠图功能
Sep 05 #Python
深入了解Python在HDA中的应用
Sep 05 #Python
python urllib爬虫模块使用解析
Sep 05 #Python
详解Python3 pandas.merge用法
Sep 05 #Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 #Python
python爬取Ajax动态加载网页过程解析
Sep 05 #Python
python实现静态服务器
Sep 05 #Python
You might like
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
JS delegate与live浅析
2013/12/21 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
Python实现的ini文件操作类分享
2014/11/20 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
python url 参数修改方法
2018/12/26 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
2019/01/04 Python
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
2014年初三班主任工作总结
2014/12/05 职场文书
小学生差生评语
2014/12/29 职场文书
计算机专业自荐信
2015/03/05 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
工作服管理制度范本
2015/08/06 职场文书