入手新部门,需要每周做一份维护组的考核报表,当初开始的时候做第一份考核报表花了近2个小时才做出一份考核报表。
后来想想作为一个小程序员,不能这么傻乎乎的做这些机械的工作,要做点自动化报表的小程序,经常近一个星期的晚上的修修补补终于完成。
本文采用了以下第三方包:
# coding=utf-8
from Tkinter import *
from tkFileDialog import *
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.styles import Border, Side, Font # 设置字体和边框需要的模块
from docx import Document
from docx.shared import Pt
from docx.shared import Inches
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH # 段落居中
import random
import os
import sys
import xlrd #读excel要用到xlrd模块
import xlwt #写excel表要用到xlwt模块
from datetime import date,datetime
要读取的是三份文件:第一份是地区基站与维护人员对应关系表(openpyxl读取xlsx文档),需要该文档的1张表;第二份是地区故障数据EXCEL文档(openpyxl读取xlsx文档),计算为基准分,需要该文档的4张表;第三份是目前未恢复的地区与维护人员对应关系表(用到xlrd模块读xls文档,用到xlwt模块写xls文档),作为减分项,需要该文档的1张表;
最后需要对6张表进行操作,然后自动生成考核分析WORD文档。
对地区故障数据,计算为考核分时:
当小于等于挑战值,得100;
当大于挑战值,但小于基准值,按挑战值与基准值之间的线性关系得分。(60-100之间)
当大于基准值,就不能按线性得分,因为线性一次函数与X轴有交点,交点之后为负值,但考核分起码为正数才合理。该部分的 得分为60/(退服时长/基准值)。即为一个反函数,反函数会不断趋近于0,而不接近0.
程序运行打开的界面如下:
# coding=utf-8
from Tkinter import *
from tkFileDialog import *
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.styles import Border, Side, Font # 设置字体和边框需要的模块
from docx import Document
from docx.shared import Pt
from docx.shared import Inches
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH # 段落居中
import random
import os
import sys
import xlrd
import datetime #获取时间
import time
from docx.enum.style import WD_STYLE_TYPE #获取所有word表格样式
class App:
def __init__(self, root):
frame = Frame(root) # container
frame.pack()
# self.quitButton = Button(frame, text='quit', command=frame.quit)
# self.quitButton.pack()
#
# self.hiButton = Button(frame, text='Say Hi', command=self.sayHi)
# self.hiButton.pack()
self.button1 = Button(frame, text="退服周报文件", command=self.filefound1, width=20, height=1).grid(row=0, column=0)
self.button2 = Button(frame, text="街道基站文件", command=self.filefound2, width=20, height=1).grid(row=1, column=0)
self.button3 = Button(frame, text="站点激活文件", command=self.filefound3, width=20, height=1).grid(row=2, column=0)
self.button4 = Button(frame, text="运行", command=self.execuate, width=20, height=1).grid(row=3, column=0)
self.button5 = Button(frame, text="退出", command=frame.quit, width=20, height=1).grid(row=4, column=0)
# self.button1.pack()
# self.button2.pack()
# self.button3.pack()
# self.button4.pack()
# self.button5.pack()
self.e = Entry(frame)
self.e.grid(row=0, column=2)
self.e.delete(0, END) # 将输入框里面的内容清空
self.e.insert(0, '显示文件路径')
self.e1 = Entry(frame)
self.e1.grid(row=1, column=2)
self.e1.delete(0, END) # 将输入框里面的内容清空
self.e1.insert(0, '显示文件路径')
self.e2 = Entry(frame)
self.e2.grid(row=2, column=2)
self.e2.delete(0, END) # 将输入框里面的内容清空
self.e2.insert(0, '显示文件路径')
self.filepath1 = StringVar()
self.filepath2 = StringVar()
self.filepath3 = StringVar()
# 打开文档
self.document = Document()
def get_week_of_month(self):
"""
获取指定的某天是某个月中的第几周
周一作为一周的开始
"""
t = time.gmtime()
end = int(datetime.datetime(t.tm_year, t.tm_mon, t.tm_mday).strftime("%W"))
begin = int(datetime.datetime(t.tm_year, t.tm_mon, 1).strftime("%W"))
return end - begin + 1
def filefound1(self):
self.filepath1 = askopenfilename()
print self.filepath1
self.e.delete(0, END) # 将输入框里面的内容清空
self.e.insert(0, self.filepath1)
return self.filepath1
def filefound2(self):
self.filepath2 = askopenfilename()
print self.filepath2
self.e1.delete(0, END) # 将输入框里面的内容清空
self.e1.insert(0, self.filepath2)
return self.filepath2
def filefound3(self):
self.filepath3 = askopenfilename()
print self.filepath3
self.e2.delete(0, END) # 将输入框里面的内容清空
self.e2.insert(0, self.filepath3)
return self.filepath3
def execuate(self):
# print self.filepath1, self.filepath2, self.filepath3
# 修改正文的中文字体类型,示例代码:(全局设置)
self.document.styles['Normal'].font.name = u'仿宋'
self.document.styles['Normal'].font.size = Pt(16) # 16对应仿宋三号
self.document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋')
styles =