python之Excel操作

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对象  <openpyxl.workbook.workbook.Workbook object at 0x0000020FBE890278>
# print(wb._sheets) # [<Worksheet "Sheet1">, <Worksheet "Sheet2">]
# 不直接去获取_sheets 属性,称为私有属性 - 类里面self.sheets自己去调用可以,外面调用不太好

# print(wb.sheetnames)# 获取所有的表单名字 -- 列表['Sheet1', 'Sheet2']

区别:wb._sheets - 存储的是对象  wb.sheetnames - 存储的是字符串

二、获取表单对象 - 三种

# 1.active是表示被激活的表单,被选择的sheet,打开文件默认那个表单
active_sheet = wb.active
print(active_sheet)  # <Worksheet "Sheet1">
# 2.获取所有的表单的正确用法
print(wb.worksheets)  # [<Worksheet "Sheet1">, <Worksheet "Sheet2">]
# 获取某一个表单  通过索引
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开始 -- <Cell 'Sheet1'.B1>
print(cell.value) # 获取值 -- # 单元格后才能用.value -- 字符串

# 获取某一行 -- 元组 - (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>) --直接.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, "测试通过")
``

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值