社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python之Excel 优雅操作手法 精选

看,未来 • 4 年前 • 619 次点击  

在这里插入图片描述

前言

一直想写这一篇,却又一直被事情拖着。
我带的一个项目团队正好进行到这一块儿了,正好,将这事儿办了,以后要用的时候也不用到处找。
半点不求人。

慢慢看,优雅的操作都在后头

Tips:当下2020年12月,文中所有代码都亲测过。如果哪天不能用了,便是模块进行了改动。

在这里插入图片描述


Excel简介

先来简单了解一下Excel,方便我们后期操作:

Excel文件三个对象

workbook: 工作簿,一个excel文件包含多个sheet。
sheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。
cell: 单元格,存储数据对象
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

基本操作

基本操作网上一找一堆,但是我既然要做这么一份可以在收藏夹吃灰的工具博客,那就需要囊括这些基础。
但是我和网上其他博客又有所不同的侧重,看下去你就知道了。

如果功底扎实,你可以将Excel理解为一个简单的数据库,也可以看做一个vector。

模块导入: import openpyxl
空手套白狼,创建Excel文件:
wb = openpyxl.Workbook()	#此处可以赋予读写权限:write_only=True,无法读写
wb.save('test.xlsx')		#记得保存,否则一切成空
wb.close()					#记得有开有关
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

不过这个要慎用,这个会覆盖原有同名Excel。

打开一个现有的Excel:
#操作手法1
wb = openpyxl.open('test.xlsx')

#操作手法2
wb2 = openpyxl.load_workbook('test.xlsx')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

就像数据库一样,多个句柄可以同时存在(wb和wb2可以同时存在)。

如果你觉得这样并没有什么不妥,那也正常;
如果你觉得有什么不妥,但是说不出来,那也正常;
如果你觉得有什么不妥,也能说得出来,但是并不会解决这个问题,那也正常;
如果你能指出来并且进行妥善处理,那也可以理解。

反正我都要跟你们说怎么办,不知道的现在都知道了: 不是你记忆中的单例模式,但适用的程度,更胜一筹

基本读写操作:
ws = wb.active

#你可以这样进行操作
ws['C4'] = 'A4'

#也可以这样操作
ws.cell(3,4,'aa')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Tips:增删查改,本文只讲“增查”,删改还请诸君自行领悟。


基本页操作(sheet)

上面的操作默认都是在sheet1上进行,而一个Excel却经常会要用到不同的页,就像一个数据库里边还有不同的表呢。

创建sheet
wb = openpyxl.open('test.xlsx')
cs = wb.create_sheet("test_sheet0",0)	# 页名、页位置(如果页名重复了,会被自动改名)
wb.save('test.xlsx')
wb.close()
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
获取sheet的操作权限
sheet = wb['页名']	#不知道名字用print(wb.sheetnames)
  • 1
  • 1
修改sheet名字
sheet.title = '新名字'
  • 1
  • 1
增查
ws['A3'] = 'a'
ws.cell(1,3,'a')
  • 1
  • 2
  • 1
  • 2

读写表

获取行列数
rows=ws.max_row   #获取行数
cols=ws.max_column    #获取列数
  • 1
  • 2
  • 1
  • 2

逐列/逐行 写

逐列

示例:

import openpyxl

wb = openpyxl.open('1.xlsx')
ws = wb.active

A = [1,2,3,4,5,6,7,8,9]

for i,j in zip(range(4,9),A):
    # 两种方式,看你喜欢那种咯(我喜欢哪种就不用多说了吧,插一列我还要去数是哪一列?)
    ws['D'+str(i)] = j
    #ws.cell(i,4,j)

wb.


    
save('1.xlsx')
wb.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
代码释义
待写入的列表

for i,j in zip(range(起始位置),列表):
    ws[列名+str(i)] = j
    #ws.cell(i,第几列,j)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
逐行

这里又和上面有点小不同

A = [1,2,3,4,5,6,7,8,9]

for i,j in zip(range(4,9),A):
    # 你要是连自己要写到哪一列都不知道那我就不说什么了
    ws.cell(5,i,j)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
往尾行写入
ws.append([‘This is A1’, ‘This is B1’, ‘This is C1’])
ws.append({‘A’ : ‘This is A1’, ‘C’ : ‘This is C1’})
ws.append({1 : ‘This is A1’, 3 : ‘This is C1’})
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

逐列/行 读

这将是本篇中最优雅的部分

score_list = [i.value for i in ws['B'][1:]]
score_list2 = [i.value for i in ws['A:K'][1]]
  • 1
  • 2
  • 1
  • 2

有的小伙伴想说row和column函数是吧,有我这优雅吗?有我这自由吗?
(其实全篇我就是为了写这两行)


还有其他需要了解的操作吗?
如果有,打在评论区,我来补上。

在这里插入图片描述

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/100071
 
619 次点击