xlrd,xlwt操作Excel实例

本文详细介绍了如何使用Python处理Excel文件,针对含有合并单元格的信息,实现数据读取、分层、定位及输出。通过示例代码展示了如何遍历Excel页面,解析合并单元格数据,并将其重新组织到新的工作簿中,包括多个sheet页的处理,以及数据间复杂映射关系的解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把有合并单元格的信息读取出来,输出所在层数与位置

我要操作的Excel是这样的

801928-20160502215134857-1277952755.png

要的到的是这样的效果
801928-20160502220436888-1389285688.png

# -*- coding: utf-8 -*-
import xlrd
import xlwt
r=1
# shxrange = range(bk.nsheets)
wb = xlwt.Workbook(encoding='utf-8')#创建工作簿,设置字符编码
ws = wb.add_sheet('A TEST Sheet')#创建sheet

goods = xlrd.open_workbook('test3.xlsx')#打开文件
index = 0
for sheet_index in range(goods.nsheets):
    sh = goods.sheet_by_index(sheet_index)#返回第几页的对象
    #添加内容到row_list当中
    row_list = []
    for rx in range(sh.nrows):
        if sh.row(rx)[0].ctype:
            print sh.row(rx)
            row_list.append(sh.row_values(rx))
    # 取出有多少行
    row = len(row_list)
    # print row
    for r in range(row):
        weizhi =1 
        for c in range(len(row_list[r])):
            if row_list[r][c]:
                ws.write(index, 0, row_list[r][c])
                ws.write(index,3,row)
                ws.write(index,4,weizhi)
                index = index + 1
        row =row-1
wb.save('example3.xls')

需要这样操作的数据有很多,就要分为多个sheet页,每个sheet页包含一个要操作的数据,这样的话就可以把每个sheet页重新数层数,如果不需要也可以写在一个sheet页当中,要批量处理就分多个sheet页

要处理的数据和上面差不多,不过稍微麻烦一点

要处理的数据分为两个sheet页
sheet页1
801928-20160502222738216-1405329130.png
sheet页2
801928-20160502222855451-2004110202.png

要处理的数据是通过sheet1页每个单元格数据*前面的第一个数字找到sheet2页对应的行号,这样的数据太难看了,想要得到这样的数据
801928-20160502223749341-1020847715.png

# -*- coding: utf-8 -*-
import xlrd
import xlwt
r=1
# shxrange = range(bk.nsheets)
wb = xlwt.Workbook(encoding='utf-8')#创建工作簿,设置字符编码
ws = wb.add_sheet('A TEST Sheet')#创建sheet

goods = xlrd.open_workbook('test10.xlsx')#打开文件
index = 0
sheet = 0
for sheet_index in range(goods.nsheets/2):
    sh = goods.sheet_by_index(sheet)#返回第1页的对象
    print sheet
    #添加内容到row_list当中
    row_list = []
    for rx in range(sh.nrows):
        #第一行为当前页的分类
        if sh.row(rx)[0].ctype:
            # print sh.row(rx)
            row_list.append(sh.row_values(rx))
        else:
            # print r
            r +=1
    # 取出有多少行
    row = len(row_list)
    sheet = sheet+1
    print sheet
    #将第二页的内容添加到con_list当中
    con_list = []
    sh = goods.sheet_by_index(sheet)#返回第几页的对象
    for rx in range(sh.nrows):
        #第一行为当前页的分类
        # if rx ==0:
        #   fenglei = sh.row_values(rx)
        # else:
        if sh.row(rx)[0].ctype:
            # print sh.row(rx)
            con_list.append(sh.row_values(rx))
        else:
            print r
            r +=1
    sheet=sheet+1
    # print row
    for r in range(row):
        weizhi = 1
        for c in range(len(row_list[r])):
            if row_list[r][c]:
                ws.write(index, 0, row_list[r][c])
                # ws.write(index,10,fenglei)
                ws.write(index,3,row)
                ws.write(index,4,weizhi)
                try:
                    ws.write(index,2,con_list[int(row_list[r][c].split("*")[0])-1][0])
                    try:
                        ws.write(index,5,con_list[int(row_list[r][c].split("*")[0])-1][1])
                    except:
                        ws.write(index,5,500)
                    try:
                        ws.write(index,6,con_list[int(row_list[r][c].split("*")[0])-1][2])
                    except:
                        ws.write(index,6,500)

                    ws.write(index,7,row_list[r][c].split("*")[1])
                    ws.write(index,8,row_list[r][c].split("*")[2])
                    ws.write(index,9,'hgyingliao'+str(sheet))
                except:
                    ws.write(index,5,500)
                    ws.write(index,6,500)
                    ws.write(index,7,500)
                    ws.write(index,8,500)
                    ws.write(index,9,'hgyingliao'+str(sheet))
                weizhi =weizhi+1
                index = index + 1
        row =row-1
wb.save('example3.xls')

每两个sheet页为单位进行处理

转载于:https://www.cnblogs.com/wuqingzangyue/p/5453360.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值