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

来源:互联网 发布:在淘宝卖茶叶 编辑:程序博客网 时间:2024/06/06 17:35

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

ipServer        = ip;               //远程数据库的IPportServer      = 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);        }    }
1 0
原创粉丝点击