安装openpyxl库:pip install openpyxl
①创建并保存一个.xlsx文件
import openpyxl
wb = openpyxl.Workbook()
wb.save('test.xlsx')
如果只是单纯的创建一个Excel文件是非常简单的,只需要先实例化一个Workbook
对象,然后用save()
方法保存即可。
并且可以看到创建的文件默认有一个Sheet工作表。
②对工作表的一些操作(改名,增添,删除)
1.更改工作表名称
ws = wb.active #获取活跃的工作表(即默认的Sheet工作表)
ws.title = 'test_sheet1'
2.创建新的工作表
使用create_sheet()
方法来创建一个新工作表:
wb.create_sheet('new_ws1')
可以发现在默认的工作表右侧多出了一个"new_ws"工作表。
并且,可以使用该方法的index参数来指定工作表生成的位置。例如:
wb.create_sheet('new_ws2', 0)
保存后的效果:
也可以直接打印出表格的所有工作簿:
print(wb.sheetnames)
运行结果
返回一个由工作表名组成的列表。
3.删除工作表
使用del
或wb.remove()
使用wb.remove_sheet()也能删除但会产生警告
接上面代码,现在分别用两种方法删除工作表:
del wb['new_ws2']
wb.remove(wb['Sheet'])
print(wb.sheetnames)
可以发现只剩下一个工作表
需要特别注意的是:参数均为一个工作表对象,不能只是简单的名称字符串!
4.拷贝工作表
ws = wb['Sheet']
ws_copy = wb.copy_worksheet(ws)
③向工作表内插入数据
指定单元表内某单元格的内容:
ws['A1'] = '姓名' #ws为已获取到的单元表对象
ws['B1'] = '年龄'
接下来我们将一些内容填充到这两列下面, 假如是这样的数据...
data ={'刘一':1,
'陈二':2,
'张三':3,
'李四':4,
'王五':5
}
将上面的内容插入到表格中,我们选择使用ws.append()这个方法,先来看看在Sheel中得到的提示:
大概可以知道:如果参数是一个列表,那么将会把列表中的每一个元素从第一个空白行开始依次插入;如果参数是一个字典,那么key值必为一个有效列名,所对应value值将会在所在列下插入......(列名重复会被覆盖)
回到之前我们的目的,显然用列表作参数要有利得多,于是我们将字典的每个键值对作为一个小列表插入到我们的大列表中,最后循环调用大列表中的每个小列表进行插入:
big_list = []
#将小列表存入大列表
for each_key in data:
big_list.append([each_key, data[each_key]])#这里的append是列表的append方法
#将大列表内的每个小列表插入工作表
for each_small_list in big_list:
ws.append(each_small_list)
用save()方法保存后
④读取已有的Excel表格
使用openpyxl.load_workbook()
方法来访问,参数为表格路径。
下面我们以上面创建的表格为例,来谈谈如何访问单元格:
访问指定单元格
import openpyxl
wb = openpyxl.load_workbook(r'(这里是路径)\test.xlsx')
ws = wb.active
print(ws['A1'])
print(ws['A1'].value)
运行结果
ws['A1']是一个单元格对象,具有行, 列, 坐标属性:
c = ws['A1']
print(c.row, c.column, c.coordinate)
运行结果
用
offset()
方法偏移单元格(第一个参数指定行,第二个参数指定列)
c = ws['B2']
cl = c.offset(0, -1)
cr = c.offset(0, 1)
cu = c.offset(-1, 0)
cd = c.offset(1, 0)
c_list = [c, cl, cr, cu, cd]
for each in c_list:
print(each, ':', each.value)
运行结果
切片访问单元格
for each_cell_tuple in ws['A2:B5']:
for each_cell in each_cell_tuple:
print(each_cell.value, end=' ')
运行结果
访问指定行或指定列
先看这个列子:
for each_row in ws.rows:
print(each_row)
print('\n')
for each_column in ws.columns:
print(each_column)
运行结果:返回元组对象
所以,要访问某一行或某一列,加上下标索引即可。
eg:访问该表的第二列:
for each_row in ws.rows:
print(each_row[1].value, end=" ")
运行结果
指定范围内访问
for each_row in ws.iter_rows(min_row=1, min_col=3, max_row=3, max_col=5):
print(each_row)
运行结果
返回C1:E3部分的单元格对象。
④其他(以后逐渐更新......)
有时候使用的列数会超过字母Z,这时我们想知道真正的列数会很麻烦,openpyxl提供了列数和字母转化的方法:
#列数转化为字母
print(openpyxl.cell.cell.get_column_letter(666))
#字母转化为列数
print(openpyxl.cell.cell.column_index_from_string('ZH'))
结果:YP 684
若有不正确的地方,还望各位指正。
网友评论