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

因为 需求,这两天自己试着用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);
        }
    }
  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值