半路出家杀入医疗行业,各种心酸不足为外人道,过年期间,横竖无聊,就想着可不可以搞一个体检数据的自动计算 比对 汇总 出报告这们个东西,让我可以当甩手掌柜。
思路:
电子化数据表单数据 运用openpyxl(负责自动化处理 集计算 汇总) python-docx(报告出具) 结合pyqt5
难点
1、医疗行业 词条繁多 怎么去统计 (解决方案:懒得统计 词条应该都是非空的 我以非空判断之)
2、QT界面多次点击导致程序崩溃(功力不够 还得大神指点)
3、授权问题(咱无解决办法,功力不够)
废话太多了上代码:
主程序:
import BMI对比公式
import openpyxl
import time
from docx import Document
from docx.shared import Pt, Cm, Mm
from docx.oxml.ns import qn
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
import sys
from PyQt5 import QtWidgets,QtCore
import datetime
from 学校体检GUI import Ui_MainWindow
import threading
from PyQt5.QtWidgets import QFileDialog,QGraphicsObject
class SchoolHealth(QGraphicsObject):
signal1 = QtCore.pyqtSignal(str)
signal2 = QtCore.pyqtSignal(str)
def __init__(self):
super().__init__()
self.app = QtWidgets.QApplication(sys.argv)
self.MainWindow = QtWidgets.QMainWindow()
self.cn = Ui_MainWindow()
self.cn.setupUi(self.MainWindow)
self.MainWindow.show()
self.signal1.connect(self.caohanshu)
self.signal2.connect(self.caohanshu2)
self.cn.pushButton_2.clicked.connect(self.calculate_thread)
# self.cn.pushButton_2.clicked.connect(self.calculate)
self.cn.pushButton_4.clicked.connect(self.wirt_File)
self.cn.pushButton_5.clicked.connect(self.Sum_result)
self.cn.pushButton_3.clicked.connect(self.Baogao)
# cn.pushButton.clicked.connect(open_thread)
self.cn.pushButton.clicked.connect(self.open_file)
# cn.checkBox.clicked.connect(checkbox)
# self.cn.updated_text.connect(self.cn.Qtext_B)
# self.cn.updated_text1.connect(self.cn.Qtext_C)
time.sleep(1)
sys.exit(self.app.exec_())
def calculate(self):
"""
根据电子化数据计算 BMI、BMI修正值、身高对比结果、视力对比结果
"""
# 读取体检数据文件
workbook = openpyxl.load_workbook(f"{filepath}")
self.cn.Qtext_B(f"开始处理{filepath}")
# 获取体检数据表名[列表形式]
books = workbook.sheetnames
for page in books:
self.fashe(f"开始处理{page}")
# 从文件中调取页面进行处理
sheet = workbook[f"{page}"]
# 获取文件最大列 转换成数字类型
max = int(sheet.dimensions[-2:])
self.fashe(f"最大列数为:{max}")
maxnum1 = max + 1
# 开始迭代式循环处理数据
for i in range(3, maxnum1):
# 判断G列是否有数据
if sheet[f'G{i}'].value is None:
self.fashe2(f"{page}{sheet[f'D{i}'].value}到检数据未填写请注意检查!")
# 计算BMI值 注意逻辑顺序 否则会异常崩溃 先筛选掉空值 与 未测 再进行判断 否则混入空值会崩溃
if type(sheet[f'M{i}'].value) == int or type(sheet[f'M{i}'].value) == float:
if float(sheet[f'M{i}'].value) > 150:
self.fashe2(f"{page}{sheet[f'D{i}'].value}体重数据{sheet[f'M{i}'].value}请注意查看!")
else:
sheet[f'N{i}'].value = bmi.BMI_result(sheet[f'M{i}'].value, sheet[f'L{i}'].value)
self.fashe(f"{page}{sheet[f'D{i}'].value}BMI为{sheet[f'N{i}'].value}")
else:
pass
# 计算BMI修正值
if type(sheet[f'N{i}'].value) == int or type(sheet[f'N{i}'].value) == float:
sheet[f'O{i}'].value = round(sheet[f'N{i}'].value, 2)
self.fashe(f"{page}{sheet[f'D{i}'].value}BMI修正值为{sheet[f'O{i}'].value}")
else:
pass
# 计算BMI对比结果
if type(sheet[f'O{i}'].value) == int or type(sheet[f'O{i}'].value) == float:
if sheet[f'E{i}'].value == '男':
sheet[f'P{i}'].value = bmi.hight_Bmi_Man(sheet[f'H{i}'].value, sheet[f'O{i}'].value)
self.fashe(f"{sheet[f'D{i}'].value}性别男体重对比结果为:{sheet[f'P{i}'].value}")
else:
sheet[f'P{i}'].value = bmi.hight_Bmi_Woman(sheet[f'H{i}'].value, sheet[f'O{i}'].value)
self.fashe(f"{sheet[f'D{i}'].value}性别女体重对比结果为:{sheet[f'P{i}'].value}")
else:
pass
# 计算身高对比结果
if type(sheet[f'L{i}'].value) == int or type(sheet[f'L{i}'].value) == float:
if float(sheet[f'L{i}'].value) > 3:
self.fashe2(f"{page}{sheet[f'D{i}'].value}身高{float(sheet[f'L{i}'].value)}数据异常请注意查看!")
else:
if sheet[f'E{i}'].value == '男':
sheet[f'Q{i}'].value = bmi.hight_man(sheet[f'H{i}'].value, sheet[f'L{i}'].value)
self.fashe(f"{page}{sheet[f'D{i}'].value}性别男身高对比结果为:{sheet[f'Q{i}'].value}")
else:
sheet[f'Q{i}'].value = bmi.hight_woman(sheet[f'H{i}'].value, sheet[f'L{i}'].value)
self.fashe(f"{page}{sheet[f'D{i}'].value}性别女身高对比结果为:{sheet[f'Q{i}'].value}")
else:
pass
# 视力结果计算
if type(sheet[f'AA{i}'].value) == int or type(sheet[f'AA{i}'].value) == float or type(sheet[f'AB{i}'].value) == int or type(sheet[f'AB{i}'].value) == float:
# 数字化两个参数
a = float(sheet[f'AA{i}'].value)
b = float(sheet[f'AB{i}'].value)
if self.cn.checkBox.isChecked() == True:
if a > b:
sheet[f'AD{i}'].value = bmi.eyesight1(b)
self.fashe(f"{sheet[f'D{i}'].value}视力对比结果为:{sheet[f'AD{i}'].value}")
if a < b:
sheet[f'AD{i}'].value = bmi.eyesight1(a)
self.fashe(f"{sheet[f'D{i}'].value}视力对比结果为:{sheet[f'AD{i}'].value}")
if a == b:
sheet[f'AD{i}'].value = bmi.eyesight1(a)
self.fashe(f"{sheet[f'D{i}'].value}视力对比结果为:{sheet[f'AD{i}'].value}")
else:
if a > b:
sheet[f'AD{i}'].value = bmi.eyesight3(b)
self.fashe(f"{sheet[f'D{i}'].value}视力对比结果为:{sheet[f'AD{i}'].value}")
if a < b:
sheet[f'AD{i}'].value = bmi.eyesight3(a)
self.fashe(f"{sheet[f'D{i}'].value}视力对比结果为:{sheet[f'AD{i}'].value}")
if a == b:
sheet[f'AD{i}'].value = bmi.eyesight3(a)
self.fashe(f"{sheet[f'D{i}'].value}视力对比结果为:{sheet[f'AD{i}'].value}")
else:
pass
workbook.save(f'./report/{fileName}体检数据明细表.xlsx')
return self.fashe('计算完毕,可以进行下一步')
def calculate_thread(self):
t = threading.Thread(target=self.calculate, daemon=True)
t.start()
def wirt_File(self):
"""
根据计算出来的数据生成卫健委要求的附件1-4
"""
# 读取体检数据文件
workbook = openpyxl.load_workbook(f"./report/{fileName}体检数据明细表.xlsx")
# 获取体检数据表名[列表形式]
books = workbook.sheetnames
for page in books:
self.cn.Qtext_B(f"开始处理{page}数据")
# 从文件中调取页面进行处理
sheet = workbook[f"{page}"]
# 体检总人数
zrs = bmi.count(sheet["D"])
self.cn.Qtext_B(f"{page}体检总人数:{zrs}")
# 实际体检到检人数
djrs = bmi.daojiancount(sheet["G"])
self.cn.Qtext_B(f"{page}实际到检人数:{djrs}")
# 班级男性人数
gender = bmi.gender(sheet["E"])
man = gender[0]
woman = gender[1]
self.cn.Qtext_B(f"{page}男性人数{man}女性人数{woman}")
# 心脏异常人数
heart = bmi.count(sheet["I"])
self.cn.Qtext_B(f"{page}心脏 异常人数{heart}")
# 肺部异常人数
lung = bmi.count(sheet["J"])
self.cn.Qtext_B(f"{page}肺部 异常人数{lung}")
# 肝/脾异常人数
liver_and_spleen = bmi.count(sheet["K"])
self.cn.Qtext_B(f"{page}肝/脾 异常人数{lung}")
# 头部异常人数
head = bmi.count(sheet["R"])
self.cn.Qtext_B(f"{page}头部 异常人数{head}")
# 颈异常人数
neck = bmi.count(sheet["S"])
self.cn.Qtext_B(f"{page}颈部 异常人数{neck}")
# 胸部异常人数
chest = bmi.count(sheet["T"])
self.cn.Qtext_B(f"{page}胸部 异常人数{chest}")
# 脊柱异常人数
spine = bmi.count(sheet["U"])
self.cn.Qtext_B(f"{page}脊柱 异常人数{spine}")
# 四肢异常人数
all_fours = bmi.count(sheet["V"])
self.cn.Qtext_B(f"{page}四肢 异常人数{all_fours}")
# 皮肤异常人数
skin = bmi.count(sheet["W"])
self.cn.Qtext_B(f"{page}皮肤 异常人数{skin}")
# 淋巴结异常人数
lymph_gland = bmi.count(sheet["X"])
self.cn.Qtext_B(f"{page}淋巴结 异常人数{lymph_gland}")
# 结膜异常人数
conjunctiva = bmi.count(sheet["AM"])
self.cn.Qtext_B(f"{page}结膜 异常人数{conjunctiva}")
# 沙眼异常人数
trachoma = bmi.count(sheet["AN"])
self.cn.Qtext_B(f"{page}沙眼 异常人数{trachoma}")
# 耳异常人数
ear = bmi.count(sheet["AO"])
self.cn.Qtext_B(f"{page}耳 异常人数{ear}")
# 鼻异常人数
nose = bmi.count(sheet["AP"])
self.cn.Qtext_B(f"{page}鼻 异常人数{nose}")
# 喉/扁桃体异常人数
tonsil = bmi.count(sheet["AQ"])
self.cn.Qtext_B(f"{page}喉/扁桃体 异常人数{tonsil}")
# 龋齿异常人数
decayed_tooth = bmi.count(sheet["AR"])
self.cn.Qtext_B(f"{page}龋齿 异常人数{decayed_tooth}")
# 牙周异常人数
periodontal = bmi.count(sheet["AS"])
self.cn.Qtext_B(f"{page}牙周 异常人数{periodontal}")
# 视力判定统计
shili = bmi.shilicount(sheet["AD"])
self.cn.Qtext_B(f"{page}轻度视力{shili[0]},中度视力{shili[1]},重度视力{shili[2]}")
# 未到学生人数
Nopepo = int(zrs) - int(djrs)
# 检查率
# Jcl = "{:.2%}".format(float(djrs) / float(zrs))
Jcl = bmi.baifenbi(float(djrs), float(zrs))
if Jcl == 0:
self.cn.Qtext_C(f'{page}的到检人数{float(djrs)}异常以及{float(zrs)}异常请注意查看!')
# 附件一生成
bmi.wirte_f1(page, zrs, Nopepo, djrs, Jcl)
# 附件二生成
f2 = [page,
djrs,
heart,
bmi.baifenbi(heart, djrs),
lung,
bmi.baifenbi(lung, djrs),
liver_and_spleen,
bmi.baifenbi(liver_and_spleen, djrs),
head,
bmi.baifenbi(head, djrs),
neck,
bmi.baifenbi(neck, djrs),
chest,
bmi.baifenbi(chest, djrs),
spine,
bmi.baifenbi(spine, djrs),
all_fours,
bmi.baifenbi(all_fours, djrs),
skin,
bmi.baifenbi(skin, djrs),
lymph_gland,
bmi.baifenbi(lymph_gland, djrs)
]
bmi.wirte_f2(f2)
# 附件三生成
f3 = [page,
djrs,
trachoma,
bmi.baifenbi(trachoma, djrs),
periodontal,
bmi.baifenbi(periodontal, djrs),
nose,
bmi.baifenbi(nose, djrs),
tonsil,
bmi.baifenbi(tonsil, djrs),
shili[0],
bmi.baifenbi(shili[0], djrs),
shili[1],
bmi.baifenbi(shili[1], djrs),
shili[2],
bmi.baifenbi(shili[2], djrs),
ear,
bmi.baifenbi(ear, djrs),
decayed_tooth,
bmi.baifenbi(decayed_tooth, djrs)
]
bmi.wirte_f3(f3)
# 计算 BMI对比结果
shengzhang = bmi.shengzhang(zip(sheet["E"], sheet["P"]))
# 计算 身高对比结果
shengao = bmi.shengaojieguo(zip(sheet["E"], sheet["Q"]))
# 数据汇总 附件四生成
huizong = [page,
zrs,
djrs,
zrs - djrs,
man,
woman,
shengzhang[0],
shengzhang[1],