Python excel xlwings+QT 考勤表开发 -【Python Office开发基础培训】 拆分合并文件

1. 概述

这是一篇excel开发培训的示例教程。用考勤表作为示例进行演示:

2. QT界面搭建

2.1搭建界面

用desiner所见即所得搭建界面,设置好自动缩放,设定好信号槽。
设计信号槽界面的效果
运行mainwindows.bat 生成mainwindows_ui.py文件:
或命令:pyuic5 -o mainwindows_ui.py mainwindows.ui

创建KevinAttendanceDlg.py。

运行效果:
运行界面效果

3. 搭建软件架构

为了清晰结构,实现数据、算法、界面分开,采用下面的文件结构。

文件用途
mainwindows.ui自动创建的ui文件
mainwindows_ui.py自动创建的界面py文件
KevinAttendanceDlg.py自定义的界面文件,继承于mainwindows_ui.py
KevinAttendanceParam.py自定义的参数类
KevinAttendanceCore.py核心算法类

3. 读取输入文件

请在下面文件内查看代码:
https://gitee.com/bigearrabbit/kevinpython/blob/master/kevinexcel/KevinAttendance/KevinAttendanceCore.py

3.1链接文件

请在KevinAttendanceCore.py文件内查看代码。

    def LinkActiveSheet(self):

        self.ErrMsg = ''
        if xw.apps.active == None:
            self.ErrMsg = "xw.apps.active == None"
            return 1
        param = self.param  # 设定引用
        # get pid
        pid = xw.apps.active.pid
        param.pid = pid
        param.app = xw.apps[pid]

        # 其中需要注意的是单元格的完全引用路径是:
        # 第一个Excel程序的第一个工作薄的第一张sheet的第一个单元格
        wb = param.wb = param.app.books.active
        if wb == None:
            self.ErrMsg = ("wb == None")
            return 1
        param.ExcelFileName = wb.name

        # 引用工作簿中的sheet
        # sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
        # or sht=wb.sheets[sheet的名字]
        param.sht = wb.sheets[0]  # get sheet

        return 0

3.2读取表格

请在KevinAttendanceCore.py文件内查看代码。

    def GetAttendTable(self):
        param = self.param
        wb = param.wb
        sht = wb.sheets[0]  # get sheet 0
        param.inputTable = sht.used_range.value
        if param.inputTable == None or len(param.inputTable) < 2:
            self.ErrMsg = "Input Table data is not right. rows < 2"
            return 2
        return 0  # ok

3.3解析为树状结构

函数AnylisisAttend()
请在KevinAttendanceCore.py文件内查看代码。

解析的效果

ColumnNames :
['部门', '科室', '姓名', '工号', '级别', '正常出勤', '加班', '年假', '事假', '合计']
Dept Tree
开发部
┠  软件科
┠      ┠ ['张1', 1001.0, 'E', 174.0, 8.0, 8.0, 0.0, 174.0]
┠      ┠ ['张2', 1002.0, 'F', 174.0, 0.0, 0.0, 0.0, 174.0]
┠      ┗ ['张3', 1003.0, 'G', 174.0, 0.0, 0.0, 8.0, 166.0]
┠  硬件科
┠      ┠ ['张4', 1005.0, 'E', 174.0, 24.0, 0.0, 0.0, 198.0]
┠      ┠ ['张5', 1006.0, 'F', 174.0, 30.0, 8.0, 0.0, 196.0]
┠      ┠ ['张6', 1007.0, 'G', 174.0, 8.0, 0.0, 16.0, 166.0]
┠      ┗ ['张7', 1008.0, 'H', 174.0, 0.0, 0.0, 0.0, 174.0]
┠销售部
┠  东北科
┠      ┠ ['张7', 1009.0, 'E', 174.0, 0.0, 0.0, 0.0, 174.0]
┠      ┠ ['张8', 1010.0, 'F', 174.0, 22.0, 0.0, 0.0, 196.0]
┠      ┗ ['张9', 1011.0, 'G', 174.0, 0.0, 16.0, 0.0, 158.0]
┗  西南科
       ┠─['李1', 1012.0, 'E', 174.0, 34.0, 0.0, 4.0, 204.0]
       ┗─['李2', 1013.0, 'F', 174.0, 0.0, 0.0, 0.0, 174.0]

4.输出文件

拆分成不同的文件,然后分给不同的科室统计员进行填写、校核等工作

4.1 拆分文件

KevinAttendanceCore.SaveToFiles()函数
循环遍历部门的树,每个部门的科室保存到一个文件内

    def SaveToFiles(self, iDeptTree):
        ec = 0
        app = self.param.app
        datestr = "20210401"
        for key, value in iDeptTree.items():
            for key2, value2 in value.items():
                filename = "{0}-{1}-{2}.xlsx".format(key, key2, datestr)
                # filename = key + "-" + key2 + "-20210401" + ".xlsx"
                print(filename)
                wb = app.books.add()  # wb就是新建的工作簿(workbook)
                sht = wb.sheets['sheet1']
                sht.range('A1').value = self.param.ColumnNames
                i = 2
                for key3, value3 in value2.items():
                    print("       ", value3)
                    sht.range(i,1).value = key
                    sht.range(i,2).value = key2
                    sht.range(i,3).value = value3
                    i+=1

                outfile = 'out/' + filename
                wb.save(outfile)
                wb.close()
                #return 0

输出信息,文件:

开发部-软件科-20210401.xlsx
开发部-硬件科-20210401.xlsx
销售部-东北科-20210401.xlsx
销售部-西南科-20210401.xlsx

软件科的效果

5.合并文件

拆分成不同的文件,然后分给不同的科室统计员进行填写、校核等工作
(等待开发)

5.1 合并文件

参考文章

  1. 杨海华, CSDN, Python excel( xlrd,xlwt, xlwings)表格开发 -【Python Office开发基础培训】
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄鸭code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值