python openpyxl模块的使用详解


Posted in Python onFebruary 25, 2021

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 openpyxl模块的使用详解的详细内容,更多关于python openpyxl模块的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
基于python的多进程共享变量正确打开方式
Apr 28 Python
Python查看微信撤回消息代码
Jun 07 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
解决python Markdown模块乱码的问题
Feb 14 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
python对批量WAV音频进行等长分割的方法实现
Sep 25 Python
用 Django 开发一个 Python Web API的方法步骤
Dec 03 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 #Python
python如何实现递归转非递归
Feb 25 #Python
Python如何使用神经网络进行简单文本分类
Feb 25 #Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 #Python
如何用 Python 制作一个迷宫游戏
Feb 25 #Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 #Python
Python 图片处理库exifread详解
Feb 25 #Python
You might like
长波有什么东西
2021/03/01 无线电
6个超实用的PHP代码片段
2015/08/10 PHP
php远程下载类分享
2016/04/13 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
javascript实现轮显新闻标题链接
2007/08/13 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
pymssql ntext字段调用问题解决方法
2008/12/17 Python
tornado捕获和处理404错误的方法
2014/02/26 Python
python解析xml文件操作实例
2014/10/05 Python
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
python多线程实现TCP服务端
2019/09/03 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
承认错误的检讨书
2014/01/30 职场文书
兽医医药专业求职信
2014/07/27 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
2014年实习期工作总结
2014/11/27 职场文书
2015年教师节慰问信
2015/03/23 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
SQL Server中锁的用法
2022/05/20 SQL Server