python学习笔记22 excel汇总

需求:根据数电发票生成汇总数据

要点:

1.如何获取最后一行行号。

2.空值value =None

3.数据存储用了双list\[]的形式,定位通过enumerate()拆分后用list.index()实现。

4.长数据要数值化,否则excel会变成科学计数,round(float(),2)

代码1

python 复制代码
import os
import re
import time
import datetime
import xlwings as  xw

def choosefile(path):

    result=[]
    for dir,folder,file in os.walk(path):
        for f in file:
            if f.endswith('.xls') or f.endswith ('.xlsx'):
                result.append(os.path.join(dir,f))

    print(result)
    return result

def transfile(listpath):
    excelapp = xw.App(visible=False, add_book=False)
    # 打开excel
    excel = excelapp.books.open(listpath[0])
    # 获取sheets
    sheet = excel.sheets
    sheetname=[]
    for i in sheet:
        sheetname.append(i.name)
    sht=sheet['Sheet1']

    # 获取最后一行的行号
    last_row = sht.used_range.rows[-1].row
    #print(last_row)
    #第一行行号 sht.used_range.rows[0].row
    print(str(sht.used_range.rows[-1].row))
    #开始处理汇总数据
    # 有数据要处理就新建sheet
    if sht.range("A7").value!=None and "汇总123" not in sheetname:
        excel.sheets.add("汇总123")
        sht2=excel.sheets('汇总123')
        sht2.range("A1").value='购方名称'
        sht2.range("B1").value = '数电票号码'
        sht2.range("C1").value = '数量'
        sht2.range("D1").value = '合计金额(不含税)'
        sht2.range("E1").value = '合计税额'
        sht2.range("F1").value = '合计金额(含税)'
        sht2.range('A:B').column_width=40
        sht2.range('d:f').column_width=20

    total=[]
    cpname=[]
    # 按需补齐客户名称
    for i in range(7, last_row - 1):
        if  sht.range("G"+str(i)).value==None:
            sht.range("G" + str(i)).value =  sht.range("G"+str(i-1)).value
        #print(i)

    # 按需要设定范围
    for i in range(7,last_row-1):
        if sht.range("G"+str(i)).value not in cpname and sht.range("G"+str(i)).value!=None:
            total.append([sht.range("G"+str(i)).value,'\''+str(sht.range("E"+str(i)).value),sht.range("Y"+str(i)).value,sht.range("L"+str(i)).value,sht.range("M"+str(i)).value,sht.range("K"+str(i)).value])
            cpname.append(sht.range("G"+str(i)).value)
        elif sht.range("G"+str(i)).value!=None :

            # 遍历双重列表
            for j, list in enumerate(total):
                # 在当前子列表中查找元素
                # print(i,sub_list)
                if sht.range("G" + str(i)).value in list:
                    # 发票号
                    if sht.range("E" + str(i)).value[-8:] not in total[j][1]:
                        total[j][1] += '/' + sht.range("E" + str(i)).value[-8:]
                    # 数量
                    total[j][2] += sht.range("Y" + str(i)).value
                    # 金额不含税
                    total[j][3] += sht.range("L" + str(i)).value
                    # 税额
                    total[j][4] += sht.range("M" + str(i)).value
                    # 金额含税
                    total[j][5] += sht.range("K" + str(i)).value

                    # print( total[j][1])
                    break

        # print(total)
        # 数据更新
        l = 2
        for k in total:
            sht2 = excel.sheets('汇总123')
            sht2.range("A" + str(l)).value = k[0]
            sht2.range("B" + str(l)).value = str(k[1])
            sht2.range("C" + str(l)).value = round(float(k[2]), 3)
            sht2.range("D" + str(l)).value = round(float(k[3]), 2)
            sht2.range("E" + str(l)).value = round(float(k[4]), 2)
            sht2.range("F" + str(l)).value = round(float(k[5]), 2)
            l += 1

    excel.save()
    excel.close()
    excelapp.quit()




path=r'C:\Users\d\Desktop\1'
listpath=choosefile(path)
transfile(listpath)

代码2

python 复制代码
import os
import re
import time
import datetime
import xlwings as  xw

def choosefile(path):

    result=[]
    for dir,folder,file in os.walk(path):
        for f in file:
            if f.endswith('.xls') or f.endswith ('.xlsx'):
                result.append(os.path.join(dir,f))

    print(result)
    return result

def transfile(listpath):
    excelapp = xw.App(visible=False, add_book=False)
    # 打开excel
    excel = excelapp.books.open(listpath[0])
    # 获取sheets
    sheet = excel.sheets
    sheetname=[]
    for i in sheet:
        sheetname.append(i.name)
    sht=sheet['Sheet1']

    # 获取最后一行的行号
    last_row = sht.used_range.rows[-1].row
    #print(last_row)
    #第一行行号 sht.used_range.rows[0].row
    print(str(sht.used_range.rows[-1].row))
    #开始处理汇总数据
    # 有数据要处理就新建sheet
    if sht.range("A7").value!=None and "汇总123" not in sheetname:
        excel.sheets.add("汇总123")
        sht2=excel.sheets('汇总123')
        sht2.range("A1").value='购方名称'
        sht2.range("B1").value = '数电票号码'
        sht2.range("C1").value = '数量(不一定准确)'
        sht2.range("D1").value = '合计金额(不含税)'
        sht2.range("E1").value = '合计税额'
        sht2.range("F1").value = '合计金额(含税)'
        sht2.range('A:B').column_width=40
        sht2.range('c:f').column_width=20

    total=[]
    cpname=[]

    # 按需要设定范围
    for i in range(7,last_row-1):
        print(i)
        if sht.range("G"+str(i)).value not in cpname and sht.range("G"+str(i)).value!=None:

            total.append([sht.range("G"+str(i)).value,'\''+str(sht.range("E"+str(i)).value),sht.range("Y"+str(i)).value,sht.range("L"+str(i)).value,sht.range("M"+str(i)).value,sht.range("K"+str(i)).value])
            cpname.append(sht.range("G"+str(i)).value)
        elif sht.range("G"+str(i)).value!=None :

            # 遍历双重列表
            for j, list in enumerate(total):
                # 在当前子列表中查找元素
                    #print(i,sub_list)
                    if sht.range("G"+str(i)).value in list:
                        #发票号
                        total[j][1]+='\\'+sht.range("E"+str(i)).value[-8:]
                        #数量
                        total[j][2] +=  sht.range("Y" + str(i)).value
                        #金额不含税
                        total[j][3] +=  sht.range("L" + str(i)).value
                        #税额
                        total[j][4] +=  sht.range("M" + str(i)).value
                        #金额含税
                        total[j][5] +=  sht.range("K" + str(i)).value


                        #print( total[j][1])
                        break

    #print(total)
    #数据更新
    l=2
    for k in total:
        sht2 = excel.sheets('汇总123')
        sht2.range("A"+str(l)).value=k[0]
        sht2.range("B"+str(l)).value = str(k[1])
        sht2.range("C"+str(l)).value = round(float(k[2]),3)
        sht2.range("D"+str(l)).value = round(float(k[3]),2)
        sht2.range("E"+str(l)).value = round(float(k[4]),2)
        sht2.range("F"+str(l)).value = round(float(k[5]),2)
        l+=1
    excel.save()
    excel.close()
    excelapp.quit()




path=r'C:\Users\d\Desktop\1'
listpath=choosefile(path)
transfile(listpath)
相关推荐
叼烟扛炮4 分钟前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
叼烟扛炮6 小时前
Linux 学习笔记(五十八):IO 多路复用封神——epoll 底层原理揭秘
linux·运维·服务器·网络·笔记·学习·php
陈布衣8 小时前
MySQL(1)_MySQL 5.7.21 Linux 安装笔记
linux·笔记·mysql
缘来是你远去是我11 小时前
本地个人笔记exe
笔记
FakeOccupational12 小时前
【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置
笔记·stm32·实时音视频
迪康coolmu12 小时前
企业U盘管控落地实战:基于迪康端点安全一体化管理系统的移动存储安全实践
运维·人工智能·经验分享·笔记·安全·电脑
Z21-X15 小时前
云原生运维学习笔记:容器技术的演进、底层原理与 Docker 全生命周期管理
运维·笔记·学习·云原生
Rabitebla1 天前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
小lu飞1 天前
2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程
前端·笔记·ai·ai编程
无心水1 天前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师