Qt解析Excel文件并将数据插入远程数据库MySQL

news/2024/7/21 6:05:28 标签: 数据库, qt, mysql, excel

因为 需求,这两天自己试着用Qt链接了远程数据库MySQL,其中更是算出多多啊。
很重要的一点:在.pro文件里面添加 sql应该都知道,但还要加一句 CONFIG += qaxcontainer

ipServer        = ip;               //远程数据库的IP
portServer      = port;             //远程数据库的端口
sqlName         = sqlname;          //远程数据库的名称
userNameServer  = usernameServer;   //用户名
passwdServer    = passwd;           //远程数据库密码
tableName       = tablename;        //操作表单名称

接下来就是跟远程数据库链接,即打开远程数据库,如果你的数据库没有做过任何修改的话,运行程序是会报错的,因为MySQL数据库默认的都是localhorst,提示信息是:你的数据库拒绝IP。。。的访问,这时候就要先设置数据库能被你自己主机的ip访问,具体代码如下:

grant all PRIVILEGES on test.* to 'user'@'192.168.42.1' identified by 'passwd'; //test是某个特定的数据库

//OpenDB();

 try
    {
        if(pDB)
        {
            closeDB();
        }
        pDB = new QSqlDatabase();
        *pDB = QSqlDatabase::addDatabase(connName);
        pDB->setHostName(ipServer);
        pDB->setPort(portServer);
        pDB->setDatabaseName(sqlName);
        pDB->setUserName(userNameServer);
        pDB->setPassword(passwdServer);
        if(pDB->open())
        {
            qDebug()<<"*********************打开数据库成功******************";
            if(pQuery)
            {
                delete pQuery;
                pQuery = NULL;
            }
            pQuery = new QSqlQuery(*pDB);
        }
        else
        {
            qDebug()<<"*********************打开数据库失败******************";
            qDebug()<<pDB->lastError().text();
        }
    }
    catch(...)
    {
        return -1;
    }
    return 0;

数据库的操作我只写了一部分,只有插入数据的部分,其余的都跟这个差不多;

//写数据
void SqlConn::WriteData(QString strsql)
{
    if (pDB->isOpen())
    {
        pQuery->exec(strsql);
    }
    else
    {
        return;
    }
}

我的远程数据库是在Linux下的,换需要修改数据库的绑定连接的地址,这个不同的版本会在不同的文件里面出现
cd/etc/mysql,进入这个文件夹后,就只有靠你一个一个慢慢查找了。一般会在mysql.cnf.d/mysql.cnf文件里,注释掉

bind-address        =127.0.0.1

这个文件是只读的文件,所以在打开的时候用root 账户。
如下图所示:
这里写图片描述

数据库打开成功之后,就要解析Excel文件,当然如果你想成功的插入数据,你就得确保数据库表单和Excel表单具有完全一样的表头,当然你也可以根据Excel表头创建数据库表单后再插入数据,因为写了一个可以插入任何数据库的小工具,所以Excel文件是这样的。
这里写图片描述
第一行是表头,第二行表示数据库表单的值得类型,0表示int,1表示varchar;接下来的就是数据了。
解析Excel文件代码:

    QAxObject excel("Excel.Application");
    excel.setProperty("Visible", false);
    QAxObject *work_books = excel.querySubObject("WorkBooks");
    work_books->dynamicCall("Open (const QString&)", FilePath);
    QVariant title_value = excel.property("Caption");  //获取标题
    qDebug()<<QString("excel title : ")<<title_value;
    QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
    QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可换用WorkSheets
    int sheet_count = work_sheets->property("Count").toInt();  //获取工作表数目
    for(int i=1; i<=sheet_count; i++)
    {
        QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i);  
        QString work_sheet_name = work_sheet->property("Name").toString();  //获取工作表名称
        QString message = QString("sheet ")+QString::number(i, 10)+ QString(" name");
    }
    if(sheet_count > 0)
    {
        QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);
        QAxObject *used_range = work_sheet->querySubObject("UsedRange");
        QAxObject *rows = used_range->querySubObject("Rows");
        QAxObject *columns = used_range->querySubObject("Columns");
        int row_start = used_range->property("Row").toInt();  //获取起始行
        int column_start = used_range->property("Column").toInt();  //获取起始列
        int row_count = rows->property("Count").toInt();  //获取行数
        int column_count = columns->property("Count").toInt();  //获取列数
        //获取数据库表单值的类型
        int keyType[column_count];
        for(int i = column_start;i <= column_count;i ++)
        {
            QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, i);
            int value = cell->dynamicCall("Value2()").toInt();
            keyType[i-1] = value;
        }
        //获取Excel文件单元格的值并编辑sql语句
        for(int i = row_start+2; i <= row_count;i++)
        {
            QStringList list;
            for(int j = column_start; j <= column_count;j++)
            {
                QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j);
                QString Value = cell->dynamicCall("Value2()").toString();
                list<<Value;
                if(keyType[j-1] == 0)
                {
                    strSql = strSql +QString("%1").arg(Value);
                }
                else
                {
                    strSql = strSql + QString("'%1'").arg(Value);
                }
                if(j < column_count )
                {
                    strSql = strSql + QString(",");
                }
                else
                {
                    strSql = strSql + QString(")");
                }
            }
            //调用写数据函数,将数据插入数据库
            this->WriteData(strSql);
            //小红心编辑strSql,准备读取下一行数据
            strSql = QString("insert into %1 values(").arg(tableName);
        }
    }

http://www.niftyadmin.cn/n/801410.html

相关文章

Qt下D-Bus的具体运用(软键盘输入法的实现)

1、基本概念 D-Bus是一种高级的进程间通信机制&#xff0c;在Linux桌面为进程提供通信。是一种低开销、低延时的IPC&#xff0c;并被多种桌面环境&#xff08;如 KDE、GNOME等&#xff09;采用。 D-Bus是一个消息总线系统&#xff0c;其功能已涵盖进程间通信的所有需求&#…

第3章 专家控制系统

3-1 怎样定义专家系统? 你是如何理解专家系统的? 3-2 试就专家系统的构成和各部分的作用说明专家系统是如何工作的。 3-3 结合结构说明基于规则的专家系统的工作原理。 3-4 基于框架的专家系统与面向目标编程有何关系?其结构特点和设计任务是什么? 3-5 为什么要提出基于模…

发送报警邮件代码

#!/usr/bin/env python # -*- coding:utf-8 -*- #函数编程 #发送邮件报警 import smtplib from email.mime.text import MIMEText from email.utils import formataddrdef email(are): #are是定义参数&#xff1b;具体参数下面会定义&#xff1b;用email()引用#print are …

为五斗米

为五斗米&#xff0c;竞折腰。 好想写一写自己这一年多来的感受&#xff0c;又有点&#xff0c;以后再补。。

语言是思维和交流的工具

语言是思维和交流的工具 人类的思维可以分为线性思维和非线性思维两种&#xff1b; 线性思维是一种直线的、单向的、单维的、缺乏变化的思维方式&#xff0c;如逻辑思维&#xff1b; 非线性思维则是相互连接的&#xff0c;非平面、立体化、无中心、无边缘的网状结构&#xff…

嵌入式环境的搭建(用于Arm开发板)

1&#xff0c;搭建开发环境 a&#xff0c;对于新系统&#xff0c;安装一些依赖软件。 sudo apt-get install build-essential git libusb-1.0-0-dev u-boot-tools ccache zlib1g-dev uuid-dev 如果是64位的linux还要执行如下的安装&#xff1a; # sudo apt-get install lib…

安卓右键工具1.2 - 安卓开发与分析者的利器

下载地址&#xff1a;网易云安卓右键工具-Android工具类资源-CSDN下载 网易云加密_安卓右键工具-Android工具类资源-CSDN下载 可扩展最新版&#xff1a;bigsinger/CustomContextMenu: 自定义Windows系统右键菜单工具 相关文章&#xff1a; 自定义系统右键菜单工具-使用说明_…

误差传播学习算法调整神经网络权值

误差传播学习算法调整神经网络权值