浅谈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脚本生成Android SALT扰码的方法
Sep 18 Python
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
探索Python3.4中新引入的asyncio模块
Apr 08 Python
python使用分治法实现求解最大值的方法
May 12 Python
在Python程序中操作文件之flush()方法的使用教程
May 24 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
python图像处理入门(一)
Apr 04 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
python中24小时制转换为12小时制的方法
Jun 18 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
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHPUnit安装及使用示例
2014/10/29 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
根据json字符串生成Html的一种方式
2013/01/09 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
javascript生成大小写字母
2015/07/03 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
浅谈js中调用函数时加不加括号的问题
2016/07/28 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
js实现列表按字母排序
2020/08/11 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
Python查找相似单词的方法
2015/03/05 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
django rest framework serializers序列化实例
2020/05/13 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
小班开学寄语
2014/04/04 职场文书
大学生评语大全
2014/04/18 职场文书
2015年元旦活动总结
2014/05/09 职场文书
企业法人代表任命书
2014/06/06 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技