python读写excel

写的一个帮同事处理excel的小程序,需要把一个总表按照店铺名称拆开成7个表。各个商铺表中商品编号中开头是8的需要去掉8,开头是DS的不用管,开头是其他数字的也不用管。然后将商品编号相同的合并起来(卖给顾客同种商品也许优惠程度合出售价格不同,所以同种商品可能有多行),相同编号的商品只保留一行,每行对应的结算价格和售出数量是该店铺所有同编号商品的总和,求出平均价格。如果该店铺的商品列表行数超过500,就再建一个新的excel表。

程序涉及到python对excel的读写操作,将对象按照某个属性排序,以及具有相同属性的对象的合并等。

<pre name="code" class="python">import xlrd
import xlwt
import math
import operator

class store:
    def __init__(self,name,goodsnum,final,salnum):
        self.name=name
        self.goodsnum=goodsnum
        self.final=final
        self.salnum=salnum

wbs = [xlwt.Workbook()] * 10
sheetWrites = [xlwt.Workbook().add_sheet("sheet")] * 10

workbook=xlrd.open_workbook("F:/excel/tmpdb.xls")
sheets=workbook.sheet_names();
worksheet=workbook.sheet_by_name(sheets[0])

global t
t=0

shops = [1]*worksheet.nrows
shopds=[]

listt=[]
listj=[]
listr=[]
listy=[]
listc=[]
listbc=[]
listg=[]
listtd=[]
listjd=[]
listrd=[]
listyd=[]
listcd=[]
listbcd=[]
listgd=[]

def addsame(list):#将一个店铺中商品编号相同的商品汇总起来的方法
    a=0#记录初次出现的下标
    for i in range(0,len(list)):
        if a==i==0:
            list[a].final = list[i].final
            list[a].salnum = list[i].salnum
            #print(listt[i].goodsnum,"\t",listt[i].final,'\t',listt[i].salnum)
        else:
            if list[i].goodsnum == list[i-1].goodsnum:
                list[a].final=list[a].final+list[i].final
                list[a].salnum=list[a].salnum+list[i].salnum
                list[i].final=0
                list[i].salnum=0
            else:
                a = i

def sheet_Shops(sheetname,wbname,listname,path):#写入excel的方法
    global t
    t=0
    for obj in listname:
        if obj.salnum>0:
            obj.final=("%.2f" % obj.final)
            sheetname.write(t, 0, obj.name)
            sheetname.write(t, 1, obj.goodsnum)
            sheetname.write(t, 2, obj.final)
            sheetname.write(t, 3, obj.salnum)
            price=float(obj.final)/float(obj.salnum)
            sheetname.write(t, 4, "%.2f" % price)
            t = t + 1
            wbname.save(path)
        else:
            pass

def sheet_ShopDs(sheetname,wbname,listname,path):#商品号带DS写入excel的方法
    global t
    for obj in listname:
        if obj.salnum>0:
            obj.final=("%.2f" % obj.final)
            sheetname.write(t, 0, obj.name)
            sheetname.write(t, 1, 'DS'+str(obj.goodsnum))
            sheetname.write(t, 2, obj.final)
            sheetname.write(t, 3, obj.salnum)
            price = float(obj.final) / float(obj.salnum)
            sheetname.write(t, 4, "%.2f" % price)
            t = t + 1
            wbname.save(path)
        else:
            pass
def readexcel():
    global shops
    global shopds
    for i in range(0,worksheet.nrows):#读取出excel表格中所有的数据
        row=worksheet.row(i)
        shops[i]= store(worksheet.cell_value(i, 0), worksheet.cell_value(i, 3), worksheet.cell_value(i, 8),
                        worksheet.cell_value(i, 9))
        if "DS" in shops[i].goodsnum:#包含DS的放入shopds数组中
            shopds.append(shops[i])
        elif shops[i].goodsnum[0]=="8" :#开头是8的截取字符串,去掉开头的8,转换成数字
            #print(shops[i].goodsnum)
            shops[i].goodsnum = int(shops[i].goodsnum[-6:])
            #print(shops[i].goodsnum)
        elif shops[i].goodsnum[0]=="1":
            shops[i].goodsnum = int(shops[i].goodsnum)#转换成数字
    shops.remove(shops[0])#去掉表头

def sorted():
    global shops
    global shopds
    print("所有店铺的个数",len(shops))
    shops=list(set(shops).difference(shopds))#将商品编号有DS的过滤出来,取差集
    print("不含DS的个数",len(shops))
    cmpfun = operator.attrgetter('goodsnum') #按照商品编号排序进行排序
    shops.sort(key=cmpfun)
    shopds.sort(key=cmpfun)  # 按照商品编号排序
    for obj in shops:#将shops里的商品按照店铺名分别放入不同列表
        if obj.name=="AAAAAAAA":
            listt.append(obj)
        elif obj.name=="BBBBBBBBBB":
            listj.append(obj)
        elif obj.name=="CCCCCCCCCCCCC":
            listr.append(obj)
        elif obj.name=="DDDDDDDDDDDDDDDDD":
            listy.append(obj)
        elif obj.name=="EEEEEEEEEEEEEE":
            listc.append(obj)
        elif obj.name=="FFFFFFFFFFFFFFFFff":
            listbc.append(obj)
        else:
            listg.append(obj)
    for i in range(0,len(shopds)):#遍历DS开头的
        #print(shopds[i].name,"\t",shopds[i].goodsnum)
        shopds[i].goodsnum=int(shopds[i].goodsnum[2:])#将DS开头的去掉DS,剩下数字
    for obj in shopds:#将商品编号含有DS的商品按照店铺名称,分别放入不同的列表
        if obj.name=="AAAAAAAAAAAAAAAAA":
            listtd.append(obj)
        elif obj.name=="BBBBBBBBBBBBBB":
            listjd.append(obj)
        elif obj.name=="CCCCCCCCCCCCCCC":
            listrd.append(obj)
        elif obj.name=="DDDDDDDDDDDDDDDD":
            listy.append(obj)
        elif obj.name=="EEEEEEEEEEEEEEEEEE":
            listcd.append(obj)
        elif obj.name=="FFFFFFFFFFFFFFFF":
            listbcd.append(obj)
        else:
            listgd.append(obj)

def addexcel(sheet,wb,lists,listds,path):
    addsame(lists)
    sheet_Shops(sheet, wb, lists,path)
    addsame(listds)
    sheet_ShopDs(sheet, wb, listds, path)
def insertexcel():
    for i in range(0, 7):
        wbs[i] = xlwt.Workbook()
        sheetWrites[i] = wbs[i].add_sheet("sheet")
    addexcel(sheetWrites[0], wbs[0], listt, listtd, "F:/excel/AAAAAAAA.xls")
    addexcel(sheetWrites[1], wbs[1], listj, listjd, "F:/excel/BBBBBBBBBBB.xls")
    addexcel(sheetWrites[2], wbs[2], listr, listrd, "F:/excel/CCCCCCCCCCCC.xls")
    addexcel(sheetWrites[3], wbs[3], listy, listyd, "F:/excel/DDDDDDDDDDD.xls")
    addexcel(sheetWrites[4], wbs[4], listc, listcd, "F:/excel/EEEEEEEEEEEE.xls")
    addexcel(sheetWrites[5], wbs[5], listbc, listbcd, "F:/excel/FFFFFFFFFFFFFFFF.xls")
    addexcel(sheetWrites[6], wbs[6], listg, listgd, "F:/excel/GGGGGGGGGGGGG.xls")

def paging(path):
    #path="F:/excel/tmpdb.xls"
    workbook = xlrd.open_workbook(path)
    sheets = workbook.sheet_names();
    worksheet = workbook.sheet_by_name(sheets[0])
    wbs = [xlwt.Workbook()] * 10
    sheetWrites = [xlwt.Workbook().add_sheet("sheet")] * 10
    if worksheet.nrows>500:
        wb = xlwt.Workbook()
        goods=[1]*worksheet.nrows
        for i in range(0,worksheet.nrows):
            goods[i] = store(worksheet.cell_value(i, 0), worksheet.cell_value(i, 1), worksheet.cell_value(i, 2),
                             worksheet.cell_value(i, 3))
        wbnum=math.floor(len(goods) / 500)

        for i in range(0,wbnum):
            wbs[i]=xlwt.Workbook()
            sheetWrites[i]=wbs[i].add_sheet("sheet")
            t=0
            path = path[:14] + str(i+2) + ".xls"
            print(path)
            #print(i)
            if i < wbnum-1:
                for j in range(500*(i+1),500*(i+2)):
                    sheetWrites[i].write(t, 0, goods[j].name)
                    sheetWrites[i].write(t, 1, goods[j].goodsnum)
                    sheetWrites[i].write(t, 2, goods[j].final)
                    sheetWrites[i].write(t, 3, goods[j].salnum)
                    t=t+1
                    wbs[i].save(path)
            elif i==wbnum-1:
                for j in range(500*wbnum,len(goods)):
                    sheetWrites[i].write(t, 0, goods[j].name)
                    sheetWrites[i].write(t, 1, goods[j].goodsnum)
                    sheetWrites[i].write(t, 2, goods[j].final)
                    sheetWrites[i].write(t, 3, goods[j].salnum)
                    t = t + 1
                    wbs[i].save(path)
    else:
        pass
def cut():
    paging("F:/excel/AAAAAAAAAAAA.xls")
    paging("F:/excel/BBBBBBBBBBBBB.xls")
    paging("F:/excel/CCCCCCCCCCC.xls")
    paging("F:/excel/DDDDDDDDDDD.xls")
    paging("F:/excel/EEEEEEEEEEEEE.xls")
    paging("F:/excel/FFFFFFFFFFFF.xls")
    paging("F:/excel/GGGGGGGGGGGG.xls")

readexcel()
sorted()
insertexcel()
cut()


 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值