文章目录

  • 原由
  • 效果图
  • 表格分析
  • 代码功能分析
  • 代码环境
  • 代码

原由

因为懒,所以每个月底都不想做当月上班及加班表格。
因为懒,所以不想每次做表格都要查日历算周末日期。
因为懒,所以想有人帮我做该表格。
因为懒,所以没有人能帮我,只能自己写代码做。

效果图

表格分析

表格标题:固定格式,宋体,14号,加粗
职员信息:固定格式,宋体,12号,加粗
A列:A5开始,当月天数列,宋体,9号
黑边框范围:A列至J列,5行开始,5+月天数+1行结束,宋体,9号
周末行:

  1. 如果星期天为月第一天,直接写入
  2. 如果星期六为月最后一天,直接写入
  3. 逢星期天,合并当前列格子与列前一个格子(例如:B7是星期天,合并B6:B7),写入

代码功能分析

  1. 默认对给定员工名,自动生成当年当月表格
  2. 给定员工名,指定年,月,自动生成指定年月表格

备注:详见代码最后部分,示例代码

代码环境

系统:Windows
软件:需要安装office excel(最好版本新一些,要能支持xlsx格式)
语言环境:python2.7

  • 需要包:win32com.client

备注:所需包使用pip install pywin32安装

代码

# -*- coding: UTF-8 -*-# 生成当月上班及加班时间表
# by Yone 2019/12/1
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import win32com.client
import os
import datetime
import calendardef getScriptPath():return os.path.split(os.path.realpath(__file__))[0]class Date(object):def __init__(self, year=None, month=None):if year == None: year = datetime.datetime.now().yearif month == None: month = datetime.datetime.now().monthself.__year = yearself.__month = monthdef getYear(self):return self.__yeardef getMonth(self):return self.__monthdef getMonthRange(self):calendar.setfirstweekday(firstweekday=6)# eg. return value: (6, 31) 6为当月第一天,星期天(0为星期一);31为当月天数return calendar.monthrange(self.getYear(), self.getMonth())class ExcelApp(object):def __init__(self, filePath):self.__filePath = getScriptPath() + "\\" + filePath.encode('gb2312')self.__app = win32com.client.DispatchEx('Excel.Application')self.__workbook = self.__app.WorkBooks.Add()self.__sheet = self.__workbook.ActiveSheetdef getFilePath(self):return self.__filePathdef getSheet(self):return self.__sheetdef saveAndQuit(self):self.__workbook.SaveAs(self.__filePath)self.__workbook.Close()self.__app.Quit()class Table(object):def __init__(self, employee, year=None, month=None):self.__date = Date(year, month)self.__filename = '%d年上班及加班时间表.xlsx' % (self.__date.getYear())self.__app = ExcelApp(self.__filename)self.sheet = self.__app.getSheet()self.__header = '%d年%d月加班申请表' % (self.__date.getYear(), self.__date.getMonth())self.__employee = '职员:%s' % (employee)self.__metadata = {'A1:J1': self.__header,'H2': self.__employee,'A3:A4': '','B3': '考勤','B4': '时间','C3:C4': '加班内容','D3:D4': 'AM','E3:E4': 'PM','F3:F4': '批准','G3': '加班','G4': '时间','H3:J3': '累计时间','H4': '正常','I4': '周末','J4': '法定假日'}self.__auto_start_metadata = 'A5'def __writeMetaData(self):for key in self.__metadata:if ':' in key:self.sheet.Range(key).Merge()self.sheet.Range(key).Value = self.__metadata[key].encode('gb2312')self.sheet.Range(key).Font.Name = "宋体".encode('gb2312')self.sheet.Range(key).Font.Size = 9self.sheet.Range('A1:J1').Font.Name = "宋体".encode('gb2312')self.sheet.Range('A1:J1').Font.Size = 14self.sheet.Range('A1:J1').Font.Bold = Trueself.sheet.Range('H2').Font.Name = "宋体".encode('gb2312')self.sheet.Range('H2').Font.Size = 12self.sheet.Range('H2').Font.Bold = Truedef __deleteSameNameFile(self):if os.path.exists(self.__app.getFilePath()):os.remove(self.__app.getFilePath())def __writeDays(self):weekDay, days = self.__date.getMonthRange()cell1 = self.__auto_start_metadata[0:1]cell2 = self.__auto_start_metadata[1:2]for day in range(1, days + 1):self.sheet.Range(cell1 + cell2).Value = daycell2 = str(int(cell2) + 1)def __writeWeekday(self):weekDay, days = self.__date.getMonthRange()cell1 = self.__auto_start_metadata[0:1]cell2 = self.__auto_start_metadata[1:2]week = weekDaycell1 = chr(ord(cell1) + 1)for day in range(1, days + 1):if weekDay == 6 and day == 1:# B5 = 周末self.sheet.Range(cell1 + cell2).Value = '周末'.encode('gb2312')self.sheet.Range(cell1 + cell2 + ':' + 'J' + cell2).Interior.Color = self.RGB(191, 191, 191)elif weekDay == 6:# B6:B7 = 周末self.sheet.Range(cell1 + str(int(cell2) - 1) + ':' + cell1 + cell2).Merge()self.sheet.Range(cell1 + str(int(cell2) - 1) + ':' + cell1 + cell2).Value = '周末'.encode('gb2312')self.sheet.Range(cell1 + str(int(cell2) - 1) + ':' + 'J' + cell2).Interior.Color = self.RGB(191, 191, 191)# Worksheets("Sheet1").Range("A1").Interior.ColorIndex = 8 ' Cyan # objExcelSheet.cells(row,column).Interior.color = RGB(255,0,0)elif weekDay == 5 and day == days:self.sheet.Range(cell1 + cell2).Value = '周末'.encode('gb2312')self.sheet.Range(cell1 + cell2 + ':' + 'J' + cell2).Interior.Color = self.RGB(191, 191, 191)if weekDay == 6:weekDay = 0else:weekDay += 1cell2 = str(int(cell2) + 1)def RGB(self, R, G, B):return (65536 * R) + (256 * G) + (B)def __writeFinal(self):weekDay, days = self.__date.getMonthRange()cell2 = self.__auto_start_metadata[1:2]finalCell2 = str(days + int(cell2))merge = lambda c1,c2 : self.sheet.Range(c1 + finalCell2 + ':' + c2 + finalCell2).Merge()merge('A', 'C')self.sheet.Range('D' + finalCell2).Value = '统计人'.encode('gb2312')merge('E', 'F')self.sheet.Range('G' + finalCell2).Value = '小计'.encode('gb2312')def __formatCell(self):weekDay, days = self.__date.getMonthRange()A = ord('A')J = ord('J')cell2 = self.__auto_start_metadata[1:2]finalCell2 = str(days + int(cell2))# https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlhalignxlHAlignCenter = -4108self.sheet.Range('A1:J' + finalCell2).HorizontalAlignment = xlHAlignCenter# https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlbordersindexXlBordersIndex = {'xlDiagonalDown':5,'xlDiagonalUp':6,'xlEdgeBottom':9,'xlEdgeLeft':7,'xlEdgeRight':10,'xlEdgeTop':8,'xlInsideHorizontal':12,'xlInsideVertical':11}# https://docs.microsoft.com/zh-cn/office/vba/api/excel.xllinestyleXlLineStyle = {'xlContinuous': 1,'xlDash': -4115,'xlDashDot': 4,'xlDashDotDot': 5,'xlDot': -4118,'xlDouble': -4119,'xlLineStyleNone': -4142,'xlSlantDashDot': 13}# https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlborderweightXlBorderWeight = {'xlHairline': 1,'xlMedium': -4138,'xlThick': 4,'xlThin': 2}getIndex = lambda index : self.sheet.Range('A3:J' + finalCell2).Borders(XlBordersIndex[index])getIndex('xlEdgeLeft').LineStyle = XlLineStyle['xlContinuous']getIndex('xlEdgeLeft').Weight = XlBorderWeight['xlThin']getIndex('xlEdgeTop').LineStyle = XlLineStyle['xlContinuous']getIndex('xlEdgeTop').Weight = XlBorderWeight['xlThin']getIndex('xlEdgeBottom').LineStyle = XlLineStyle['xlContinuous']getIndex('xlEdgeBottom').Weight = XlBorderWeight['xlThin']getIndex('xlEdgeRight').LineStyle = XlLineStyle['xlContinuous']getIndex('xlEdgeRight').Weight = XlBorderWeight['xlThin']getIndex('xlInsideVertical').LineStyle = XlLineStyle['xlContinuous']getIndex('xlInsideVertical').Weight = XlBorderWeight['xlThin']getIndex('xlInsideHorizontal').LineStyle = XlLineStyle['xlContinuous']getIndex('xlInsideHorizontal').Weight = XlBorderWeight['xlThin']self.sheet.Range('A3:J' + finalCell2).Font.Name = "宋体".encode('gb2312')self.sheet.Range('A3:J' + finalCell2).Font.Size = 9def createMetaDataTable(self):self.__deleteSameNameFile()self.__writeMetaData()self.__writeDays()self.__writeWeekday()self.__writeFinal()self.__formatCell()def save(self):self.__app.saveAndQuit()def test(self):print self.__filename.encode('gb2312')print self.__header.encode('gb2312')print self.__date.getYear()print self.__date.getMonth()print self.__date.getMonthRange()if __name__ == "__main__":# 以下二选一即可:名字,生成表格的年(不填,默认为当年),生成表格的月份(不填,默认为当月)# table = Table('小明', 2019, 11)table = Table('小明')table.test()table.createMetaDataTable()table.save()

Python自动生成当月上班及加班时间模板表相关推荐

  1. python自动生成ppt报告_把时间还给洞察,且看PPT调研报告自动生成攻略

    文/JSong @2017.02.28 在数据分析里面有一句话是说,80%的时间要用于数据清洗和整理,而我觉得理想的状态应该是把更多的把时间花在数据背后的洞察当中.去年11月在简书占了个坑,说要自己写 ...

  2. 用Python自动生成NBA巨星生涯数据曲线

    1.序 之前写过一个用 python 自动生成球员职业生涯数据的程序(原文请关注本人公众号),大家的反响很好,我也感到很欣慰.有问我怎么做的,如何学 python 的,也有提建议说集成到 web 里面 ...

  3. python自动汇总表格_用Python自动生成Excel报表

    作者 / 来源:林骥(ID:linjiwx) 01 安装和导入模块 以 Python 中的 openpyxl 模块为例,它能够读取和修改 Excel 文件,如果你还没有安装,可以通过以下命令进行安装: ...

  4. python ppt自动生成_实战 | Python自动生成PPT调研报告

    原标题:实战 | Python自动生成PPT调研报告 原文: 全文约 3821 字,读完可能需要 5 分钟. 文/JSong @2017.02.28 在数据分析里面有一句话是说,80%的时间要用于数据 ...

  5. 用Python自动生成Excel报表

    在日常工作中,可能会有一些重复无聊的任务,比如说,从 Excel 或数据库中收集一些数据,设置相应的数据格式并做成报表. 类似这种重复无聊的任务,我们完全可以交给 Python 去自动完成,只要第一次 ...

  6. python新建word文档_使用Python 自动生成 Word 文档的教程

    当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文档 ...

  7. python项目分析报告_实战 | Python自动生成PPT分析报告

    原标题:实战 | Python自动生成PPT分析报告 在数据分析里面有一句话是说,80%的时间要用于数据清洗和整理,而我觉得理想的状态应该是把更多的把时间花在数据背后的洞察当中.去年11月在简书占了个 ...

  8. python制作相册_《自拍教程73》Python 自动生成相册文件夹

    这里将告诉您<自拍教程73>Python 自动生成相册文件夹,具体操作过程:案例故事: 接Python mediainfo批量重命名图片文件,测试图片是批量重命名好了, 但是将测试图片放于 ...

  9. 用Python自动生成数据日报!

    今天聊聊怎么用Python自动生成数据日报! 其实我觉得蛮简单,核心就是你组装好日报的内容模板,然后将变化的量交给python去填充,需要用到的基本就是python处理excel.word和ppt等相 ...

最新文章

  1. 点云的直通滤波(附实现代码)
  2. Redis在APP中的应用
  3. 10、Power Query-合并查询与追加查询结合应用
  4. C语言:一种通用的程序设计语言
  5. 回文_Manacher算法
  6. python的序列类型及其特点_Fluent Python 笔记——序列类型及其丰富的操作
  7. 新年第二弹|卖萌屋私藏书单大公开
  8. 数值和布尔值的解构赋值
  9. 我的 Hive 为什么跑不起来/跑得慢?看看是不是少了这几行代码?
  10. git提交报异常,fatal: The remote end hung up unexpectedly
  11. InnoDB与UUID
  12. c52语言网红楼梯流水灯程序,单片机程序-利用C52库函数实现左右流水灯
  13. oracle数据库greatest函数,ORACLE函数之GREATEST函数详解范例
  14. nginx-ingress-controller开启modsecurity
  15. python语句结束符号_Python从文本中提取hashtags;以标点符号结尾
  16. Java学习第7篇_supper关键字
  17. 实现ubuntu系统和windows系统进行文件共享、互传等操作**
  18. 简述你计划使用的应用开发框架,及该框架的特点
  19. 跑分软件测试的游戏是,性能跑分 常规软件测试解析
  20. KPI, Metrics, KPI的区别

热门文章

  1. 测绘类专业计算机要学什么科目,测绘类专业选考科目要求是什么
  2. 上班防摸鱼插件(知乎页面)
  3. linux-鸟哥私房菜,基础命令全掌握
  4. php威客网,最新带支付宝支付接口的PHP威客任务网站完整版源码破_界面漂亮整洁...
  5. 北京的十大尾货批发市场【接近生活】
  6. nodejs 前端生成csv 直接下载记录
  7. 新套路+老配方 | 2023年网络钓鱼攻击新方式
  8. 风暴控制(storm control)
  9. flash+AS3制作的倒计时效果
  10. javascript中的esm,import, export