最近找的pandas资料,发现pandas读取excel数据虽然功能强大,但是读取到的数据都是封装成了Series和Dataframe结构,但对我这个菜鸟来说不能用列表append,很难受,所以来总结下简便的xlrd和xlwt模块读写。
一、读excel——xlrd
1、基本语句
(1)获取表名
names = workbook.sheet_names() 返回工作簿的所有表名
current_name = Data_sheet.name 返回当前表名
(2)根据索引或者名称获取对应sheet
Data_sheet = workbook.sheet_by_name(u'中文名') 通过给定名字选取sheet并返回该表,若是中文名最好加个u或r
Data_sheet = workbook.sheets()[0] 通过索引获取
Data_sheet = workbook.sheet_by_index(0) 同上,通过索引获取
(3)获取表的行、列数
Data_sheet.nrows 返回表的行数
Data_sheet.ncols 返回表的列数
(4)获取表对应行或列的值
Data_sheet.row_values(0) 获取某一行的所有值,0为第一行,以列表形式展示
Data_sheet.col_values(0) 获取某一列的所有值,0为第一列,以列表形式展示
Data_sheet.col_values(0,1,3) 获取第1列,获取左闭右开区间 [1,3) 内的值,以列表形式展示
sheet1.row_slice(0,1,3) 以切片方式获取第1行中,[1,3)区间值,返回列表,形式为:单元类型:单元数据
sheet1.col_slice(0,1,3) 以切片方式获取第1列中,[1,3)区间值
(5)获取表对应单元格的值
Data_sheet.cell_value(i, j)
Data_sheet.cell(i, j).value
2、具体流程
import xlrd
path = u'哦哦.xlsx'
workbook = xlrd.open_workbook(path)
# 获取Excel文件所有sheet的名字
print(workbook.sheet_names())
Data_sheet = workbook.sheet_by_name(u'那可不咋滴') # 通过名字获取
# 获取sheet名称
print("当前sheet名称:", Data_sheet.name)
rowNum = Data_sheet.nrows # sheet行数
colNum = Data_sheet.ncols # sheet列数
############################################################################
# 获取所有单元格的内容(二维形式)
alist = []
for i in range(rowNum):
rowlist = []
for j in range(colNum):
rowlist.append(Data_sheet.cell_value(i, j)) # 把每行所有单元格存储起来
alist.append(rowlist) # 全部的单元格以excel原行列格式存储
# 输出所有单元格的内容
for i in range(rowNum):
for j in range(colNum):
print(alist[i][j])
print('**********************************************************')
# 获取所有单元格的内容(一维形式)
allList =[]
for i in range(rowNum):
for j in range(colNum):
allList.append(Data_sheet.cell_value(i, j)) # 存所有单元格,格式是左->右,上->下的每个单元格单独存为一行
# 输出所有单元格的内容
for i in range(rowNum):
print(allList[i]) # 每行输出原excel的一个单元格内容
#############################################################################
'''读者可以自己随便写个excel试一试'''
二、写excel——xlwt
1、使用xlwt模块要注意:
(1)将写入文件后缀名.xlsx改成.xls,否则进行写入操作很可能会出现:对excel文件操作并保存后(save函数),文件被破坏无法打开的情况
(2)要代码操作的文件不要打开,否则可能会有权限被拒报错:PermissionError: [Errno 13] Permission denied
(3)若对一个单元格重复操作,会引发returns error:Exception: Attempt to overwrite cell:sheetname=u’sheet 1’ rowx=0 colx=0;所以在打开时加cell_overwrite_ok=True解决,table = file.add_sheet(‘sheet name’,cell_overwrite_ok=True)
2、基本语句
(1)创建sheet
data_sheet = workbookTo.add_sheet(u'中文名', cell_overwrite_ok=True) 返回创建好的sheet并设置允许覆盖单元格
(2)在对应单元格写入值
data_sheet.write(i, j, value) .wirte(行坐标,列坐标,内容),将内容value写入(i,j)这个单元格
(3)保存excel文件
workbookTo.save(toPath)
3、具体流程
#***************************************************
import xlwt
# 提前创建好该excel文件,改后缀名为xls
toPath = 'toYangmo.xls'
# 创建工作簿
workbookTo = xlwt.Workbook(encoding='utf-8')
# 创建sheet:哈哈哈
data_sheet = workbookTo.add_sheet(u'哈哈哈', cell_overwrite_ok=True)
# 在第0行的第0,1列分别写上“工厂名”,“累产量”
row0 = [u'工厂名', u'累产量']
data_sheet.write(0, 0, row0[0]) # wirte(行坐标,列坐标,内容),将内容row0[0]写入(0,0)这个单元格
data_sheet.write(0, 1, row0[1]) # wirte(行坐标,列坐标,内容),将内容row0[1]写入(0,1)这个单元格
#***************************************************
# 保存文件
workbookTo.save(toPath)
三、一个小实例
点击跳转《将点坐标转为无向图距离》
四、另一个实例
从一个有一列多行的excel表格1中,读取每个单元格的内容,并以这些内容作为sheet_name去另一个sheet2寻找相应sheet,最后找到相应sheet的特定单元格内容写入sheet3
import xlrd
# 表格1路径
path = u'哦哦.xlsx'
#***************************************************
import xlwt
toPath = 'toYangmo.xls'
# 创建工作簿
workbookTo = xlwt.Workbook(encoding='utf-8')
# 创建sheet:哈哈哈,并设置可覆盖单元格
data_sheet = workbookTo.add_sheet(u'哈哈哈', cell_overwrite_ok=True)
# 在第0行的第0,1列分别写上“工厂名”,“累产量”
row0 = [u'工厂名', u'累产量']
data_sheet.write(0, 0, row0[0]) # wirte(行坐标,列坐标,内容),将内容row0[0]写入(0,0)这个单元格
data_sheet.write(0, 1, row0[1]) # wirte(行坐标,列坐标,内容),将内容row0[1]写入(0,1)这个单元格
#***************************************************
# 读取表格1
workbookUse = xlrd.open_workbook(path)
# 根据sheet索引或者名称获取sheet内容
# Data_sheet = workbook.sheets()[0] # 通过索引获取
# Data_sheet = workbook.sheet_by_index(0) # 通过索引获取
Data_sheet = workbookUse.sheet_by_name(u'那可不咋滴')
rowNum = Data_sheet.nrows # 每个有用sheet的行数
colNum = Data_sheet.ncols # sheet列数
print('sheet行数:', rowNum)
print('sheet列数:', colNum)
print('**********************************************************')
# 获取所有单元格的内容(一维形式)
allList = []
for i in range(rowNum):
for j in range(colNum):
allList.append(Data_sheet.cell_value(i, j)) # 存所有单元格,格式是左->右,上->下的每个单元格单独存为一行
# # 输出所有单元格的内容
# for i in range(rowNum):
# print(allList[i]) # 每行输出原excel的一个单元格内容
print('**********************************************************')
pathFormal = u'临时.xls'
workbookFormal = xlrd.open_workbook(pathFormal)
x = 0
for idx in range(rowNum):
try:
Data_sheetFormal = workbookFormal.sheet_by_name(allList[idx])
except:
pass
else:
# print("关键sheet名称:", Data_sheetFormal.name)
rowNumFormal = Data_sheetFormal.nrows # sheet行数
# TODO:筛选出产量不全为0的数据
# print(Data_sheetFormal.cell_value(1,20))
# Data_sheetFormal: 每个sheet
# rowNumFormal: 每个sheet的行数
# 如果表坐标(1,20)的单元格是‘累产量’,并且该列的最后一行既不是产量为0,也不是只有标题'累产量'这一行
if Data_sheetFormal.cell_value(1,20) == '累产量' and \
Data_sheetFormal.cell(rowNumFormal-1, 20).value != 0 and \
Data_sheetFormal.cell(rowNumFormal-1, 20).value != '累产量':
x+=1
data_sheet.write(x, 0, Data_sheetFormal.name) # 将名写在第0列,从第1行开始
data_sheet.write(x, 1, Data_sheetFormal.cell_value(rowNumFormal - 1, 20)) # 将产量写在第1列,从第1行开始
# 如果不符合条件
else:
print(Data_sheetFormal.name, 'no no no!!!')
# 保存文件
workbookTo.save(toPath)
参考:
《Xlrd模块读取Excel文件数据》
————————————————
版权声明:本文为CSDN博主「小白tree」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43469047/article/details/98355650