您的位置:首页 > 编程语言 > Qt开发

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

2016-07-07 15:49 645 查看
因为 需求,这两天自己试着用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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 qt mysql excel