一、概要
在利用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中填入如下的内容用于测试。
测试代码如下,实现将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")
测试后写入的效果如下,对标题进行了加粗,同时设置了每一个单元格的边框。
这里只搭建了一个框架,如果需要更加复杂的功能,可以在此基础上添加自己的方法。
附上代码的完整版:
# -*- coding: utf-8 -*-
"""
@Author: hefei
@Date: 20190109
@E-mail:[email protected]
@Description:这个文件用于利用面向对象的思想读取excel中的内容或者往excel中写入内容
@Copyright(C): goke@2019 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")
转载或使用请标明出处。