没有接触过编程的同学多多少少会对程序代码有点畏惧感,既然excel表格那么好用,鼠标点点,键盘敲敲就可以啦,那为什么还要用python对它进行操作呢。
随着大数据时代的来临,除了办公会用到excel表格外,涉及到大数据工程的项目上需要对大量数据进行处理,这就难免会涉及到很多数据的重复性工作。python能够很便捷地对表格进行大量数据的处理,将重复性工作代码化,运行一段代码就可以避免很多重复性工作。
python是一种面向对象的语言。
电视机遥控器就是一个对象(可以把对象理解为一个实实在在的东西),遥控器上面的按钮就对应着不同的功能,比如换台,关电视等等,这里被操作的是电视。
同样,用python可以写出很多工具对象,这个工具对象有很多功能,在这里被操作的是表格。
我们可以利用python可以写出很多的工具对象,不同的工具控制着不同的东西,这里我们主要讲控制表格的工具。
下面是我写好的两个工具对象(不用看完整代码,记住class后面的名字以及def后面的名字就好)
这段代码制作了两个工具(出现了两个class,一个class就对应一个工具对象),一个是用来读Excel数据的,一个是用来把数据写入Excel的。每次操作表格之前,拷贝到编译器即可.
class后面的名称**ExcelData()和softwareOfwriteToExcel()**是我们在用这个工具一定会用到的,需要用哪个工具就调用哪个。
from xlrd import xldate_as_tuple
import xlrd
import xlwt
import datetime
'''***************************'''
class ExcelData(): #提取有效行数和列数,提取整行数据
# 初始化方法
def __init__(self, data_path, sheetname):
#定义一个属性接收文件路径
self.data_path = data_path
# 定义一个属性接收工作表名称
self.sheetname = sheetname
# 使用xlrd模块打开excel表读取数据
self.data = xlrd.open_workbook(self.data_path)
# 根据工作表的名称获取工作表中的内容(方式①)
self.table = self.data.sheet_by_name(self.sheetname)
# 根据工作表的索引获取工作表的内容(方式②)
#self.table = self.data.sheet_by_name(0)
# 获取第一行所有内容,如果括号中1就是第二行,这点跟列表索引类似
self.keys = self.table.row_values(0)
# 获取工作表的有效行数
self.rowNum = self.table.nrows
# 获取工作表的有效列数
self.colNum = self.table.ncols
# 定义一个读取excel表的方法
def readExcel(self):
# 定义一个空列表
datas = []
for i in range(1, self.rowNum):
# 定义一个空字典
sheet_data = {}
for j in range(self.colNum):
# 获取单元格数据类型
c_type = self.table.cell(i,j).ctype
# 获取单元格数据
c_cell = self.table.cell_value(i, j)
if c_type == 2 and c_cell % 1 == 0: # 如果是整形
c_cell = int(c_cell)
elif c_type == 3:
# 转成datetime对象
date = datetime.datetime(*xldate_as_tuple(c_cell,0))
c_cell = date.strftime('%Y/%d/%m %H:%M:%S')
elif c_type == 4:
c_cell = True if c_cell == 1 else False
sheet_data[self.keys[j]] = c_cell
# 循环每一个有效的单元格,将字段与值对应存储到字典中
# 字典的key就是excel表中每列第一行的字段
# sheet_data[self.keys[j]] = self.table.row_values(i)[j]
# 再将字典追加到列表中
datas.append(sheet_data)
# 返回从excel中获取到的数据:以列表存字典的形式返回
return datas
#定义一个获取行内容的方法,输入行数
def getRow(self,num):
rowContent = self.table.row_values(num-1)
return rowContent
#定义一个获取列内容的方法,输入列数
def getCol(self,num):
colContent = self.table.col_values(num-1)
return colContent
'''************************************************'''
class softwareOfwriteToExcel():
def __init__(self,name_of_excel,name_of_sheet):
self.name_of_excel = name_of_excel
self.name_of_sheet = name_of_sheet
self.w = xlwt.Workbook() # 创建一个工作簿
self.ws = self.w.add_sheet(self.name_of_sheet) # 创建一个工作表
def writeToExcel(self,row,col,content):
self.ws.write(row-1,col-1,content)
self.w.save(self.name_of_excel)
def writeToROW(self,rowNum,list):
num = 1
for i in list:
self.ws.write(rowNum-1,num-1,i)
num += 1
self.w.save(self.name_of_excel)
def writeToCol(self,colNum,list):
num = 1
for i in list:
self.ws.write(num-1,colNum-1,i)
num += 1
self.w.save(self.name_of_excel)
#不用刻意理解,每次都这么写
read_tool = ExcelData('/Users/jerry/Desktop/example.xlsx','Sheet3')
这里我们往读工具内传入了两个参数,一个是/Users/jerry/Desktop/example.xlsx,这个是被操作表格的绝对路径,另外一个是表格内被操作表单的名称,运行这一行代码我们就获取到了表格内的数据,并存放在了read_tool里,接下来要读表格内的数据其实就是对read_tool进行操作。
3 . 获取下面表格的第1行数据并打印出来
遥控器使用功能的方法是按键,python工具对象使用功能的方法是** .+功能名字 **,由以上简图可知,获取行内容的功能名称为getRow,所以调用的方法就是read_tool.getRow(1),1为行号
print(read_tool.getRow(1))
运行结果为
4. 以此类推,获取第1列的数据,调用的方法为read_tool.getCol(1),若要打印结果则使用
print(read_tool.getCol(1))
from xlrd import xldate_as_tuple
import xlrd
import xlwt
import datetime
'''***************************'''
class ExcelData(): #提取有效行数和列数,提取整行数据
# 初始化方法
def __init__(self, data_path, sheetname):
#定义一个属性接收文件路径
self.data_path = data_path
# 定义一个属性接收工作表名称
self.sheetname = sheetname
# 使用xlrd模块打开excel表读取数据
self.data = xlrd.open_workbook(self.data_path)
# 根据工作表的名称获取工作表中的内容(方式①)
self.table = self.data.sheet_by_name(self.sheetname)
# 根据工作表的索引获取工作表的内容(方式②)
#self.table = self.data.sheet_by_name(0)
# 获取第一行所有内容,如果括号中1就是第二行,这点跟列表索引类似
self.keys = self.table.row_values(0)
# 获取工作表的有效行数
self.rowNum = self.table.nrows
# 获取工作表的有效列数
self.colNum = self.table.ncols
# 定义一个读取excel表的方法
def readExcel(self):
# 定义一个空列表
datas = []
for i in range(1, self.rowNum):
# 定义一个空字典
sheet_data = {}
for j in range(self.colNum):
# 获取单元格数据类型
c_type = self.table.cell(i,j).ctype
# 获取单元格数据
c_cell = self.table.cell_value(i, j)
if c_type == 2 and c_cell % 1 == 0: # 如果是整形
c_cell = int(c_cell)
elif c_type == 3:
# 转成datetime对象
date = datetime.datetime(*xldate_as_tuple(c_cell,0))
c_cell = date.strftime('%Y/%d/%m %H:%M:%S')
elif c_type == 4:
c_cell = True if c_cell == 1 else False
sheet_data[self.keys[j]] = c_cell
# 循环每一个有效的单元格,将字段与值对应存储到字典中
# 字典的key就是excel表中每列第一行的字段
# sheet_data[self.keys[j]] = self.table.row_values(i)[j]
# 再将字典追加到列表中
datas.append(sheet_data)
# 返回从excel中获取到的数据:以列表存字典的形式返回
return datas
#定义一个获取行内容的方法,输入行数
def getRow(self,num):
rowContent = self.table.row_values(num-1)
return rowContent
#定义一个获取列内容的方法,输入列数
def getCol(self,num):
colContent = self.table.col_values(num-1)
return colContent
'''************************************************'''
class softwareOfwriteToExcel():
def __init__(self,name_of_excel,name_of_sheet):
self.name_of_excel = name_of_excel
self.name_of_sheet = name_of_sheet
self.w = xlwt.Workbook() # 创建一个工作簿
self.ws = self.w.add_sheet(self.name_of_sheet) # 创建一个工作表
def writeToExcel(self,row,col,content):
self.ws.write(row-1,col-1,content)
self.w.save(self.name_of_excel)
def writeToROW(self,rowNum,list):
num = 1
for i in list:
self.ws.write(rowNum-1,num-1,i)
num += 1
self.w.save(self.name_of_excel)
def writeToCol(self,colNum,list):
num = 1
for i in list:
self.ws.write(num-1,colNum-1,i)
num += 1
self.w.save(self.name_of_excel)
write_tool = softwareOfwriteToExcel('demo.xls','mysheet')
这句代码就制作好了一个空表格demo.xls,并打开了一个新表单mysheet,对这个新表格操作就是对write_tool进行操作
根据上面的简图和读操作,写工具下有三个主用功能
softwareOfwriteToExcel.writeToExcel(1,2,'haha')
#第一个参数填入行数,第二个参数填入列数,最后一个参数填入要写入单元格的内容
运行结果:
工程文件夹内生成一个名为demo.xls的文件,打开表格可以看到第一样第二列出现了haha字符串
list = [1,2,3,4,5,6,"djd"]
#第一个参数为行数,第二个参数为需要写入的内容
softwareOfwriteToExcel.writeToRow(8,list)
运行结果:
5. 第9列写入列表[1,2,3,4,5,6,“djd”,“djdj”,“djdjdj”]
list = [1,2,3,4,5,6,"djd","djdj","djdjdj"]
#第一个参数填入列数,第二个参数写入内容列表
softwareOfwriteToExcel.writeToCol(9,list)
以上代码模块将常用的读和写的功能都涵盖进来了,工具的具体代码不用看更不用记。需要对表格操作时:
read_tool.getRow(1)
写工具依此类推