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

最近找的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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值