想要操作Excel,首先要导入 openpyxl 模块:
openpyxl内包含新建,打开,读写、保存,等操作的方法,但是它只支持 xlsx 类型的文件:
-
openpyxl.Workbook 是openpyxl的类文件,它用来新建;
-
openpyxl.load_workbook 是openpyxl 的方法函数,类似open()函数,用来读写文件;
基本操作:
一、新建Excel
import openpyxl
"""新建、保存 Excel"""
"""先将 openpyxl 类实例化,创建个对象;"""
wb = openpyxl.Workbook()
"""用对象调用 save() 方法,将当前工作簿保存在指定的“文件名”下,如没有该文件则会新建一个工作薄;"""
wb.save('excel_01.xlsx')
二、操作Excel
import openpyxl
"""1. 打开Excel文件,使用 load_workbook 函数打开 Excel,并将文件对象赋值给 workbook,和open()非常相似"""
workbook = openpyxl.load_workbook('excel_01.xlsx')
"""2.定位表单,选择我们想要操作的工作薄"""
# 方法一,已经过时,使用时会报 Warning
sheet_1 = workbook.get_sheet_by_name('Sheet')
# 方法二,目前用的
sheet_2 = workbook['Sheet']
"""3.定位单元格,单元格是按行列来定位,先行后列,都是用数值来表示"""
sheet_2.cell(row=1,column=2) # 定位到第1行,第2列
"""4. 单元格-读取"""
result = sheet_2.cell(row=1,column=2).value
print(result)
"""5. 单元格-写入"""
sheet_2.cell(row=1,column=2).value='写入单元格'
"""写入后必须保存,写入时必须关闭Excel,否则会报错:没有权限;"""
workbook.save('excel_01.xlsx')
批量读取:
单个操作读写单元格效率很low,所以我们可以采用 for 循环来批量读写单元格:
- 获取最大行数:sheet.max_row
- 获取最大列表 :sheet.max_row,注意这里的sheet不是语法的,而是你定位到的表单!
- 使用 for 循环:
import openpyxl
book_1 = openpyxl.load_workbook('excel_01.xlsx')
sheet = book_1['Sheet']
"""获取最大行数 sheet.max_row """
"""获取最大列数 sheet.max_column """
"""用最大行数和列数进行 for 循环"""
for i in range(1, sheet.max_row+1): # 循环 行
for j in range(1, sheet.max_column+1): # 循环 列
result = sheet.cell(row=i, column=j).value
print(f'读取到的内容是:{result},它的数据类型是:{type(result)}') # 打印结果和类型
来看下我们要操作的 excel_01.xlsx 文件的内容:
再看下执行结果:
从结果上看,python会遍历最大行数和列数之内的所有单元格,如果没有内容的话就会返回 None 。
Excel的数据类型:
在看下上面的执行结果的红框部分,我们发现不管是 列表、元组、还是字典,它的数据类型都是 str。这是因为常规下Excel只认识 str、int、float 三种数据类型,所以我们用python读取出来也都是这三种。
但是我们可以用 eval() 函数来转换成原来的格式:
import openpyxl
book_1 = openpyxl.load_workbook('excel_01.xlsx')
sheet = book_1['Sheet']
for i in range(1, sheet.max_row+1):
for j in range(1, sheet.max_column+1):
result = sheet.cell(row=i, column=j).value
"""判断为空的不打印"""
if result != None:
if i == 1 and j in [3, 4, 5,]:
"""用 eval() 函数 将这几个单元格的数据格式转换原来的的类型"""
result = eval(result)
print(f'读取到的内容是:{result},它的数据类型是:{type(result)}')
else:
print(f'读取到的内容是:{result},它的数据类型是:{type(result)}')
执行结果:
数据类型已经转换为相对应的类型,注意:如果本身就是str的话,在使用 eval() 函数会报错!