wumu
2024-05-14 0e5bcdb2d4d2e87e3624f14e5cc58a1d03de99fc
internal_system_v1/converinfo2.cpp
@@ -1,12 +1,25 @@
#include "converinfo2.h"
#include "ui_converinfo2.h"
#include <QDebug>
#include <QDirIterator>
#include <QFileDialog>
#include <QSqlQuery>
#include <QSqlRecord>
#pragma execution_character_set("utf-8")
ConverInfo2::ConverInfo2(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ConverInfo2)
{
    ui->setupUi(this);
    initUi();
    m_menu = nullptr;
    //initUi();
    readInfo(); // 加载表格
    addMenu(); // 增加菜单
    // 自适应处理
    ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
}
ConverInfo2::~ConverInfo2()
@@ -19,8 +32,1561 @@
    // 查询表中所有的公司名字,放到树形菜单中
    QStringList comInfo;
    comInfo<<"码蚁软件"<<"C++课程体系"<<"嵌入式课程体系";
    ui->treeWidget->addTopLevelItem(new QTreeWidgetItem(comInfo));
    // 设置菜单:添加单位、删除单位
    QTreeWidgetItem *top = new QTreeWidgetItem(ui->treeWidget,comInfo);
    ui->treeWidget->addTopLevelItem(top);
    ui->treeWidget->expandAll();
    QTreeWidgetItem *it1 = new QTreeWidgetItem(top);
    it1->setText(0,"开发部1");
    QTreeWidgetItem *it2 = new QTreeWidgetItem(top);
    it2->setText(0,"开发部2");
    QTreeWidgetItem *it3 = new QTreeWidgetItem(top);
    it3->setText(0,"开发部3");
    QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
    top1->setText(0,"码蚁集团");
    QTreeWidgetItem *it4 = new QTreeWidgetItem(top1);
    it4->setText(0,"开发部4");
    top1->setCheckState(0,Qt::Checked);
    it4->setCheckState(0,Qt::Checked);
    // 单位内容修改
    // 复选框状态处理
    connect(ui->treeWidget,QOverload<QTreeWidgetItem*,int>::of(QTreeWidget::itemClicked),this,[=](QTreeWidgetItem* it,int index){
        qDebug()<<it<<index;
        if(it == top1){
            qDebug()<<"点击了码蚁集团";
            for(int i=0;i<top1->childCount();++i){
                top1->child(i)->setCheckState(0,top1->checkState(0));
            }
        }
    });
    // 设置菜单:添加单位、删除单位
    m_menu = new QMenu(this);
    m_menu->addAction("删除");
    m_menu->addAction("增加");
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showMenu(QPoint)));
    connect(m_menu->actions().at(0),SIGNAL(triggered(bool)),this,SLOT(deleteInfo()));
    connect(m_menu->actions().at(1),SIGNAL(triggered(bool)),this,SLOT(addInfo()));
            // 单位内容修改
    // 右边可编辑内容
    //ui->scrollArea->setWidget(ui->frame);
}
void ConverInfo2::showMenu(QPoint p)
{
    QTreeWidgetItem * item = ui->treeWidget->itemAt(p);
    if(item==nullptr)return;
    m_curItem = item;
    qDebug()<<"当前节点:"<<m_curItem->text(0);
    m_menu->exec(QCursor::pos());
}
void ConverInfo2::addInfo()
{
    if(m_curItem==nullptr)return;
    qDebug()<<"添加公司信息,在节点:"<<m_curItem->text(0);
}
void ConverInfo2::deleteInfo()
{
    if(m_curItem==nullptr)return;
    qDebug()<<"删除公司信息,节点:"<<m_curItem->text(0);
}
void ConverInfo2::on_treeWidget_doubleClicked(const QModelIndex &index)
{
    QString name = index.model()->data(index).toString();
    qDebug()<<"双击"<<index<<name;
    if(name.contains("(本级)")){
        QStringList sps = name.split("(本级)");
        name = sps.at(0);
    }else if(name.contains("(汇总)")){
        name = name.split("(汇总)").at(0);
    }
    ComInfo curCominfo = m_nameAndComInfos[name];
    // 一、单位基本情况
    ui->lineEdit_creditCode->setText(curCominfo.creditCode);
    ui->lineEdit_name->setText(QString::fromLocal8Bit( curCominfo.name));
    qDebug()<<"name:"<<QString::fromLocal8Bit( curCominfo.name)<<QByteArray(curCominfo.name);
    ui->comboBox_comType->setCurrentText(QString::fromLocal8Bit(curCominfo.comType));
    ui->lineEdit_business->setText(QString::fromLocal8Bit(curCominfo.business));
    ui->lineEdit_businessCode->setText(curCominfo.businessCode);
    ui->lineEdit_addr->setText(QString::fromLocal8Bit(curCominfo.addr));
    ui->lineEdit_areaCode->setText(curCominfo.areaCode);
    ui->lineEdit_townCode->setText(curCominfo.townCode);
    ui->comboBox_scale->setCurrentText(QString::fromLocal8Bit(curCominfo.scale));
    ui->lineEdit_people->setText(QString::number(curCominfo.people));
    ui->lineEdit_representative->setText(QString::fromLocal8Bit(curCominfo.representative));
    ui->comboBox_standardType->setCurrentText(QString::fromLocal8Bit(curCominfo.standardType));
    ui->lineEdit_trunkCode->setText(curCominfo.trunkCode);
    ui->lineEdit_fixedTel->setText(curCominfo.fixedTel);
    ui->lineEdit_postCode->setText(curCominfo.postCode);
    ui->lineEdit_email->setText(curCominfo.email);
    ui->lineEdit_webSite->setText(curCominfo.webSite);
    // 二、单位组织结构情况
    ui->comboBox_hasUpLegal->setCurrentText(QString::fromLocal8Bit(curCominfo.hasUpLegal));
    ui->lineEdit_upCreditCode->setText(QString::fromLocal8Bit(curCominfo.upCreditCode));
    ui->lineEdit_oldCreditCode->setText(curCominfo.oldCreditCode);
    ui->lineEdit_upName->setText(QString::fromLocal8Bit(curCominfo.upName));
    // 三、总审计师与内审机构基本情况
    ui->comboBox_hasChiefDesigner->setCurrentText(QString::fromLocal8Bit(curCominfo.hasChiefDesigner));
    ui->comboBox_ChiefDesignerLevel->setCurrentText(QString::fromLocal8Bit(curCominfo.ChiefDesignerLevel));
    ui->comboBox_employmentMode->setCurrentText(QString::fromLocal8Bit(curCominfo.employmentMode));
    ui->comboBox_hasSetIntervalAudit->setCurrentText(QString::fromLocal8Bit(curCominfo.hasSetIntervalAudit));
    ui->lineEdit_internalName->setText(QString::fromLocal8Bit(curCominfo.internalName));
    ui->comboBox_leadingOrganization->setCurrentText(QString::fromLocal8Bit(curCominfo.leadingOrganization));
    ui->comboBox_hasSetSeparateIA->setCurrentText(QString::fromLocal8Bit(curCominfo.hasSetSeparateIA));
    ui->checkBox_financeDepartment->setChecked(curCominfo.financeDepartment);
    ui->checkBox_legalDepartment->setChecked(curCominfo.legalDepartment);
    ui->checkBox_internalConDepart->setChecked(curCominfo.internalConDepart);
    ui->checkBox_disceplineInDepart->setChecked(curCominfo.disceplineInDepart);
    ui->checkBox_otherDepart->setChecked(curCominfo.otherDepart);
    ui->comboBox_intavalAuditLeval->setCurrentText(QString::fromLocal8Bit(curCominfo.intavalAuditLeval));
    // 四、内审人员配备基本情况
    ui->lineEdit_organazationNum->setText(QString::number(curCominfo.organazationNum));
    ui->lineEdit_realNum->setText(QString::number(curCominfo.realNum));
    ui->lineEdit_professionalNum->setText(QString::number(curCominfo.professionalNum));
    ui->lineEdit_CIANum->setText(QString::number(curCominfo.CIANum));
    ui->lineEdit_masterNum->setText(QString::number(curCominfo.masterNum));
    ui->lineEdit_undergraduatesNum->setText(QString::number(curCominfo.undergraduatesNum));
    ui->lineEdit_juniorNum->setText(QString::number(curCominfo.juniorNum));
    ui->lineEdit_seniorNum->setText(QString::number(curCominfo.seniorNum));
    ui->lineEdit_intermediateNum->setText(QString::number(curCominfo.intermediateNum));
    ui->lineEdit_primaryNum->setText(QString::number(curCominfo.primaryNum));
    ui->lineEdit_noTitleNum->setText(QString::number(curCominfo.noTitleNum));
    ui->lineEdit_upFiftyOldNum->setText(QString::number(curCominfo.upFiftyOldNum));
    ui->lineEdit_upThirtyOldNum->setText(QString::number(curCominfo.upThirtyOldNum));
    ui->lineEdit_downThirtyOldNum->setText(QString::number(curCominfo.downThirtyOldNum));
    ui->lineEdit_auditNum->setText(QString::number(curCominfo.auditNum));
    ui->lineEdit_accountingNum->setText(QString::number(curCominfo.accountingNum));
    ui->lineEdit_economyNum->setText(QString::number(curCominfo.economyNum));
    ui->lineEdit_lawNum->setText(QString::number(curCominfo.lawNum));
    ui->lineEdit_managerNum->setText(QString::number(curCominfo.managerNum));
    ui->lineEdit_itNum->setText(QString::number(curCominfo.itNum));
    ui->lineEdit_engineeringNum->setText(QString::number(curCominfo.engineeringNum));
    ui->lineEdit_otherNum->setText(QString::number(curCominfo.otherNum));
    // 其他的4个信息
    ui->lineEdit_statisticalConOfficer->setText(QString::fromLocal8Bit(curCominfo.statisticalConOfficer));
    ui->lineEdit_personFilling->setText(QString::fromLocal8Bit(curCominfo.personFilling));
    ui->lineEdit_officerTel->setText(QString::fromLocal8Bit(curCominfo.officerTel));
    ui->lineEdit_fillingDateTime->setText(QString::fromLocal8Bit(curCominfo.fillingDateTime));
}
void ConverInfo2::readInfo()
{
//    QXlsx::Document doc("./debug/Data/test.xlsx");
//    QString cc = doc.read("A1").toString();
//    qDebug()<<"cc"<<cc;
//    ui->label_creditCode->setText(cc);
    extern QString g_dataRootPath;
    QString dirPath = "./debug/Data";
    QString dirPathRelease = "./release/Data";
    QString dirPathData = "./Data";
    QDir dir(dirPathData);
    if(dir.exists()){
        dirPath = dirPathData; // 存在则覆盖
    }
    QDir dirRe(dirPathRelease);
    if(dirRe.exists()){
        dirPath = dirPathRelease;
    }
    g_dataRootPath = dirPath; // 将根目录保存起来
    QStringList list;
    QDirIterator it(dirPath, {"*.xls","*.xlsx"}, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
    while(it.hasNext())
    {
        it.next();
        list.append(it.fileInfo().absoluteFilePath());
    }
    foreach(QString str, list)
    {
        qDebug() << str;
        int index = str.indexOf("内审统01表");
        qDebug()<<"index:"<<index;
        if(index > 0){
            QAxObject excel("ket.Application");
            if(!excel.setControl("ket"
                                 ".Application")){  // windows内核
                excel.setControl("Excel.Application"); // wps内核
            }
            excel.setProperty("Visible",false);
            excel.setProperty("DisplayAlerts",false);
            qDebug()<<"open:"<<str;
            qDebug()<<"excel:"<<excel.className();
            QAxObject * wbs = excel.querySubObject("WorkBooks");
            qDebug()<<"wbs:"<<wbs->className();
            QAxObject * wb = wbs->querySubObject("Open(QString&)",str);
            //QAxObject* pWorkBook = excel.querySubObject("ActiveWorkBook");
            //QAxObject* pWorkSheets = pWorkBook->querySubObject("Sheets");//获取工作表
            //QAxObject * shs = wb->querySubObject("Sheets"); // WorkSheets 也可以
            QAxObject * shs = wb->querySubObject("WorkSheets"); // WorkSheets 也可以
//            // 指定单元格拿
//            QAxObject *cell = shs->querySubObject("Cells(int, int)",82,1);
//            qDebug()<<"Cells:82-0:"<<shs->querySubObject("Cells(int, int)",82,0)->dynamicCall("Value()").toString();
//            qDebug()<<"Cells:82-1:"<<cell->dynamicCall("Value()").toString();
            int cnt = shs->property("Count").toInt();
            qDebug()<<"cnt="<<cnt;
            for(int i=0;i<cnt;++i){
                QAxObject * sheet = shs->querySubObject("Item(int)", i+1);
                QString sheetName = sheet->property("Name").toString();
                qDebug()<<"sh name:"<<sheetName;
                QAxObject *usedRange = sheet->querySubObject("UsedRange");
                int rows = usedRange->querySubObject("Rows")->property("Count").toInt();
                int columns = usedRange->querySubObject("Columns")->property("Count").toInt();
                qDebug()<<"r--c:"<<rows<<columns;
                QVariant  val = usedRange->dynamicCall("Value"); // 拿到二维表格
                QVariantList valRows = val.toList();
                // 遍历每一项
//                for(int i=0;i<rows;++i){
//                    QVariantList valrow = valRows[i].toList();
//                    for(int j=0;j<columns;++j){
//                        QVariant valData = valrow[j];
//                        if(valData.isValid()){
//                            qDebug()<<"val:"<< i<< j << valData;
//                        }
//                    }
//                }
                // 实例化结构体,然后挨个赋值
                ComInfo curComInfo;
                // 统一信用代码
                QVariant uniCode = valRows[9].toList().at(3);
                if(uniCode.isValid()){
                    ui->label_creditCode->setText(uniCode.toString());
                    strcpy(curComInfo.creditCode,uniCode.toString().toLocal8Bit().data());
                }
                // 单位名称
                QVariant name = valRows[9].toList().at(8);
                if(name.isValid()){
                    ui->label_name->setText(name.toString());
                    //QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
                    //top1->setText(0,name.toString());
                    strcpy(curComInfo.name,name.toString().toLocal8Bit().data());
                }else{
                    ui->label_name->setText("");
                }
                // 机构类型
                QVariant comType = valRows[12].toList().at(3);
                if(comType.isValid()){
                    ui->label_comType->setText(comType.toString());
                    strcpy(curComInfo.comType,comType.toString().toLocal8Bit().data());
                }else{
                    ui->label_comType->setText("");
                }
                // 主要业务活动
                QString business;
                QVariant first = valRows[18].toList().at(2);
                if(first.isValid()){
                    business.append(first.toString());
                }
                QVariant sec = valRows[18].toList().at(5);
                if(sec.isValid()){
                    business += "、";
                    business.append(sec.toString());
                }
                QVariant third = valRows[18].toList().at(8);
                if(third.isValid()){
                    business += "、";
                    business.append(third.toString());
                }
                if(business.size() > 0){
                    ui->label_business->setText(business);
                    ui->label_business->setToolTip(business);
                    strcpy(curComInfo.business,business.toLocal8Bit().data());
                }else{
                    ui->label_business->setText("");
                }
                // 业务代码
                QVariant busCode = valRows[19].toList().at(4);
                if(busCode.isValid()){
                    ui->label_businessCode->setText(busCode.toString());
                    strcpy(curComInfo.businessCode,busCode.toString().toLocal8Bit().data());
                }else{
                    ui->label_businessCode->setText("");
                }
                // 注册地址
                QString addr="";
                QVariant province = valRows[21].toList().at(1); // 省份
                QVariant city = valRows[21].toList().at(4); // 城市
                QVariant district = valRows[21].toList().at(7); // 管辖区
                QVariant village = valRows[22].toList().at(2); // 乡镇
                QVariant street = valRows[22].toList().at(4); // 街道
                QVariant Sub = valRows[23].toList().at(2); // 街道办事处
                QVariant committee = valRows[25].toList().at(3); // 居委会
                //qDebug()<<province<<city<<district<<village<<street<<Sub<<committee;
                if(province.isValid()) addr += province.toString();
                if(city.isValid()) addr += city.toString();
                if(district.isValid()) addr += district.toString();
                if(village.isValid()) addr += village.toString();
                if(street.isValid()) addr += street.toString();
                if(Sub.isValid()) addr += Sub.toString();
                if(committee.isValid()) addr += committee.toString();
                if(addr.size()>10){
                    ui->label_addr->setText(addr);
                    strcpy(curComInfo.addr,addr.toLocal8Bit().data());
                }else{
                    ui->label_addr->setText("");
                }
                // 区域代码
                QVariant areaCode = valRows[24].toList().at(2);
                if(areaCode.isValid()){
                    ui->label_areaCode->setText(areaCode.toString());
                    strcpy(curComInfo.areaCode,areaCode.toString().toLocal8Bit().data());
                }else{
                    ui->label_areaCode->setText("");
                }
                // 城乡代码
                QVariant townCode = valRows[24].toList().at(6);
                if(townCode.isValid()) {
                    ui->label_townCode->setText(townCode.toString());
                    strcpy(curComInfo.townCode,townCode.toString().toLocal8Bit().data());
                }else{
                    ui->label_townCode->setText("");
                }
                // 单位规模
                QVariant scale = valRows[25].toList().at(3);
                if(scale.isValid()){
                    ui->label_scale->setText(scale.toString());
                    strcpy(curComInfo.scale,scale.toString().toLocal8Bit().data());
                }else{
                    ui->label_scale->setText("");
                }
                // 从业人数
                QVariant people = valRows[26].toList().at(6);
                if(people.isValid()) {
                    ui->label_people->setText(people.toString());
                    //strcpy(curComInfo.people,people.toString().toLocal8Bit().data());
                    curComInfo.people = people.toInt();
                }else{
                    ui->label_people->setText("");
                }
                // 法人
                QVariant representative = valRows[27].toList().at(4);
                if(representative.isValid()) {
                    ui->label_representative->setText(representative.toString());
                    strcpy(curComInfo.representative,representative.toString().toLocal8Bit().data());
                }else{
                    ui->label_representative->setText("");
                }
                // 会计标准类别 standardType
                QVariant standardType = valRows[27].toList().at(8);
                if(standardType.isValid()){
                    ui->label_standardType->setText(standardType.toString());
                    strcpy(curComInfo.standardType,standardType.toString().toLocal8Bit());
                }else{
                    ui->label_standardType->setText("");
                }
                // 长途区号
                QVariant trunkCode = valRows[31].toList().at(2);
                if(trunkCode.isValid()){
                    ui->label_trunkCode->setText(trunkCode.toString());
                    strcpy(curComInfo.trunkCode,trunkCode.toString().toLocal8Bit().data());
                }else{
                    ui->label_trunkCode->setText("");
                }
                // 固定电话
                QVariant fixedTel = valRows[32].toList().at(2);
                if(fixedTel.isValid()) {
                    ui->label_fixedTel->setText(fixedTel.toString());
                    strcpy(curComInfo.fixedTel,fixedTel.toString().toLocal8Bit().data());
                }else{
                    ui->label_fixedTel->setText("");
                }
                // 邮政编码
                QVariant postCode = valRows[33].toList().at(2);
                if(postCode.isValid()){
                    ui->label_postCode->setText(postCode.toString());
                    strcpy(curComInfo.postCode,postCode.toString().toLocal8Bit().data());
                }else{
                    ui->label_postCode->setText("");
                }
                // 电子邮箱
                QVariant email = valRows[30].toList().at(5);
                if(email.isValid()) {
                    ui->label_email->setText(email.toString());
                    strcpy(curComInfo.email,email.toString().toLocal8Bit().data());
                }else{
                    ui->label_email->setText("");
                }
                // 网址
                QVariant webSite = valRows[32].toList().at(5);
                if(webSite.isValid()) {
                    ui->label_webSite->setText(webSite.toString());
                    strcpy(curComInfo.webSite,webSite.toString().toLocal8Bit().data());
                }else{
                    ui->label_webSite->setText("");
                }
                // 二、单位组织结构情况
                // 是否有上一级法人
                QVariant hasUpLegal = valRows[35].toList().at(4);
                if(hasUpLegal.isValid()){
                    strcpy(curComInfo.hasUpLegal,hasUpLegal.toString().toLocal8Bit().data());
                    qDebug()<<"has up legal"<<hasUpLegal;
                }
                // 上级法人单位统一社会信用代码
                QVariant upCreditCode = valRows[36].toList().at(7);
                if(upCreditCode.isValid()){
                    strcpy(curComInfo.upCreditCode,upCreditCode.toString().toLocal8Bit().data());
                    qDebug()<<"upCreditCode"<<upCreditCode;
                }else {
                    qDebug()<<"upCreditCode fail"<<name;
                }
                // 原组织机构代码
                QVariant oldCreditCode = valRows[37].toList().at(7);
                if(oldCreditCode.isValid()){
                    strcpy(curComInfo.oldCreditCode,oldCreditCode.toString().toLocal8Bit().data());
                    qDebug()<<"oldCreditCode"<<oldCreditCode;
                }
                // 上一级单位详细名称
                QVariant upName = valRows[38].toList().at(7);
                if(upName.isValid()){
                    strcpy(curComInfo.upName,upName.toString().toLocal8Bit().data());
                    qDebug()<<"upName"<<upName;
                }
                // 总审计师与内审机构基本情况
                // 是否设置总审计师
                QVariant hasChiefDesigner = valRows[40].toList().at(4);
                if(hasChiefDesigner.isValid()){
                    strcpy(curComInfo.hasChiefDesigner,hasChiefDesigner.toString().toLocal8Bit().data());
                    qDebug()<<"hasChiefDesigner"<<hasChiefDesigner;
                }
                // 总审计师职位层级
                QVariant ChiefDesignerLevel = valRows[41].toList().at(4);
                if(ChiefDesignerLevel.isValid()){
                    strcpy(curComInfo.ChiefDesignerLevel,ChiefDesignerLevel.toString().toLocal8Bit().data());
                    qDebug()<<"ChiefDesignerLevel"<<ChiefDesignerLevel;
                }
                // 总审计师任职方式
                QVariant employmentMode = valRows[44].toList().at(4);
                if(employmentMode.isValid()){
                    strcpy(curComInfo.employmentMode,employmentMode.toString().toLocal8Bit().data());
                    qDebug()<<"employmentMode"<<employmentMode;
                }
                // 是否设置内审机构
                QVariant hasSetIntervalAudit = valRows[47].toList().at(4);
                if(hasSetIntervalAudit.isValid()){
                    strcpy(curComInfo.hasSetIntervalAudit,hasSetIntervalAudit.toString().toLocal8Bit().data());
                    qDebug()<<"hasSetIntervalAudit"<<hasSetIntervalAudit;
                }
                // 内审机构名称
                QVariant internalName = valRows[48].toList().at(4);
                if(internalName.isValid()){
                    strcpy(curComInfo.internalName,internalName.toString().toLocal8Bit().data());
                    qDebug()<<"internalName"<<internalName;
                }
                // 内审工作的领导机构
                QVariant leadingOrganization = valRows[49].toList().at(4);
                if(leadingOrganization.isValid()){
                    strcpy(curComInfo.leadingOrganization,leadingOrganization.toString().toLocal8Bit().data());
                    qDebug()<<"leadingOrganization"<<leadingOrganization;
                }
                // 是否独立设置内审机构
                QVariant hasSetSeparateIA = valRows[53].toList().at(4);
                if(hasSetSeparateIA.isValid()){
                    strcpy(curComInfo.hasSetSeparateIA,hasSetSeparateIA.toString().toLocal8Bit().data());
                    qDebug()<<"hasSetSeparateIA"<<hasSetSeparateIA;
                }
                // 合并设置 财务部门   复选框
                QVariant financeDepartment = valRows[55].toList().at(1);
                if(financeDepartment.isValid()){
                    //strcpy(curComInfo.financeDepartment,financeDepartment.toString().toLocal8Bit().data());
                    curComInfo.financeDepartment = financeDepartment.toBool();
                    qDebug()<<"financeDepartment"<<financeDepartment;
                }
                // 法务部门、内部控制部门、纪检部门、其他部门
                // 内审机构层级
                QVariant intavalAuditLeval = valRows[56].toList().at(4);
                if(intavalAuditLeval.isValid()){
                    strcpy(curComInfo.intavalAuditLeval,intavalAuditLeval.toString().toLocal8Bit().data());
                    qDebug()<<"intavalAuditLeval"<<intavalAuditLeval;
                }
                // 四、内审人员配备基本情况
                // 编制数
                QVariant organazationNum = valRows[56].toList().at(4);
                if(organazationNum.isValid()){
                    curComInfo.organazationNum = organazationNum.toInt();
                    qDebug()<<"organazationNum"<<organazationNum;
                }
                // 实有人员数
                QVariant realNum = valRows[56].toList().at(4);
                if(realNum.isValid()){
                    curComInfo.realNum = realNum.toInt();
                    qDebug()<<"realNum"<<realNum;
                }
                // 专职人员数
                QVariant professionalNum = valRows[56].toList().at(4);
                if(professionalNum.isValid()){
                    curComInfo.professionalNum = professionalNum.toInt();
                    qDebug()<<"professionalNum"<<professionalNum;
                }
                // 拥有CIA人员数
                QVariant CIANum = valRows[56].toList().at(4);
                if(CIANum.isValid()){
                    curComInfo.CIANum = CIANum.toInt();
                    qDebug()<<"CIANum"<<CIANum;
                }
                // 学历:硕士及以上 人员数
                QVariant masterNum = valRows[56].toList().at(4);
                if(masterNum.isValid()){
                    curComInfo.masterNum = masterNum.toInt();
                    qDebug()<<"masterNum"<<masterNum;
                }
                // 大学本科
                QVariant undergraduatesNum = valRows[56].toList().at(4);
                if(undergraduatesNum.isValid()){
                    curComInfo.undergraduatesNum = undergraduatesNum.toInt();
                    qDebug()<<"undergraduatesNum"<<undergraduatesNum;
                }
                // 专科及以下
                QVariant juniorNum = valRows[56].toList().at(4);
                if(juniorNum.isValid()){
                    curComInfo.juniorNum = juniorNum.toInt();
                    qDebug()<<"juniorNum"<<juniorNum;
                }
                // 职称 高级职称
                QVariant seniorNum = valRows[56].toList().at(4);
                if(seniorNum.isValid()){
                    curComInfo.seniorNum = seniorNum.toInt();
                    qDebug()<<"seniorNum"<<seniorNum;
                }
                // 中级职称
                QVariant intermediateNum = valRows[56].toList().at(4);
                if(intermediateNum.isValid()){
                    curComInfo.intermediateNum = intermediateNum.toInt();
                    qDebug()<<"intermediateNum"<<intermediateNum;
                }
                // 初级职称
                QVariant primaryNum = valRows[56].toList().at(4);
                if(primaryNum.isValid()){
                    curComInfo.primaryNum = primaryNum.toInt();
                    qDebug()<<"primaryNum"<<primaryNum;
                }
                // 无职称
                QVariant noTitleNum = valRows[56].toList().at(4);
                if(noTitleNum.isValid()){
                    curComInfo.noTitleNum = noTitleNum.toInt();
                    qDebug()<<"noTitleNum"<<noTitleNum;
                }
                // 年龄结构 50岁以上
                QVariant upFiftyOldNum = valRows[56].toList().at(4);
                if(upFiftyOldNum.isValid()){
                    curComInfo.upFiftyOldNum = upFiftyOldNum.toInt();
                    qDebug()<<"upFiftyOldNum"<<upFiftyOldNum;
                }
                // 30-50岁
                QVariant upThirtyOldNum = valRows[56].toList().at(4);
                if(upThirtyOldNum.isValid()){
                    curComInfo.upThirtyOldNum = upThirtyOldNum.toInt();
                    qDebug()<<"upThirtyOldNum"<<upThirtyOldNum;
                }
                // 30岁以下
                QVariant downThirtyOldNum = valRows[56].toList().at(4);
                if(downThirtyOldNum.isValid()){
                    curComInfo.downThirtyOldNum = downThirtyOldNum.toInt();
                    qDebug()<<"downThirtyOldNum"<<downThirtyOldNum;
                }
                // 知识结构 审计
                QVariant auditNum = valRows[56].toList().at(4);
                if(auditNum.isValid()){
                    curComInfo.auditNum = auditNum.toInt();
                    qDebug()<<"auditNum"<<auditNum;
                }
                // 会计
                QVariant accountingNum = valRows[56].toList().at(4);
                if(accountingNum.isValid()){
                    curComInfo.accountingNum = accountingNum.toInt();
                    qDebug()<<"accountingNum"<<accountingNum;
                }
                // 经济
                QVariant economyNum = valRows[56].toList().at(4);
                if(economyNum.isValid()){
                    curComInfo.economyNum = economyNum.toInt();
                    qDebug()<<"economyNum"<<economyNum;
                }
                // 法律
                QVariant lawNum = valRows[56].toList().at(4);
                if(lawNum.isValid()){
                    curComInfo.lawNum = lawNum.toInt();
                    qDebug()<<"lawNum"<<lawNum;
                }
                // 管理
                QVariant managerNum = valRows[56].toList().at(4);
                if(managerNum.isValid()){
                    curComInfo.managerNum = managerNum.toInt();
                    qDebug()<<"managerNum"<<managerNum;
                }
                // 信息技术
                QVariant itNum = valRows[56].toList().at(4);
                if(itNum.isValid()){
                    curComInfo.itNum = itNum.toInt();
                    qDebug()<<"itNum"<<itNum;
                }
                // 工程
                QVariant engineeringNum = valRows[56].toList().at(4);
                if(engineeringNum.isValid()){
                    curComInfo.engineeringNum = engineeringNum.toInt();
                    qDebug()<<"engineeringNum"<<engineeringNum;
                }
                // 其他
                QVariant otherNum = valRows[56].toList().at(4);
                if(otherNum.isValid()){
                    curComInfo.otherNum = otherNum.toInt();
                    qDebug()<<"otherNum"<<otherNum;
                }
                // 后面的4个信息
                // 统计负责人
                QVariant statisticalConOfficer = valRows[81].toList().at(1);
                if(statisticalConOfficer.isValid()){
                    strcpy(curComInfo.statisticalConOfficer,statisticalConOfficer.toString().toLocal8Bit().data());
                    qDebug()<<"statisticalConOfficer"<<statisticalConOfficer;
                }else{
                    qDebug()<<"statisticalConOfficer fail:"<<name.toString();
                }
                // 填表人
                QVariant personFilling = valRows[81].toList().at(4);
                if(personFilling.isValid()){
                    strcpy(curComInfo.personFilling,personFilling.toString().toLocal8Bit().data());
                    qDebug()<<"personFilling"<<personFilling;
                }
                // 联系电话
                QVariant officerTel = valRows[82].toList().at(1);
                if(officerTel.isValid()){
                    strcpy(curComInfo.officerTel,officerTel.toString().toLocal8Bit().data());
                    qDebug()<<"officerTel"<<officerTel;
                }
                // 填报日期
                QVariant fillingDateTime = valRows[82].toList().at(4);
                if(fillingDateTime.isValid()){
                    strcpy(curComInfo.fillingDateTime,fillingDateTime.toString().toLocal8Bit().data());
                    qDebug()<<"fillingDateTime"<<fillingDateTime;
                }
                // 最后存到map中
                m_nameAndComInfos[name.toString()]=curComInfo;
                // 添加树形列表节点
                //addTreeWidgetNode(upName,name);
                if(upName.isValid()){
                    if(name.isValid()){
                        m_treeNodes[upName.toString()].push_back(name.toString());
                    }
                }else{
                    if(name.isValid()){
                        m_treeNodes[name.toString()].push_back(name.toString());
                    }
                }
            }
            wbs->dynamicCall("Close()");
            excel.dynamicCall("Quit(void)");
            qDebug()<<"单位信息数量:"<<m_nameAndComInfos.size();
        }
    }
    createTreeNode(); // 构建树形节点
//    QAxObject excel("./debug/Data/附件2_内审统01表_单位及内部审计机构基本情况表-1.301版(1).xls");
//    excel.setProperty("Visible",true);
//    excel.setProperty("DisplayAlerts",false);
}
void ConverInfo2::addMenu()
{
    // 设置菜单:添加单位、删除单位
    if(m_menu==nullptr){
        m_menu = new QMenu(this);
        qDebug()<<"init menu ok";
    }
    m_menu->addAction("删除");
    m_menu->addAction("增加");
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(showMenu(QPoint)));
    connect(m_menu->actions().at(0),SIGNAL(triggered(bool)),this,SLOT(deleteInfo()));
    connect(m_menu->actions().at(1),SIGNAL(triggered(bool)),this,SLOT(addInfo()));
}
void ConverInfo2::on_pushButton_commit_clicked()
{
    // 将编辑框的数据更新到map中和数据库中,后期可以更新到文件中
    // 单位基本情况
    QString creditCode = ui->lineEdit_creditCode->text();
    QString name = ui->lineEdit_name->text();
    QString comType = ui->comboBox_comType->currentText();
    QString business = ui->lineEdit_business->text();
    QString businessCode = ui->lineEdit_businessCode->text();
    QString addr = ui->lineEdit_addr->text();
    QString areaCode = ui->lineEdit_areaCode->text();
    QString townCode = ui->lineEdit_townCode->text();
    QString scale = ui->comboBox_scale->currentText();
    QString people = ui->lineEdit_people->text();
    QString representative = ui->lineEdit_representative->text();
    QString standardType = ui->comboBox_standardType->currentText();
    QString trunkCode = ui->lineEdit_trunkCode->text();
    QString fixedTel = ui->lineEdit_fixedTel->text();
    QString postCode = ui->lineEdit_postCode->text();
    QString email = ui->lineEdit_email->text();
    QString webSite = ui->lineEdit_webSite->text();
    // 单位组织结构情况
    QString hasUpLegal = ui->comboBox_hasUpLegal->currentText();
    QString upCreditCode = ui->lineEdit_upCreditCode->text();
    QString oldCreditCode = ui->lineEdit_oldCreditCode->text();
    QString upName = ui->lineEdit_upName->text();
    // 总审计师与内审机构基本情况
    QString hasChiefDesigner = ui->comboBox_hasChiefDesigner->currentText();
    QString ChiefDesignerLevel = ui->comboBox_ChiefDesignerLevel->currentText();
    QString employmentMode = ui->comboBox_employmentMode->currentText();
    QString hasSetIntervalAudit = ui->comboBox_hasSetIntervalAudit->currentText();
    QString internalName = ui->lineEdit_internalName->text();
    QString leadingOrganization = ui->comboBox_leadingOrganization->currentText();
    QString hasSetSeparateIA = ui->comboBox_hasSetSeparateIA->currentText();
    bool financeDepartment = ui->checkBox_financeDepartment->isChecked();
    bool legalDepartment = ui->checkBox_legalDepartment->isChecked();
    bool internalConDepart = ui->checkBox_internalConDepart->isChecked();
    bool disceplineInDepart = ui->checkBox_disceplineInDepart->isChecked();
    bool otherDepart = ui->checkBox_otherDepart->isChecked();
    QString intavalAuditLeval = ui->comboBox_intavalAuditLeval->currentText();
    // 四、内审人员配备基本情况
    int organazationNum = ui->lineEdit_organazationNum->text().toInt();
    int realNum = ui->lineEdit_realNum->text().toInt();
    int professionalNum = ui->lineEdit_professionalNum->text().toInt();
    int CIANum = ui->lineEdit_CIANum->text().toInt();
    int masterNum = ui->lineEdit_masterNum->text().toInt();
    int undergraduatesNum = ui->lineEdit_undergraduatesNum->text().toInt();
    int juniorNum = ui->lineEdit_juniorNum->text().toInt();
    int seniorNum = ui->lineEdit_seniorNum->text().toInt();
    int intermediateNum = ui->lineEdit_intermediateNum->text().toInt();
    int primaryNum = ui->lineEdit_primaryNum->text().toInt();
    int noTitleNum = ui->lineEdit_noTitleNum->text().toInt();
    int upFiftyOldNum = ui->lineEdit_upFiftyOldNum->text().toInt();
    int upThirtyOldNum = ui->lineEdit_upThirtyOldNum->text().toInt();
    int downThirtyOldNum = ui->lineEdit_downThirtyOldNum->text().toInt();
    int auditNum = ui->lineEdit_auditNum->text().toInt();
    int accountingNum = ui->lineEdit_accountingNum->text().toInt();
    int economyNum = ui->lineEdit_economyNum->text().toInt();
    int lawNum = ui->lineEdit_lawNum->text().toInt();
    int managerNum = ui->lineEdit_managerNum->text().toInt();
    int itNum = ui->lineEdit_itNum->text().toInt();
    int engineeringNum = ui->lineEdit_engineeringNum->text().toInt();
    int otherNum = ui->lineEdit_otherNum->text().toInt();
    // 后面的4个信息
    QString statisticalConOfficer = ui->lineEdit_statisticalConOfficer->text();
    QString personFilling = ui->lineEdit_personFilling->text();
    QString officerTel = ui->lineEdit_officerTel->text();
    QString fillingDateTime = ui->lineEdit_fillingDateTime->text();
    qDebug()<<"统计负责人"<<statisticalConOfficer;
    // 更新到map中
    if(m_nameAndComInfos.count(name)==0){
        // 添加到map中
        m_nameAndComInfos[name]=ComInfo();
        // 添加到右边树部件中
        QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
        top1->setText(0,name);
    }
    auto &curComInfo = m_nameAndComInfos[name];
    strcpy(curComInfo.creditCode,creditCode.toLocal8Bit().data());
    strcpy(curComInfo.name,name.toLocal8Bit().data());
    strcpy(curComInfo.comType,comType.toLocal8Bit().data());
    strcpy(curComInfo.business,business.toLocal8Bit().data());
    strcpy(curComInfo.businessCode,businessCode.toLocal8Bit().data());
    strcpy(curComInfo.addr,addr.toLocal8Bit().data());
    strcpy(curComInfo.areaCode,areaCode.toLocal8Bit().data());
    strcpy(curComInfo.townCode,townCode.toLocal8Bit().data());
    strcpy(curComInfo.scale,scale.toLocal8Bit().data());
    curComInfo.people = people.toInt();  // index 10
    strcpy(curComInfo.representative,representative.toLocal8Bit().data());
    strcpy(curComInfo.standardType,standardType.toLocal8Bit().data());
    strcpy(curComInfo.trunkCode,trunkCode.toLocal8Bit().data());
    strcpy(curComInfo.fixedTel,fixedTel.toLocal8Bit().data());
    strcpy(curComInfo.postCode,postCode.toLocal8Bit().data());
    strcpy(curComInfo.email,email.toLocal8Bit().data());
    strcpy(curComInfo.webSite,webSite.toLocal8Bit().data());  // index 17
    // 二
    strcpy(curComInfo.hasUpLegal,hasUpLegal.toLocal8Bit().data());
    strcpy(curComInfo.upCreditCode,upCreditCode.toLocal8Bit().data());
    strcpy(curComInfo.oldCreditCode,oldCreditCode.toLocal8Bit().data());
    strcpy(curComInfo.upName,upName.toLocal8Bit().data());  // index 21
    // 三
    strcpy(curComInfo.hasChiefDesigner,hasChiefDesigner.toLocal8Bit().data());
    strcpy(curComInfo.ChiefDesignerLevel,ChiefDesignerLevel.toLocal8Bit().data());
    strcpy(curComInfo.employmentMode,employmentMode.toLocal8Bit().data());
    strcpy(curComInfo.hasSetIntervalAudit,hasSetIntervalAudit.toLocal8Bit().data());
    strcpy(curComInfo.internalName,internalName.toLocal8Bit().data());
    strcpy(curComInfo.leadingOrganization,leadingOrganization.toLocal8Bit().data());
    strcpy(curComInfo.hasSetSeparateIA,hasSetSeparateIA.toLocal8Bit().data());
    curComInfo.financeDepartment = financeDepartment; // index 29
    curComInfo.legalDepartment = legalDepartment;
    curComInfo.internalConDepart = internalConDepart;
    curComInfo.disceplineInDepart = disceplineInDepart;
    curComInfo.otherDepart = otherDepart;
    strcpy(curComInfo.intavalAuditLeval,intavalAuditLeval.toLocal8Bit().data()); // index 34
    // 四
    curComInfo.organazationNum = organazationNum; // index 35
    curComInfo.realNum = realNum;
    curComInfo.professionalNum = professionalNum;
    curComInfo.CIANum = CIANum;
    curComInfo.masterNum = masterNum;
    curComInfo.undergraduatesNum = undergraduatesNum;
    curComInfo.juniorNum = juniorNum;
    curComInfo.seniorNum = seniorNum;
    curComInfo.intermediateNum = intermediateNum;
    curComInfo.primaryNum = primaryNum;
    curComInfo.noTitleNum = noTitleNum;
    curComInfo.upFiftyOldNum = upFiftyOldNum;
    curComInfo.upThirtyOldNum = upThirtyOldNum;
    curComInfo.downThirtyOldNum = downThirtyOldNum;
    curComInfo.auditNum = auditNum;
    curComInfo.accountingNum = accountingNum;
    curComInfo.economyNum = economyNum;
    curComInfo.lawNum = lawNum;
    curComInfo.managerNum = managerNum;
    curComInfo.itNum = itNum;
    curComInfo.engineeringNum = engineeringNum;
    curComInfo.otherNum = otherNum;  // index 56
    // 后4个信息
    strcpy(curComInfo.statisticalConOfficer,statisticalConOfficer.toLocal8Bit().data());
    strcpy(curComInfo.personFilling,personFilling.toLocal8Bit().data());
    strcpy(curComInfo.officerTel,officerTel.toLocal8Bit().data());
    strcpy(curComInfo.fillingDateTime,fillingDateTime.toLocal8Bit().data()); // index 60
    // 更新到数据库
    // 先判断是不是已经存在公司名了,若已存在,则更新,不存在则插入
    QString sql = QString("select id,name from all_company_info where name='%1'").arg(name);
    qDebug()<<"sql:"<<sql;
    QSqlQuery query;
    int rowCnt = 0;
    if(query.exec(sql)){
        qDebug()<<"size:"<<query.size();
        while (query.next()) {
            rowCnt++;
        }
    }
    if(rowCnt == 0){
        // 不存在,则插入一条新数据
        qDebug()<<"不存在:"<<name;
        sql = QString("insert into all_company_info (name,\
code,\
机构类型,\
主要业务活动,\
行业代码,\
单位注册地及区域,\
区域代码,\
城乡代码,\
单位规模,\
从业期末人数,\
法定代表人,\
执行会记标准类别,\
长途区号,\
固定电话,\
邮政编码,\
电子邮箱,\
网址,\
是否有上一级法人,\
上一级统信代码,\
原组织代码,\
上级单位名称,\
是否设置总审计师,\
总审计师职位层级,\
总审任职方式,\
是否设置内审机构,\
内审机构名称,\
领导机构,\
是否独立设置内审机构,\
财务部门,\
法务部门,\
内部控制部门,\
纪检部门,\
其他部门,\
内审层级,\
编制数量,\
实有人数量,\
专职人员数量,\
拥有CIA人数,\
硕士学历以上人数,\
本科人数,\
专科及以下人数,\
高级职称人数,\
中级职称人数,\
初级职称人数,\
无职称人数,\
五十岁以上人数,\
三十至五十岁岁人数,\
三十岁以下人数,\
审计数量,\
会计数量,\
经济数量,\
法律数量,\
管理数量,\
信息技术数量,\
工程数量,\
其他数量,\
统计负责人,\
填表人,\
联系电话,\
填报日期) values ('%1','%2','%3','%4','%5','%6','%7','%8','%9',%10,\
'%11','%12','%13','%14','%15','%16','%17','%18','%19','%20',\
'%21','%22','%23','%24','%25','%26','%27','%28',%29,%30,\
%31,%32,%33,'%34',%35,%36,%37,%38,%39,%40,\
%41,%42,%43,%44,%45,%46,%47,%48,%49,%50,\
%51,%52,%53,%54,%55,%56,'%57','%58','%59','%60'\
)").arg(name).arg(creditCode).arg(comType).arg(business).arg(businessCode).arg(addr).arg(areaCode).arg(townCode).arg(scale).arg(people).
                arg(representative).arg(standardType).arg(trunkCode).arg(fixedTel).arg(postCode).arg(email).arg(webSite).arg(hasUpLegal).arg(upCreditCode).arg(oldCreditCode).
                arg(upName).arg(hasChiefDesigner).arg(ChiefDesignerLevel).arg(employmentMode).arg(hasSetIntervalAudit).arg(internalName).arg(leadingOrganization).arg(hasSetSeparateIA).arg(financeDepartment).arg(legalDepartment).
                arg(internalConDepart).arg(disceplineInDepart).arg(otherDepart).arg(intavalAuditLeval).arg(organazationNum).arg(realNum).arg(professionalNum).arg(CIANum).arg(masterNum).arg(undergraduatesNum).
                arg(juniorNum).arg(seniorNum).arg(intermediateNum).arg(primaryNum).arg(noTitleNum).arg(upFiftyOldNum).arg(upThirtyOldNum).arg(downThirtyOldNum).arg(auditNum).arg(accountingNum).
                arg(economyNum).arg(lawNum).arg(managerNum).arg(itNum).arg(engineeringNum).arg(otherNum).arg(statisticalConOfficer).arg(personFilling).arg(officerTel).arg(fillingDateTime);
        qDebug()<<"sql insert:"<<sql;
        if(query.exec(sql)){
            qDebug()<<"insert ok";
        }else{
            qDebug()<<"insert fail:"<<query.lastError().text();
        }
    }else{
        // 更新
        qDebug()<<"存在:"<<name;
        sql = QString("update all_company_info set name='%1',code='%2',机构类型='%3',主要业务活动='%4',行业代码='%5',单位注册地及区域='%6',区域代码='%7',城乡代码='%8',单位规模='%9',从业期末人数=%10\
,法定代表人='%11',执行会记标准类别='%12',长途区号='%13',固定电话='%14',邮政编码='%15',电子邮箱='%16',网址='%17',是否有上一级法人='%18',上一级统信代码='%19',原组织代码='%20'\
,上级单位名称='%21',是否设置总审计师='%22',总审计师职位层级='%23',总审任职方式='%24',是否设置内审机构='%25',内审机构名称='%26',领导机构='%27',是否独立设置内审机构='%28',财务部门=%29,法务部门=%30\
,内部控制部门=%31,纪检部门=%32,其他部门=%33,内审层级='%34',编制数量=%35,实有人数量=%36,专职人员数量=%37,拥有CIA人数=%38,硕士学历以上人数=%39,本科人数=%40\
,专科及以下人数=%41,高级职称人数=%42,中级职称人数=%43,初级职称人数=%44,无职称人数=%45,五十岁以上人数=%46,三十至五十岁岁人数=%47,三十岁以下人数=%48,审计数量=%49,会计数量=%50\
,经济数量=%51,法律数量=%52,管理数量=%53,信息技术数量=%54,工程数量=%55,其他数量=%56,统计负责人='%57',填表人='%58',联系电话='%59',填报日期='%60'").
                arg(name).arg(creditCode).arg(comType).arg(business).arg(businessCode).arg(addr).arg(areaCode).arg(townCode).arg(scale).arg(people).
                arg(representative).arg(standardType).arg(trunkCode).arg(fixedTel).arg(postCode).arg(email).arg(webSite).arg(hasUpLegal).arg(upCreditCode).arg(oldCreditCode).
                arg(upName).arg(hasChiefDesigner).arg(ChiefDesignerLevel).arg(employmentMode).arg(hasSetIntervalAudit).arg(internalName).arg(leadingOrganization).arg(hasSetSeparateIA).arg(financeDepartment).arg(legalDepartment).
                arg(internalConDepart).arg(disceplineInDepart).arg(otherDepart).arg(intavalAuditLeval).arg(organazationNum).arg(realNum).arg(professionalNum).arg(CIANum).arg(masterNum).arg(undergraduatesNum).
                arg(juniorNum).arg(seniorNum).arg(intermediateNum).arg(primaryNum).arg(noTitleNum).arg(upFiftyOldNum).arg(upThirtyOldNum).arg(downThirtyOldNum).arg(auditNum).arg(accountingNum).
                arg(economyNum).arg(lawNum).arg(managerNum).arg(itNum).arg(engineeringNum).arg(otherNum).arg(statisticalConOfficer).arg(personFilling).arg(officerTel).arg(fillingDateTime);
        qDebug()<<"update sql:"<<sql;
        if(query.exec(sql)){
            qDebug()<<"update ok";
        }else{
            qDebug()<<"update fail:"<<query.lastError().text();
        }
    }
}
void ConverInfo2::readExcelFromPath(QString path)
{
    QAxObject excel("ket.Application");
    if(!excel.setControl("ket"
                         ".Application")){  // windows内核
        excel.setControl("Excel.Application"); // wps内核
    }
    excel.setProperty("Visible",false);
    excel.setProperty("DisplayAlerts",false);
    qDebug()<<"open:"<<path;
    qDebug()<<"excel:"<<excel.className();
    QAxObject * wbs = excel.querySubObject("WorkBooks");
    qDebug()<<"wbs:"<<wbs->className();
    QAxObject * wb = wbs->querySubObject("Open(QString&)",path);
    //QAxObject* pWorkBook = excel.querySubObject("ActiveWorkBook");
    //QAxObject* pWorkSheets = pWorkBook->querySubObject("Sheets");//获取工作表
    //QAxObject * shs = wb->querySubObject("Sheets"); // WorkSheets 也可以
    QAxObject * shs = wb->querySubObject("WorkSheets"); // WorkSheets 也可以
//            // 指定单元格拿
//            QAxObject *cell = shs->querySubObject("Cells(int, int)",82,1);
//            qDebug()<<"Cells:82-0:"<<shs->querySubObject("Cells(int, int)",82,0)->dynamicCall("Value()").toString();
//            qDebug()<<"Cells:82-1:"<<cell->dynamicCall("Value()").toString();
    int cnt = shs->property("Count").toInt();
    qDebug()<<"cnt="<<cnt;
    for(int i=0;i<cnt;++i){
        QAxObject * sheet = shs->querySubObject("Item(int)", i+1);
        QString sheetName = sheet->property("Name").toString();
        qDebug()<<"sh name:"<<sheetName;
        QAxObject *usedRange = sheet->querySubObject("UsedRange");
        int rows = usedRange->querySubObject("Rows")->property("Count").toInt();
        int columns = usedRange->querySubObject("Columns")->property("Count").toInt();
        qDebug()<<"r--c:"<<rows<<columns;
        QVariant  val = usedRange->dynamicCall("Value"); // 拿到二维表格
        QVariantList valRows = val.toList();
        // 遍历每一项
//                for(int i=0;i<rows;++i){
//                    QVariantList valrow = valRows[i].toList();
//                    for(int j=0;j<columns;++j){
//                        QVariant valData = valrow[j];
//                        if(valData.isValid()){
//                            qDebug()<<"val:"<< i<< j << valData;
//                        }
//                    }
//                }
        // 实例化结构体,然后挨个赋值
        ComInfo curComInfo;
        // 统一信用代码
        QVariant uniCode = valRows[9].toList().at(3);
        if(uniCode.isValid()){
            ui->label_creditCode->setText(uniCode.toString());
            strcpy(curComInfo.creditCode,uniCode.toString().toLocal8Bit().data());
        }
        // 单位名称
        QVariant name = valRows[9].toList().at(8);
        if(name.isValid()){
            ui->label_name->setText(name.toString());
//            // 菜单相关  当上级公司为空上级时,自己当自己的上级,并且罗列进去当 本级
//            QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
//            top1->setText(0,name.toString());
            strcpy(curComInfo.name,name.toString().toLocal8Bit().data());
        }else{
            ui->label_name->setText("");
        }
        // 机构类型
        QVariant comType = valRows[12].toList().at(3);
        if(comType.isValid()){
            ui->label_comType->setText(comType.toString());
            strcpy(curComInfo.comType,comType.toString().toLocal8Bit().data());
        }else{
            ui->label_comType->setText("");
        }
        // 主要业务活动
        QString business;
        QVariant first = valRows[18].toList().at(2);
        if(first.isValid()){
            business.append(first.toString());
        }
        QVariant sec = valRows[18].toList().at(5);
        if(sec.isValid()){
            business += "、";
            business.append(sec.toString());
        }
        QVariant third = valRows[18].toList().at(8);
        if(third.isValid()){
            business += "、";
            business.append(third.toString());
        }
        if(business.size() > 0){
            ui->label_business->setText(business);
            ui->label_business->setToolTip(business);
            strcpy(curComInfo.business,business.toLocal8Bit().data());
        }else{
            ui->label_business->setText("");
        }
        // 业务代码
        QVariant busCode = valRows[19].toList().at(4);
        if(busCode.isValid()){
            ui->label_businessCode->setText(busCode.toString());
            strcpy(curComInfo.businessCode,busCode.toString().toLocal8Bit().data());
        }else{
            ui->label_businessCode->setText("");
        }
        // 注册地址
        QString addr="";
        QVariant province = valRows[21].toList().at(1); // 省份
        QVariant city = valRows[21].toList().at(4); // 城市
        QVariant district = valRows[21].toList().at(7); // 管辖区
        QVariant village = valRows[22].toList().at(2); // 乡镇
        QVariant street = valRows[22].toList().at(4); // 街道
        QVariant Sub = valRows[23].toList().at(2); // 街道办事处
        QVariant committee = valRows[25].toList().at(3); // 居委会
        //qDebug()<<province<<city<<district<<village<<street<<Sub<<committee;
        if(province.isValid()) addr += province.toString();
        if(city.isValid()) addr += city.toString();
        if(district.isValid()) addr += district.toString();
        if(village.isValid()) addr += village.toString();
        if(street.isValid()) addr += street.toString();
        if(Sub.isValid()) addr += Sub.toString();
        if(committee.isValid()) addr += committee.toString();
        if(addr.size()>10){
            ui->label_addr->setText(addr);
            strcpy(curComInfo.addr,addr.toLocal8Bit().data());
        }else{
            ui->label_addr->setText("");
        }
        // 区域代码
        QVariant areaCode = valRows[24].toList().at(2);
        if(areaCode.isValid()){
            ui->label_areaCode->setText(areaCode.toString());
            strcpy(curComInfo.areaCode,areaCode.toString().toLocal8Bit().data());
        }else{
            ui->label_areaCode->setText("");
        }
        // 城乡代码
        QVariant townCode = valRows[24].toList().at(6);
        if(townCode.isValid()) {
            ui->label_townCode->setText(townCode.toString());
            strcpy(curComInfo.townCode,townCode.toString().toLocal8Bit().data());
        }else{
            ui->label_townCode->setText("");
        }
        // 单位规模
        QVariant scale = valRows[25].toList().at(3);
        if(scale.isValid()){
            ui->label_scale->setText(scale.toString());
            strcpy(curComInfo.scale,scale.toString().toLocal8Bit().data());
        }else{
            ui->label_scale->setText("");
        }
        // 从业人数
        QVariant people = valRows[26].toList().at(6);
        if(people.isValid()) {
            ui->label_people->setText(people.toString());
            //strcpy(curComInfo.people,people.toString().toLocal8Bit().data());
            curComInfo.people = people.toInt();
        }else{
            ui->label_people->setText("");
        }
        // 法人
        QVariant representative = valRows[27].toList().at(4);
        if(representative.isValid()) {
            ui->label_representative->setText(representative.toString());
            strcpy(curComInfo.representative,representative.toString().toLocal8Bit().data());
        }else{
            ui->label_representative->setText("");
        }
        // 会计标准类别 standardType
        QVariant standardType = valRows[27].toList().at(8);
        if(standardType.isValid()){
            ui->label_standardType->setText(standardType.toString());
            strcpy(curComInfo.standardType,standardType.toString().toLocal8Bit());
        }else{
            ui->label_standardType->setText("");
        }
        // 长途区号
        QVariant trunkCode = valRows[31].toList().at(2);
        if(trunkCode.isValid()){
            ui->label_trunkCode->setText(trunkCode.toString());
            strcpy(curComInfo.trunkCode,trunkCode.toString().toLocal8Bit().data());
        }else{
            ui->label_trunkCode->setText("");
        }
        // 固定电话
        QVariant fixedTel = valRows[32].toList().at(2);
        if(fixedTel.isValid()) {
            ui->label_fixedTel->setText(fixedTel.toString());
            strcpy(curComInfo.fixedTel,fixedTel.toString().toLocal8Bit().data());
        }else{
            ui->label_fixedTel->setText("");
        }
        // 邮政编码
        QVariant postCode = valRows[33].toList().at(2);
        if(postCode.isValid()){
            ui->label_postCode->setText(postCode.toString());
            strcpy(curComInfo.postCode,postCode.toString().toLocal8Bit().data());
        }else{
            ui->label_postCode->setText("");
        }
        // 电子邮箱
        QVariant email = valRows[30].toList().at(5);
        if(email.isValid()) {
            ui->label_email->setText(email.toString());
            strcpy(curComInfo.email,email.toString().toLocal8Bit().data());
        }else{
            ui->label_email->setText("");
        }
        // 网址
        QVariant webSite = valRows[32].toList().at(5);
        if(webSite.isValid()) {
            ui->label_webSite->setText(webSite.toString());
            strcpy(curComInfo.webSite,webSite.toString().toLocal8Bit().data());
        }else{
            ui->label_webSite->setText("");
        }
        // 二、单位组织结构情况
        // 是否有上一级法人
        QVariant hasUpLegal = valRows[35].toList().at(4);
        if(hasUpLegal.isValid()){
            strcpy(curComInfo.hasUpLegal,hasUpLegal.toString().toLocal8Bit().data());
            qDebug()<<"has up legal"<<hasUpLegal;
        }
        // 上级法人单位统一社会信用代码
        QVariant upCreditCode = valRows[36].toList().at(7);
        if(upCreditCode.isValid()){
            strcpy(curComInfo.upCreditCode,upCreditCode.toString().toLocal8Bit().data());
            qDebug()<<"upCreditCode"<<upCreditCode;
        }else {
            qDebug()<<"upCreditCode fail"<<name;
        }
        // 原组织机构代码
        QVariant oldCreditCode = valRows[37].toList().at(7);
        if(oldCreditCode.isValid()){
            strcpy(curComInfo.oldCreditCode,oldCreditCode.toString().toLocal8Bit().data());
            qDebug()<<"oldCreditCode"<<oldCreditCode;
        }
        // 上一级单位详细名称
        QVariant upName = valRows[38].toList().at(7);
        if(upName.isValid()){
            strcpy(curComInfo.upName,upName.toString().toLocal8Bit().data());
            qDebug()<<"upName"<<upName;
        }
        // 总审计师与内审机构基本情况
        // 是否设置总审计师
        QVariant hasChiefDesigner = valRows[40].toList().at(4);
        if(hasChiefDesigner.isValid()){
            strcpy(curComInfo.hasChiefDesigner,hasChiefDesigner.toString().toLocal8Bit().data());
            qDebug()<<"hasChiefDesigner"<<hasChiefDesigner;
        }
        // 总审计师职位层级
        QVariant ChiefDesignerLevel = valRows[41].toList().at(4);
        if(ChiefDesignerLevel.isValid()){
            strcpy(curComInfo.ChiefDesignerLevel,ChiefDesignerLevel.toString().toLocal8Bit().data());
            qDebug()<<"ChiefDesignerLevel"<<ChiefDesignerLevel;
        }
        // 总审计师任职方式
        QVariant employmentMode = valRows[44].toList().at(4);
        if(employmentMode.isValid()){
            strcpy(curComInfo.employmentMode,employmentMode.toString().toLocal8Bit().data());
            qDebug()<<"employmentMode"<<employmentMode;
        }
        // 是否设置内审机构
        QVariant hasSetIntervalAudit = valRows[47].toList().at(4);
        if(hasSetIntervalAudit.isValid()){
            strcpy(curComInfo.hasSetIntervalAudit,hasSetIntervalAudit.toString().toLocal8Bit().data());
            qDebug()<<"hasSetIntervalAudit"<<hasSetIntervalAudit;
        }
        // 内审机构名称
        QVariant internalName = valRows[48].toList().at(4);
        if(internalName.isValid()){
            strcpy(curComInfo.internalName,internalName.toString().toLocal8Bit().data());
            qDebug()<<"internalName"<<internalName;
        }
        // 内审工作的领导机构
        QVariant leadingOrganization = valRows[49].toList().at(4);
        if(leadingOrganization.isValid()){
            strcpy(curComInfo.leadingOrganization,leadingOrganization.toString().toLocal8Bit().data());
            qDebug()<<"leadingOrganization"<<leadingOrganization;
        }
        // 是否独立设置内审机构
        QVariant hasSetSeparateIA = valRows[53].toList().at(4);
        if(hasSetSeparateIA.isValid()){
            strcpy(curComInfo.hasSetSeparateIA,hasSetSeparateIA.toString().toLocal8Bit().data());
            qDebug()<<"hasSetSeparateIA"<<hasSetSeparateIA;
        }
        // 合并设置 财务部门   复选框
        QVariant financeDepartment = valRows[55].toList().at(1);
        if(financeDepartment.isValid()){
            //strcpy(curComInfo.financeDepartment,financeDepartment.toString().toLocal8Bit().data());
            curComInfo.financeDepartment = financeDepartment.toBool();
            qDebug()<<"financeDepartment"<<financeDepartment;
        }
        // 法务部门、内部控制部门、纪检部门、其他部门
        // 内审机构层级
        QVariant intavalAuditLeval = valRows[56].toList().at(4);
        if(intavalAuditLeval.isValid()){
            strcpy(curComInfo.intavalAuditLeval,intavalAuditLeval.toString().toLocal8Bit().data());
            qDebug()<<"intavalAuditLeval"<<intavalAuditLeval;
        }
        // 四、内审人员配备基本情况
        // 编制数
        QVariant organazationNum = valRows[56].toList().at(4);
        if(organazationNum.isValid()){
            curComInfo.organazationNum = organazationNum.toInt();
            qDebug()<<"organazationNum"<<organazationNum;
        }
        // 实有人员数
        QVariant realNum = valRows[56].toList().at(4);
        if(realNum.isValid()){
            curComInfo.realNum = realNum.toInt();
            qDebug()<<"realNum"<<realNum;
        }
        // 专职人员数
        QVariant professionalNum = valRows[56].toList().at(4);
        if(professionalNum.isValid()){
            curComInfo.professionalNum = professionalNum.toInt();
            qDebug()<<"professionalNum"<<professionalNum;
        }
        // 拥有CIA人员数
        QVariant CIANum = valRows[56].toList().at(4);
        if(CIANum.isValid()){
            curComInfo.CIANum = CIANum.toInt();
            qDebug()<<"CIANum"<<CIANum;
        }
        // 学历:硕士及以上 人员数
        QVariant masterNum = valRows[56].toList().at(4);
        if(masterNum.isValid()){
            curComInfo.masterNum = masterNum.toInt();
            qDebug()<<"masterNum"<<masterNum;
        }
        // 大学本科
        QVariant undergraduatesNum = valRows[56].toList().at(4);
        if(undergraduatesNum.isValid()){
            curComInfo.undergraduatesNum = undergraduatesNum.toInt();
            qDebug()<<"undergraduatesNum"<<undergraduatesNum;
        }
        // 专科及以下
        QVariant juniorNum = valRows[56].toList().at(4);
        if(juniorNum.isValid()){
            curComInfo.juniorNum = juniorNum.toInt();
            qDebug()<<"juniorNum"<<juniorNum;
        }
        // 职称 高级职称
        QVariant seniorNum = valRows[56].toList().at(4);
        if(seniorNum.isValid()){
            curComInfo.seniorNum = seniorNum.toInt();
            qDebug()<<"seniorNum"<<seniorNum;
        }
        // 中级职称
        QVariant intermediateNum = valRows[56].toList().at(4);
        if(intermediateNum.isValid()){
            curComInfo.intermediateNum = intermediateNum.toInt();
            qDebug()<<"intermediateNum"<<intermediateNum;
        }
        // 初级职称
        QVariant primaryNum = valRows[56].toList().at(4);
        if(primaryNum.isValid()){
            curComInfo.primaryNum = primaryNum.toInt();
            qDebug()<<"primaryNum"<<primaryNum;
        }
        // 无职称
        QVariant noTitleNum = valRows[56].toList().at(4);
        if(noTitleNum.isValid()){
            curComInfo.noTitleNum = noTitleNum.toInt();
            qDebug()<<"noTitleNum"<<noTitleNum;
        }
        // 年龄结构 50岁以上
        QVariant upFiftyOldNum = valRows[56].toList().at(4);
        if(upFiftyOldNum.isValid()){
            curComInfo.upFiftyOldNum = upFiftyOldNum.toInt();
            qDebug()<<"upFiftyOldNum"<<upFiftyOldNum;
        }
        // 30-50岁
        QVariant upThirtyOldNum = valRows[56].toList().at(4);
        if(upThirtyOldNum.isValid()){
            curComInfo.upThirtyOldNum = upThirtyOldNum.toInt();
            qDebug()<<"upThirtyOldNum"<<upThirtyOldNum;
        }
        // 30岁以下
        QVariant downThirtyOldNum = valRows[56].toList().at(4);
        if(downThirtyOldNum.isValid()){
            curComInfo.downThirtyOldNum = downThirtyOldNum.toInt();
            qDebug()<<"downThirtyOldNum"<<downThirtyOldNum;
        }
        // 知识结构 审计
        QVariant auditNum = valRows[56].toList().at(4);
        if(auditNum.isValid()){
            curComInfo.auditNum = auditNum.toInt();
            qDebug()<<"auditNum"<<auditNum;
        }
        // 会计
        QVariant accountingNum = valRows[56].toList().at(4);
        if(accountingNum.isValid()){
            curComInfo.accountingNum = accountingNum.toInt();
            qDebug()<<"accountingNum"<<accountingNum;
        }
        // 经济
        QVariant economyNum = valRows[56].toList().at(4);
        if(economyNum.isValid()){
            curComInfo.economyNum = economyNum.toInt();
            qDebug()<<"economyNum"<<economyNum;
        }
        // 法律
        QVariant lawNum = valRows[56].toList().at(4);
        if(lawNum.isValid()){
            curComInfo.lawNum = lawNum.toInt();
            qDebug()<<"lawNum"<<lawNum;
        }
        // 管理
        QVariant managerNum = valRows[56].toList().at(4);
        if(managerNum.isValid()){
            curComInfo.managerNum = managerNum.toInt();
            qDebug()<<"managerNum"<<managerNum;
        }
        // 信息技术
        QVariant itNum = valRows[56].toList().at(4);
        if(itNum.isValid()){
            curComInfo.itNum = itNum.toInt();
            qDebug()<<"itNum"<<itNum;
        }
        // 工程
        QVariant engineeringNum = valRows[56].toList().at(4);
        if(engineeringNum.isValid()){
            curComInfo.engineeringNum = engineeringNum.toInt();
            qDebug()<<"engineeringNum"<<engineeringNum;
        }
        // 其他
        QVariant otherNum = valRows[56].toList().at(4);
        if(otherNum.isValid()){
            curComInfo.otherNum = otherNum.toInt();
            qDebug()<<"otherNum"<<otherNum;
        }
        // 后面的4个信息
        // 统计负责人
        QVariant statisticalConOfficer = valRows[81].toList().at(1);
        if(statisticalConOfficer.isValid()){
            strcpy(curComInfo.statisticalConOfficer,statisticalConOfficer.toString().toLocal8Bit().data());
            qDebug()<<"statisticalConOfficer"<<statisticalConOfficer;
        }else{
            qDebug()<<"statisticalConOfficer fail:"<<name.toString();
        }
        // 填表人
        QVariant personFilling = valRows[81].toList().at(4);
        if(personFilling.isValid()){
            strcpy(curComInfo.personFilling,personFilling.toString().toLocal8Bit().data());
            qDebug()<<"personFilling"<<personFilling;
        }
        // 联系电话
        QVariant officerTel = valRows[82].toList().at(1);
        if(officerTel.isValid()){
            strcpy(curComInfo.officerTel,officerTel.toString().toLocal8Bit().data());
            qDebug()<<"officerTel"<<officerTel;
        }
        // 填报日期
        QVariant fillingDateTime = valRows[82].toList().at(4);
        if(fillingDateTime.isValid()){
            strcpy(curComInfo.fillingDateTime,fillingDateTime.toString().toLocal8Bit().data());
            qDebug()<<"fillingDateTime"<<fillingDateTime;
        }
        // 最后存到map中
        m_nameAndComInfos[name.toString()]=curComInfo;
        // 添加左边树形图相关
        // 菜单相关  当上级公司为空上级时,自己当自己的上级,并且罗列进去当 本级
        addTreeWidgetNode(upName,name);
//        if(upName.isValid()){
//            if(name.isValid()){
//                m_treeNodes[upName.toString()].push_back(name.toString());
//            }
//        }else{
//            if(name.isValid()){
//                m_treeNodes[name.toString()].push_back(name.toString());
//            }
//        }
    }
    wbs->dynamicCall("Close()");
    excel.dynamicCall("Quit(void)");
    qDebug()<<"单位信息数量:"<<m_nameAndComInfos.size();
}
void ConverInfo2::createTreeNode(){
    qDebug()<<"构建树形列表"<<m_treeNodes.size();
    for(auto iter=m_treeNodes.begin();iter != m_treeNodes.end();iter++)
    {
        // 先构建一个每级的父节点
        addTreeWidgetNode(iter.key(),iter.key());
        // 再添加孩子节点
        for(QString node:iter.value()){
            qDebug()<<iter.key()<<node;
            if(iter.key() != node){
                addTreeWidgetNode(iter.key(),node);
            }
        }
    }
}
void ConverInfo2::addTreeWidgetNode(QVariant upName,QVariant name){
    // 添加左边树形图相关
    // 菜单相关  当上级公司为空上级时,自己当自己的上级,并且罗列进去当 本级
    if(upName.isValid()) // 有效
    {
        // 判断顶层树节点是否已经存在
        QTreeWidgetItem *top = nullptr;
        for(int k=0;k<ui->treeWidget->topLevelItemCount();++k){
            QTreeWidgetItem *tmp = ui->treeWidget->topLevelItem(k);
            qDebug()<<k<<tmp->text(0)<<upName.toString();
            if(upName.toString()+"(汇总)" == tmp->text(0)){
                top = tmp;
                break;
            }
        }
        if(name.isValid()){
            if(top){ // 存在,则添加到孩子列表中
                QTreeWidgetItem *top1 = new QTreeWidgetItem(top);
                top1->setText(0,name.toString());
            }else{ // 不存在,则新建一个列表
                QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
                top1->setText(0,name.toString()+"(汇总)");
                QTreeWidgetItem *top2 = new QTreeWidgetItem(top1);
                top2->setText(0,name.toString()+"(本级)");
            }
        }
    }else{
        qDebug()<<"没发现上一级,只能自己当"<<name;
        if(name.isValid()){
            QTreeWidgetItem *top1 = new QTreeWidgetItem(ui->treeWidget);
            top1->setText(0,name.toString()+"(汇总)");
            QTreeWidgetItem *top2 = new QTreeWidgetItem(top1);
            top2->setText(0,name.toString()+"(本级)");
        }
    }
}
void ConverInfo2::on_pushButton_laodFile_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"选择表格:单位及内部审计机构基本情况表","./","excel(*基本情况表*.xls)");
    qDebug()<<"path:"<<path;
    if(path.size() > 1){
        readExcelFromPath(path);
    }
}