python编写的用于体检数据的自动计算 比对 出报告的程序

  半路出家杀入医疗行业,各种心酸不足为外人道,过年期间,横竖无聊,就想着可不可以搞一个体检数据的自动计算 比对 汇总 出报告这们个东西,让我可以当甩手掌柜。

思路:
电子化数据表单数据 运用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],
               
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值