专栏首页开源优测[接口测试 - 基础篇] 08 封装个基本的excel解析类

[接口测试 - 基础篇] 08 封装个基本的excel解析类

概述

本文基于openpyxl封装一个excel解析类,请注意,不采用Python的任何高级特性,就简简单单的一个类,实现excel的一些基本操作,并演示如何使用该类。

封装类及使用

直接上代码。

#-*- coding:utf-8 -*-

__author__ = "苦叶子"

import os
from openpyxl import Workbook, load_workbook


# excel自定义封装类
class LYMOpenXL:
    def __init__(self, path, read_only=False):
        self.wb = None
        if os.path.exists(path):
            self.path = path
            self.wb = load_workbook(self.path, 
                read_only=read_only)        
        else:
            print("%s 文件不存在" % path)
            exit(0)    
    
    # 获取excel的行数
    # 如果指定的工作簿存在,则返回其数据行数,否则返回None
    def get_cell_row(self, sheet):
        if self.wb:            
            # 先通过sheet获取工作簿
            sh = self.wb.get_sheet_by_name(sheet)            
            if sh: 
                return sh.max_row        
        
         return None
                
    # 获取excel的列数
    # 如果指定的工作簿存在,则返回其数据列数,否则返回None
    def get_cell_col(self, sheet):
        if self.wb:            
            # 先通过sheet获取工作簿
            sh = self.wb.get_sheet_by_name(sheet)            
            if sh:            
                return sh.max_column  
                      
        return None

    # 获取工作簿名称列表
    def get_sheets_name(self):
        if self.wb:                      
            return self.wb.get_sheet_names()        
                      
        return None

    # 通过索引获取工作簿名
    # 索引从0开始
    def get_sheet_name_by_index(self, index):
        if self.wb:
            sheets = self.wb.get_sheet_names()
            sheet_len = len(sheets)       
                      
            if index >= 0 and index < sheet_len:            
                      
                return sheets[index]        
                      
        return None
    
    # 创建工作簿
    def create_sheet(self, name, index=0):
        res = False
        if self.wb:
            self.wb.create_sheet(title=name, index=index)     
            res = True
               
        return res    
                      
        
    # 修改工作簿名
    def set_sheet_name(self, sheet_name, name):
        res = False
        if self.wb:
            self.wb[sheet_name].title = name
            res = True

        return res    
    
    # 获取单元格值
    def get_cell_value(self, sheet, row, col):
        value = None
        if self.wb:
            value = self.wb[sheet].cell(row=row, 
                column=col).value        return value    
    
    # 设置单元格值
    def set_cell_value(self, sheet, row, col, value):
        res = False
        if self.wb:
            self.wb[sheet].cell(row=row, 
                column=col).value = value
            res = True

        return res    
    
    # 保存
    def save(self, path=""):
        if path != "":
            self.path = path        
        
        if self.wb:
            self.wb.save(self.path)
       
if __name__ == "__main__":
    print("python openpyxl基本实例")
    print("---" * 20, end='\n')

    xl = LYMOpenXL("openpyxl_demo.xlsx")    
       
    # 获取所有工作簿名
    sheets = xl.get_sheets_name()
    print(">>>获取工作簿列表", end='\n')
    print(sheets)    
       
    # 通过索引获取工作簿名
    print("---" * 20, end='\n')
    print(">>>通过所有获取工作簿名")    
    for index in range(0, len(sheets)):
        print(xl.get_sheet_name_by_index(index), 
            end='  ')
       
    print(end='\n')    
    
    # 获取各工作簿数据行列数
    print("---" * 20)    
    for sheet in sheets:
        nrows = xl.get_cell_row(sheet)
        ncols = xl.get_cell_col(sheet)
        print("工作簿[%s]的数据行列数为(%d, %d)" 
               % (sheet, nrows, ncols))    
       
    # 获取各工作簿中的数据
    print("---" * 20)
    print(">>>获取工作簿中数据")    
    for sheet in sheets:
        nrows = xl.get_cell_row(sheet)
        ncols = xl.get_cell_col(sheet)
        print("---" * 20, end='\n')
        print("工作簿[%s]数据如下: " % sheet)        
        for row in range(1, nrows+1):            
            for col in range(1, ncols+1):
                value = xl.get_cell_value(sheet, row, col)
                print("[%d, %d]->%s" % 
                    (row, col, value), end='\t')    
            
    # 修改各工作簿第一行的数据为:DeepTest
    print("---" * 20)
    print(">>>设置工作簿中数据")    
    for sheet in sheets:
        ncols = xl.get_cell_col(sheet)        
        for col in range(1, ncols+1):
                xl.set_cell_value(sheet, row=1, col=col, 
                    value="DeepTest")    
    
    # 保存
    xl.save()

小结

请自行查阅openpyxl官方文档去实现以下功能

  • 一次性读取多个单元格的值
  • 设置指定单元格的字体
  • 设置指定单元格的样式(例如背景色等)

本文分享自微信公众号 - 开源优测(DeepTest),作者:苦叶子

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 接口测试 | 24 requests + unittest集成你的接口测试

    概述 本文就如何结合requests、unittest进行实例演示,如果你还不了解unittest、PO模型,请翻阅公众号前期发布的unittest专题和PO模...

    苦叶子
  • 接口测试 | 24 requests + unittest集成你的接口测试

    概述 本文就如何结合requests、unittest进行实例演示,如果你还不了解unittest、PO模型,请翻阅公众号前期发布的unittest专题和PO模...

    苦叶子
  • [接口测试 - http.client篇] 16 基于http.client之POM实战一下

    概述 关注公众号回复: http.client_pom_demo 获取本文示例源码 你需要了解以下知识和技术,以便掌握后续的实例代码: http.client常...

    苦叶子
  • python网页截图

    py3study
  • 第27天面向对象之反射,绑定方法,特定的

      类中的方法为什么要这么麻烦分这么多的类型呢?当然是有运用场景了,在写类中方法的时候具体的应用设置成绑定方法还是非绑定方法主要取决于我们方法代码中是否要用到对...

    py3study
  • vn.py入门-低买高卖示例

    本文用一个例子来介绍vnpy的用法。从项目创建开始,到一个简单策略的设计。 这个例子连接到CTP接口,每秒检查一下目标合约的价格,若低于指定价格则买入,若高于指...

    用Python的交易员
  • 教你制作可移动的导航栏

    Dwyane
  • python pyqt5 QDateTimeEdit 常用

    setDisplayFormat() yyyy MM dd HH mm ss setMinimumDate() setMaximumDate() tim...

    用户5760343
  • tkinter带界面实现指定目录生成器

    路径是自己设定好的,然后输入要生成的文件夹数量,然后再点相应的按钮就可以了 下面放上源码,有需要的可以自己进行修改:

    小海怪的互联网
  • bs4爬虫实战四--获取音悦台榜单

    本次爬虫使用随机proxy和headers抵抗反爬虫机制,来获取音悦台网站公布的MV榜单.

    py3study

扫码关注云+社区

领取腾讯云代金券