Excel的基础用法,python手工操作Excel
流程:
1.打开excel(路径+文件名)
2.获取表单
3.使用行号和烈火去确定读取的数值
4.关闭文件
python操作excel
官方:openpyxl 支持新xlsx型格式的读取,读取速度还可以
其他:tablib 支持多种格式 xlsx xls csv json yaml html pd 读取速度稍微慢
xlrd 经典的excel读取库,只能读,不能写,写需要用xlwt
pandas 功能强,太臃肿,没必要。–数据分析可以用
安装 pip install openpyxl 外部库
读取Excel的文件
读取文件之前关闭文件
windows下面的路径有反斜杠 转义字符
得到wookbook对象
一、获取workbook对象
import openpyxl
wb = openpyxl.load_workbook(r"d:\cases.xlsx")
# print(wb) # 得到一个workbook对象
# print(wb._sheets) # [, ]
# 不直接去获取_sheets 属性,称为私有属性 - 类里面self.sheets自己去调用可以,外面调用不太好
# print(wb.sheetnames)# 获取所有的表单名字 -- 列表['Sheet1', 'Sheet2']
区别:wb._sheets - 存储的是对象 wb.sheetnames - 存储的是字符串
二、获取表单对象 - 三种
# 1.active是表示被激活的表单,被选择的sheet,打开文件默认那个表单
active_sheet = wb.active
print(active_sheet) #
# 2.获取所有的表单的正确用法
print(wb.worksheets) # [, ]
# 获取某一个表单 通过索引
sheet = wb.worksheets[0]
# 第二种方式 通过表单名称去获取 Sheet1 过时了 ,会有警告 DeprecationWarning:
# sheet = wb.get_sheet_by_name("Sheet1")
# print(sheet)
# 3.正规用法,通过名字
sheet = wb["Sheet1"]
print(sheet)
# pycharm 不支持sheet.属性的提示 通过索引的话 有提示,可以先用索引再改回来
三、读取内容 - 单元格
cell = sheet.cell(1,2) # 获取单元格,参数:行列 row, column 索引从1开始 -- |
print(cell.value) # 获取值 -- # 单元格后才能用.value -- 字符串
# 获取某一行 -- 元组 - (, ) --直接.value不行 - 获取单元格对象后才能用.value | |
print(sheet[1])
# 获取某一行的值
for column in sheet[1]: # column相当于单元格对象 所以可以用value
print(column.value)
# 获取多行:1-3行,第三行是包含的。 切片,与列表有差异
# print(sheet[1:3])
# 获取某一列
# print(sheet["A"])
# 获取所有的数据
total_data = list(sheet.rows)
for row in total_data:
for cell in row:
print(cell.value)
4、写入 - 保存才生效
#写入一个单元格
cell.value =
wb.save("r'D:\cases.xlsx") # 保存 save("filename")
# 关闭
wb.close()
import openpyxl
from openpyxl.worksheet.worksheet import Worksheet
class ExcelHandler:
"""操作excel"""
def __init__(self, file):
self.file = file
# 如果这里实例化workbook,写入二次的时候,还是在最开始的里面写,而不是在第一次写入之后再继续写
# self.wb = openpyxl.load_workbook(file)
# sheet_name 也可以为实例化属性,下面就可以省略,缺点是只能操作一个表单
def open_sheet(self, sheet_name) -> Worksheet: # 打开表单
"""在函数或者方法的后面加 ->类型,表示此函数返回值是一个这样的类型,就是个函数注解"""
wb = openpyxl.load_workbook(self.file) # 获取worklook对象
sheet = wb[sheet_name] # 获取表单
return sheet
def get_header(self, sheet_name):
"""获取表头"""
sheet = self.open_sheet(sheet_name) # 获取表单
header = sheet[1] # 获取表单第一行 -- 表头
header_value = []
for i in header:
header_value.append(i.value)
return header_value
def read(self, sheet_name):
"""读取所有的数据"""
sheet = self.open_sheet(sheet_name) # 都得先打开
rows = list(sheet.rows) # 所有的行
# rows = list(sheet.rows)[1:] # 获取所有的数据,得到的类型没见过,需要用list转换
data = []
for row in rows[1:]: # 每一行
row_data = []
for cell in row: # 单元格
row_data.append(cell.value)
# list转化为字典
data_dict = dict(zip(self.get_header(sheet_name), row_data))
# if data_dict["case_id"] == "None":
# 列表可读性不强 可以用zip zip["title","gender"] [1,2] --> 利用title=1 gender=2
# zip["title","gender"] [1,2] --> 利用title=1 gender=2
data.append(data_dict)
return data
@staticmethod
def write(file, sheet_name, row, column, data):
"""写入数据"""
wb = openpyxl.load_workbook(file)
sheet = wb[sheet_name]
# 修改单元格
sheet.cell(row, column).value = data
# 保存
wb.save(file)
# 退出
wb.close()
if __name__ == '__main__':
# excel = ExcelHandler(r"D:\cases.xlsx")
# excel_header = excel.get_header("Sheet1")
# print(excel_header)
# print(excel.read("Sheet1"))
# ExcelHandler.write(r"D:\cases.xlsx", "Sheet1", 2, 9, "测试通过")
``