在测试中,我们需要对一些数据存取。存取的方式有很多,用txt就可以。但是用csv,excel等表单格式来存取,更方便直观。连大名鼎鼎的微软也考虑将 Python 作为 Excel 的一种官方脚本语言。Python结合Excel进行数据处理,是一种比较流行的数据处理方式。
微软,最近也宣布:微软考虑将 Python 作为 Excel 的一种官方脚本语言
Python处理Excel,并不方便像普通文本文件一样直接进行读写,需要借助第三方库来实现。
常用的python-excel 系列有:
xlrd、xlwt、xlutils
xlrd - 读取 Excel 文件
xlwt - 写入 Excel 文件
xlutils - 操作 Excel 文件的实用工具,如复制、分割、筛选等
这些package可以直接用pip来安装,非常方便。
excel读取
结合一段简单的代码来看:
import xlrd
# 打开 xls 文件
book = xlrd.open_workbook("test.xls")
print "表单数量:", book.nsheets
print "表单名称:", book.sheet_names()
# 获取第1个表单
sh = book.sheet_by_index(0)
print u"表单 %s 共 %d 行 %d 列" % (sh.name, sh.nrows, sh.ncols)
print "第二行第三列:", sh.cell_value(1, 2)
# 遍历所有表单
for s in book.sheets():
for r in range(s.nrows):
# 输出指定行
print s.row(r)
读取excel常用的方法如下:
open_workbook 打开文件
sheet_by_index 获取某一个表单
sheets 获取所有表单
cell_value 获取指定单元格的数据
当然,我们获取表单有几种方式:
data = xlrd.open_workbook('excelname')
table = data.sheets()[0] #通过索引顺序获取
table = data.sheet_by_index(0) #通过索引顺序获取
table = data.sheet_by_name('sheetname') #通过名称获取
excel写入
结合一段简单的代码来看:
import xlwt
# 创建 xls 文件对象
wb = xlwt.Workbook()
# 新增一个表单
sh = wb.add_sheet('A Test Sheet')
# 按位置添加数据
sh.write(0, 0, 1234.56)
sh.write(1, 0, 8888)
sh.write(2, 0, 'hello')
sh.write(2, 1, 'world')
# 保存文件
wb.save('example.xls')
写入excel常用的方法:
Workbook 创建文件对象
add_sheet 新增一个表单
write 在指定单元格写入数据
我们可以将这些方法,写成一个类来调用。做成自己的包,做其他自动化的时候,直接调用即可。
#! /usr/bin/env python
# coding=utf-8
'''
FuncName: Excelhelper.py
Desc: operate excel
Author: Anderson
'''
import xlwt
import xlrd
import os
from xlutils.copy import copy
class WriteExcel(object):
"""
操作excel表格
写入excel:1.无文件则自动创建文件,创建新文件和新工作表
2.存在文件且存在指定工作表,直接操作该工作表
3.存在文件且不存在指定工作表,新建指定工作表并写入该表,不影响已存在工作表数据
"""
def __init__(self, fileName, sheetName):
self.fileName = fileName
self.sheetName = sheetName
self.style = self.sheetStyle()
def sheetStyle(self):
"""
:return: 各种配置参数
"""
# style = xlwt.easyxf('font: color-index red, bold on')
font = xlwt.Font() # Create the Font
# 字体
font.name = 'Times New Roman'
# 粗体
# font.bold = True
# 下划线
# font.underline = True
# 斜体
# font.italic = True
pattern = xlwt.Pattern() # Create the Pattern
pattern.pattern = xlwt.Pattern.SOLID_PATTERN # May be: NO_PATTERN 关模式, SOLID_PATTERN 开模式, or 0x00 through 0x12
pattern.pattern_fore_colour = 2 # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...
style = xlwt.XFStyle() # Create the Style 初始化样式
style.font = font # Apply the Font to the Style 为样式设置字体
style.pattern = pattern # Add Pattern to Style
return style
def sheetValue(self, row, col, value, style=False):
"""
:param sheetName: 表名, fileName: 文件名, row:行, col:列, value:值, style:格式
:return: 对文件的指定表进行写数据操作,支持重复写
"""
# xls文件不存在则新创建文件和新创建工作表
if os.path.exists(self.fileName) == False:
writeExcel = xlwt.Workbook()
# 注意:如果对同一个单元格重复操作,会引发overwrite Exception,想要取消该功能,需要在添加工作表时指定为可覆盖,所以在打开时加cell_overwrite_ok=True解决
writeExcel.add_sheet(self.sheetName, cell_overwrite_ok=True)
# 这里只能保存扩展名为xls的,xlsx的格式不支持
writeExcel.save(self.fileName)
else:
# open existed xls file 需要 newWb = copy('fileName')
# 注意添加参数formatting_info=True,得以保存之前数据的格式
readExcel_old = xlrd.open_workbook(self.fileName, formatting_info=True)
# 判断sheetName的索引,将数据写入该表
sheetNames = readExcel_old.sheet_names()
readExcel_new = copy(readExcel_old)
# 判断是否存在sheetName,不存在则新建该工作表,不影响其他表数据
if self.sheetName not in sheetNames:
readExcel_new.add_sheet(self.sheetName)
readExcel_new.save(self.fileName)
readExcel_new = xlrd.open_workbook(self.fileName, formatting_info=True)
sheetNames = readExcel_new.sheet_names()
readExcel_new = copy(readExcel_new)
else:
pass
sheetNameIndex = sheetNames.index(self.sheetName)
writeExcel = readExcel_new.get_sheet(sheetNameIndex)
if style:
writeExcel.write(row, col, value, self.style)
else:
writeExcel.write(row, col, value)
# 这里只能保存扩展名为xls的,xlsx的格式不支持
readExcel_new.save(self.fileName)
class ReadExcel(object):
def __init__(self, fileName, sheetName):
self.fileName = fileName
self.sheetName = sheetName
self.sheets = xlrd.open_workbook(fileName, formatting_info=True)
self.tables = self.sheets.sheet_by_name(self.sheetName)
self.handele = dict([(sheetName, self.sheets.sheet_by_name(sheetName))
for sheetName in self.sheets.sheet_names()])
# 获取整行的值
def sheetRowValue(self, row=0):
if self.sheetName not in self.handele: return None
return self.tables.row_values(row)
# 获取整列的值
def sheetColValue(self, col=0):
if self.sheetName not in self.handele: return None
return self.tables.row_values(col)
# 获取所有表的名称
def sheetNames(self):
return self.sheets.sheet_names()
# 获取单元格的值
def sheetCellValue(self, row, col):
if self.sheetName not in self.handele: return None
return self.tables.cell(row, col).value
# 获取工作表的行数
def sheetRowNum(self):
if self.sheetName not in self.handele: return None
return self.tables.nrows
# 获取工作表的列数
def sheetColNum(self):
if self.sheetName not in self.handele: return None
return self.tables.ncols
# 获取所有行的值
def get_all_Row(self):
row_value=[]
for i in range(self.sheetRowNum()):
#print(self.sheetRowValue(i))
row_value.append(self.sheetRowValue(i))
return(row_value)
# 获取所有列的值
def get_all_Col(self):
col_value = []
for i in range(self.sheetColNum()):
#print(self.sheetColValue(i))
col_value.append(self.sheetColValue(i))
return col_value
#测试一下
if __name__ == "__main__":
fileName = "helper.xlsx"
sheetName = "Sheet1"
myWrite = WriteExcel(fileName, sheetName)
style = True
for row in range(10):
col = row
value = "anderson"
myWrite.sheetValue(row, col, value, style)
myRead = ReadExcel(fileName, sheetName)
print(myRead.get_all_Row())
封装好自己的类,在其它地方,直接调用。
妈妈在也不用担心我不会用python处理excel了。
作者简介:
Snake, 人称安蜀黍,专职软件测试10几年,测试界的老司机。