python使用xlrd和xlwt模块对Excel文件读写

it2023-02-06  27

最近找的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或rData_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文件数据》

最新回复(0)