天天看点

python面向对象读写excel

一、概要

在利用python编写一些自动化的处理脚本时,经常和excel进行交互,配置参数的导入(读excel)以及结果的输出(写excel),这里基于python面向对象的思想搭建了一个excel处理的框架,为后续自动化脚本的编写奠定一定的基础。

针对python读excel编写了一个类ExcelRead,该类中包含了python读取excel中的内容的各种方法;针对python写excel编写了一个类ExcelWrite,该类中均包含了python写入excel的各种方法及其相关的格式设置,下面具体介绍。

二、python读excel类ExcelRead

针对python读excel设计了一个ExcelRead的类,下面分别介绍该类中设计的类变量、初始化方法、以及其他相关的方法。

1、类变量介绍如下:

类变量包括:__workbook,__sheet,__print。其中,__workbook用于存放excel文件的对象,__sheet用于存放excel文件中一张表格的对象,文件操作时主要操作该对象,__print是一个调试参数,当该参数设置为True时打印读取的内容。变量前面加两个下划线是表示该变量是类的私有变量,与外部隔离,不能被外部访问。

2、初始化方法介绍:

__init__函数是类的初始化方法,在类初始化的时候被调用,该方法传递两个参数,file_name是excel的文件名,sheet_name是excel中需要访问的sheet名。返回的对象存入之前定义的类变量中。

3、其他方法介绍:

get_number_of_row 获取表格中内容的最大行数

get_number_of_cols 获取表格中内容的最大列数

get_value_of_row 获取某一行的所有值构成的列表

get_value_of_col 获取某一列的所有值构成的列表

get_value_of_cell 获取某一个单元格中的值

get_value_of_area 获取某一个区域的所有值构成的二维列表

get_all_content 获取表格中所有的内容构成的二维列表

get_title_of_row 获取行标题构成的列表

get_title_of_co 获取列标题构成的列表

4、代码如下:

import xlrd
class ReadExcel:
    __workbook = None
    __sheet = None
    __print = False  # 用于开启全局打印

    def __init__(self, file_name, sheet_name):
        ReadExcel.__workbook = xlrd.open_workbook(file_name)
        ReadExcel.__sheet = ReadExcel.__workbook.sheet_by_name(sheet_name)

    def get_number_of_rows(self):
        """
        得到表格的最大行数
        :return: __number_of_row
        """
        __rows_number = self.__sheet.nrows
        if ReadExcel.__print is True:
            print(__rows_number)
        return __rows_number

    def get_number_of_cols(self):
        """
        得到表格的最大列数
        :return: __number_of_cols
        """
        __cols_number = self.__sheet.ncols
        if ReadExcel.__print is True:
            print(__cols_number)
        return __cols_number

    def get_value_of_row(self, row_index):
        """
        得到表格某一行的内容
        :param row_index: 行号
        :return: 行内容组成的列表
        """
        __row_value = self.__sheet.row_values(row_index)
        if ReadExcel.__print is True:
            print(__row_value)
        return __row_value

    def get_value_of_col(self, col_index):
        """
        得到表格某一列的内容
        :param col_index: 列号
        :return: 列中内容组成的列表
        """
        __col_value = self.__sheet.col_values(col_index)
        if ReadExcel.__print is True:
            print(__col_value)
        return __col_value

    def get_value_of_cell(self, row_index, col_index):
        """
        得到表格中一个单元格中的内容
        :param row_index: 行号
        :param col_index: 列号
        :return: 单元格中的内容
        """
        __cell_value = self.__sheet.cell(row_index, col_index).value
        if ReadExcel.__print is True:
            print(__cell_value)
        return __cell_value

    def get_value_of_area(self, row_right, row_left, col_up, col_down):
        """
        得到表格中一个区域的值
        :param row_right: 该区域行号的起始值
        :param row_left: 该区域行号的结束值
        :param col_up: 该区域列号的起始值
        :param col_down: 该区域列号的结束值
        :return: 返回该区域的值构成的列表
        """
        __area_value = []
        __all_content = self.get_all_content()
        for row in range(row_right, row_left):
            __data_temp = []
            for col in range(col_up, col_down):
                __data_temp.append(__all_content[row][col])
            __area_value.append(__data_temp)
        return __area_value

    def get_all_content(self):
        """
        得到表格中所有的内容
        :return: 返回表格中所有内容的列表
        """
        __all_content = []
        __rows_num = self.get_number_of_rows()
        for temp in range(__rows_num):
            __value_of_row = self.get_value_of_row(temp)
            __all_content.append(__value_of_row)
        if ReadExcel.__print is True:
            print(__all_content)
        return __all_content

    def get_title_of_row(self, row_index, col_right, col_left):
        """
        得到行标题
        :param row_index: 标题所在的行号
        :param col_right: 标题所在的列起始号
        :param col_left: 标题所在的列终止号
        :return: 返回行标题的列表
        """
        __row_value = self.get_value_of_row(row_index)
        __row_title = __row_value[col_right:col_left]
        if ReadExcel.__print is True:
            print(__row_title)
        return __row_title

    def get_title_of_col(self, col_index, row_up, row_down):
        """
        得到列标题号
        :param col_index: 标题所在的列号
        :param row_up: 标题所在的行起始号
        :param row_down: 标题所在的列终止号
        :return: 返回列标题的列表
        """
        __col_value = self.get_value_of_col(col_index)
        __col_title = __col_value[row_up:row_down]
        if ReadExcel.__print is True:
            print(__col_title)
        return __col_title

           

三、python写excel类ExcelWrite

针对python写excel设计了一个ExcelWrite类,下面分别介绍该类中用到的类变量、初始化方法、静态方法以及其他方法。

1、类变量的介绍如下:

类变量包括__workbook,__sheet,__style。其中__workbook与__sheet的功能和读excel中的类似,__style表示的是python写入excel中的格式。

2、初始化方法介绍如下:

初始化方法中分别对三个类变量进行了初始化。

3、静态方法介绍如下:

set_style是静态方法,主要用于设置写入excel的格式。

静态方法在方法的前面会添加一个@staticmethod的修饰器进行修饰,这样的方法主要是放在类里面,功能与类相关,但又不会对类本身做任何操作的方法,简单的说就是方法不会传递self参数。

4、其他方法的介绍如下:

save_excel 保存excel

put_value_in_cell 往单元格中写入一个内容

put_value_in_row 将列表以行的形式写入

put_value_in_col 将列表以列的形式写入

put_value_in_area 将二维列表与区域的形式写入

5、代码如下:

import xlwt
class WriteExcel:
    __workbook = None
    __sheet = None
    __style = None

    def __init__(self, sheet_name):
        WriteExcel.__workbook = xlwt.Workbook()
        WriteExcel.__sheet = WriteExcel.__workbook.add_sheet(sheet_name)
        WriteExcel.__style = xlwt.XFStyle()  # 初始化样式

    @staticmethod  # 静态方法,设置单元格格式
    def set_style(name='Arial', height=200, colour_index=0x7FFF, bold=False, borders=True, borders_colours=0x40):
        __style = xlwt.XFStyle()  # 初始化样式
        #  字体设置
        __font = xlwt.Font()  # 为样式创建字体
        __font.name = name
        __font.height = height
        __font.colour_index = colour_index
        __font.bold = bold
        __style.font = __font
        #  边框设置
        if borders is True:
            __borders = xlwt.Borders()
            __borders.left = xlwt.Borders.MEDIUM
            __borders.right = xlwt.Borders.MEDIUM
            __borders.top = xlwt.Borders.MEDIUM
            __borders.bottom = xlwt.Borders.MEDIUM
            __borders.left_colour = borders_colours
            __borders.right_colour = borders_colours
            __borders.top_colour = borders_colours
            __borders.bottom_colour = borders_colours
            __style.borders = __borders
        WriteExcel.__style = __style   # 修改字体格式
        return __style

    def save_excel(self, path):
        """
        保存表格
        :param path: 保存的路径
        :return:
        """
        self.__workbook.save(path)

    def put_value_in_cell(self, value, row_index, col_index):
        """
        把字符串填入表格的单元格
        :param value:要填入的值
        :param row_index:要填入值所在的行号
        :param col_index:要填入值所在的列号
        :return:
        """
        self.__sheet.write(row_index, col_index, value, WriteExcel.__style)

    def put_value_in_row(self, value, row_index, col_index):
        """
        把列表横向填入表格
        :param value: 需要填入的列表
        :param row_index: 填入列表所在的起始行
        :param col_index: 填入列表所在的起始列
        :return:
        """
        __row = row_index
        __col = col_index
        for __value in value:
            self.put_value_in_cell(__value, __row, __col)
            __col = __col + 1

    def put_value_in_col(self, value, row_index, col_index):
        """
        把列表纵向填入表格
        :param value: 需要填入的列表
        :param row_index: 填入列表所在的起始行
        :param col_index: 填入列表所在的起始列
        :return:
        """
        __row = row_index
        __col = col_index
        for __value in value:
            self.put_value_in_cell(__value, __row, __col)
            __row = __row + 1

    def put_value_in_area(self, value, row_index, col_index):
        """
        把一个数组按顺序填入表格
        :param value: 需要填入的数组
        :param row_index: 填入数组所在的起始行
        :param col_index: 填入数组所在的起始列
        :return:
        """
        __row = row_index
        __col = col_index
        for __row_list in value:
            for __value in __row_list:
                self.put_value_in_cell(__value, __row, __col)
                __col = __col + 1
            __col = col_index  # 换行
            __row = __row + 1

           

四、方法测试

在代码的路径下新建一个test_r.xlsx的文档,在里面的Sheet1中填入如下的内容用于测试。

python面向对象读写excel

测试代码如下,实现将test_r.xlsx中的内容通过python读上来,再通过python修改部分格式后,填写到test_w.xls中。

if __name__ == "__main__":
    sheet_r = ReadExcel("test_r.xlsx", "Sheet1")
    row_title = sheet_r.get_title_of_row(0, 1, 11)
    # print(row_title)
    col_title = sheet_r.get_title_of_col(0, 1, 16)
    # print(col_title)
    data = sheet_r.get_value_of_area(1, 16, 1, 11)
    # print(data)

    sheet_w = WriteExcel("Sheet1")
    WriteExcel.set_style(bold=True)
    sheet_w.put_value_in_row(row_title, 0, 1)
    sheet_w.put_value_in_col(col_title, 1, 0)
    WriteExcel.set_style(bold=False)
    sheet_w.put_value_in_area(data, 1, 1)
    sheet_w.save_excel("test_w.xls")
           

测试后写入的效果如下,对标题进行了加粗,同时设置了每一个单元格的边框。

python面向对象读写excel

这里只搭建了一个框架,如果需要更加复杂的功能,可以在此基础上添加自己的方法。

附上代码的完整版:

# -*- coding: utf-8 -*-
"""
@Author: hefei
@Date: 20190109
@E-mail:[email protected]
@Description:这个文件用于利用面向对象的思想读取excel中的内容或者往excel中写入内容
@Copyright(C): [email protected]  All rights reserved
"""
import os
import xlrd
import xlwt


class ReadExcel:
    __workbook = None
    __sheet = None
    __print = False  # 用于开启全局打印

    def __init__(self, file_name, sheet_name):
        ReadExcel.__workbook = xlrd.open_workbook(file_name)
        ReadExcel.__sheet = ReadExcel.__workbook.sheet_by_name(sheet_name)

    def get_number_of_rows(self):
        """
        得到表格的最大行数
        :return: __number_of_row
        """
        __rows_number = self.__sheet.nrows
        if ReadExcel.__print is True:
            print(__rows_number)
        return __rows_number

    def get_number_of_cols(self):
        """
        得到表格的最大列数
        :return: __number_of_cols
        """
        __cols_number = self.__sheet.ncols
        if ReadExcel.__print is True:
            print(__cols_number)
        return __cols_number

    def get_value_of_row(self, row_index):
        """
        得到表格某一行的内容
        :param row_index: 行号
        :return: 行内容组成的列表
        """
        __row_value = self.__sheet.row_values(row_index)
        if ReadExcel.__print is True:
            print(__row_value)
        return __row_value

    def get_value_of_col(self, col_index):
        """
        得到表格某一列的内容
        :param col_index: 列号
        :return: 列中内容组成的列表
        """
        __col_value = self.__sheet.col_values(col_index)
        if ReadExcel.__print is True:
            print(__col_value)
        return __col_value

    def get_value_of_cell(self, row_index, col_index):
        """
        得到表格中一个单元格中的内容
        :param row_index: 行号
        :param col_index: 列号
        :return: 单元格中的内容
        """
        __cell_value = self.__sheet.cell(row_index, col_index).value
        if ReadExcel.__print is True:
            print(__cell_value)
        return __cell_value

    def get_value_of_area(self, row_right, row_left, col_up, col_down):
        """
        得到表格中一个区域的值
        :param row_right: 该区域行号的起始值
        :param row_left: 该区域行号的结束值
        :param col_up: 该区域列号的起始值
        :param col_down: 该区域列号的结束值
        :return: 返回该区域的值构成的列表
        """
        __area_value = []
        __all_content = self.get_all_content()
        for row in range(row_right, row_left):
            __data_temp = []
            for col in range(col_up, col_down):
                __data_temp.append(__all_content[row][col])
            __area_value.append(__data_temp)
        return __area_value

    def get_all_content(self):
        """
        得到表格中所有的内容
        :return: 返回表格中所有内容的列表
        """
        __all_content = []
        __rows_num = self.get_number_of_rows()
        for temp in range(__rows_num):
            __value_of_row = self.get_value_of_row(temp)
            __all_content.append(__value_of_row)
        if ReadExcel.__print is True:
            print(__all_content)
        return __all_content

    def get_title_of_row(self, row_index, col_right, col_left):
        """
        得到行标题
        :param row_index: 标题所在的行号
        :param col_right: 标题所在的列起始号
        :param col_left: 标题所在的列终止号
        :return: 返回行标题的列表
        """
        __row_value = self.get_value_of_row(row_index)
        __row_title = __row_value[col_right:col_left]
        if ReadExcel.__print is True:
            print(__row_title)
        return __row_title

    def get_title_of_col(self, col_index, row_up, row_down):
        """
        得到列标题号
        :param col_index: 标题所在的列号
        :param row_up: 标题所在的行起始号
        :param row_down: 标题所在的列终止号
        :return: 返回列标题的列表
        """
        __col_value = self.get_value_of_col(col_index)
        __col_title = __col_value[row_up:row_down]
        if ReadExcel.__print is True:
            print(__col_title)
        return __col_title


class WriteExcel:
    __workbook = None
    __sheet = None
    __style = None

    def __init__(self, sheet_name):
        WriteExcel.__workbook = xlwt.Workbook()
        WriteExcel.__sheet = WriteExcel.__workbook.add_sheet(sheet_name)
        WriteExcel.__style = xlwt.XFStyle()  # 初始化样式

    @staticmethod  # 静态方法,设置单元格格式
    def set_style(name='Arial', height=200, colour_index=0x7FFF, bold=False, borders=True, borders_colours=0x40):
        __style = xlwt.XFStyle()  # 初始化样式
        #  字体设置
        __font = xlwt.Font()  # 为样式创建字体
        __font.name = name
        __font.height = height
        __font.colour_index = colour_index
        __font.bold = bold
        __style.font = __font
        #  边框设置
        if borders is True:
            __borders = xlwt.Borders()
            __borders.left = xlwt.Borders.MEDIUM
            __borders.right = xlwt.Borders.MEDIUM
            __borders.top = xlwt.Borders.MEDIUM
            __borders.bottom = xlwt.Borders.MEDIUM
            __borders.left_colour = borders_colours
            __borders.right_colour = borders_colours
            __borders.top_colour = borders_colours
            __borders.bottom_colour = borders_colours
            __style.borders = __borders
        WriteExcel.__style = __style   # 修改字体格式
        return __style

    def save_excel(self, path):
        """
        保存表格
        :param path: 保存的路径
        :return:
        """
        self.__workbook.save(path)

    def put_value_in_cell(self, value, row_index, col_index):
        """
        把字符串填入表格的单元格
        :param value:要填入的值
        :param row_index:要填入值所在的行号
        :param col_index:要填入值所在的列号
        :return:
        """
        self.__sheet.write(row_index, col_index, value, WriteExcel.__style)

    def put_value_in_row(self, value, row_index, col_index):
        """
        把列表横向填入表格
        :param value: 需要填入的列表
        :param row_index: 填入列表所在的起始行
        :param col_index: 填入列表所在的起始列
        :return:
        """
        __row = row_index
        __col = col_index
        for __value in value:
            self.put_value_in_cell(__value, __row, __col)
            __col = __col + 1

    def put_value_in_col(self, value, row_index, col_index):
        """
        把列表纵向填入表格
        :param value: 需要填入的列表
        :param row_index: 填入列表所在的起始行
        :param col_index: 填入列表所在的起始列
        :return:
        """
        __row = row_index
        __col = col_index
        for __value in value:
            self.put_value_in_cell(__value, __row, __col)
            __row = __row + 1

    def put_value_in_area(self, value, row_index, col_index):
        """
        把一个数组按顺序填入表格
        :param value: 需要填入的数组
        :param row_index: 填入数组所在的起始行
        :param col_index: 填入数组所在的起始列
        :return:
        """
        __row = row_index
        __col = col_index
        for __row_list in value:
            for __value in __row_list:
                self.put_value_in_cell(__value, __row, __col)
                __col = __col + 1
            __col = col_index  # 换行
            __row = __row + 1


if __name__ == "__main__":
    sheet_r = ReadExcel("test_r.xlsx", "Sheet1")
    row_title = sheet_r.get_title_of_row(0, 1, 11)
    # print(row_title)
    col_title = sheet_r.get_title_of_col(0, 1, 16)
    # print(col_title)
    data = sheet_r.get_value_of_area(1, 16, 1, 11)
    # print(data)

    sheet_w = WriteExcel("Sheet1")
    WriteExcel.set_style(bold=True)
    sheet_w.put_value_in_row(row_title, 0, 1)
    sheet_w.put_value_in_col(col_title, 1, 0)
    WriteExcel.set_style(bold=False)
    sheet_w.put_value_in_area(data, 1, 1)
    sheet_w.save_excel("test_w.xls")
           

转载或使用请标明出处。