一、前言
本文介绍了一种在Qt平台将excel表格的数据读取至数据库QSQLite的方法。思路为:先将excel表格转为csv文件,若原表格中存在着中文,还需将csv的编码格式转为UTF-8,接着由QFile打开该csv文件,将每一行的数据读出,并写入创建的数据库表格。
二、将excel表格转为csv文件
首先需要将保存了需要读取至数据库的excel表格保存为csv文件,如下为实例excel表格,直接另存为csv文件。这里excel保存的是身份证前6位对应的地区名。
由于excel中存在中文,故需将编码格式改为UTF-8,用记事本打开csv文件,然后在文件->另存为,设置如下,另存为sfzqjw_UTF8.csv文件
三、Qt读取csv中数据并保存至新建数据库的表中
<span style="font-size:18px;">//connection.h
#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QFile>
#include <iostream>
#include <QTextStream>
#include <QDebug>
static bool createConnection()
{
//读取csv数据到数据表
QFile file("E:/PracticeOfQt/Id_recognition/sfzqjw_UTF8.csv"); //打开csv文件
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
std::cerr << "Cannot open file for reading: "
<< qPrintable(file.errorString()) << std::endl;
return false;
}
//将csv_utf8转为数据库中的表District保存
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydb.db");
if(!db.open())
{
QMessageBox::critical(0 , "Can not open database",
"Unable to establish a database connection.",QMessageBox::Cancel);
std::cerr<<"stop!";
return false;
}
QSqlQuery query; //默认打开
query.exec("create table District(id int primary key, province varchar(25),"
"city varchar(25),county varchar(25))");
QStringList list;
list.clear();
QTextStream in(&file); //QTextStream读取数据
int idNumber;
while(!in.atEnd())
{
QString fileLine = in.readLine(); //从第一行读取至下一行
list = fileLine.split(",", QString::SkipEmptyParts);
idNumber = list.at(4).toInt();
query.prepare("INSERT INTO District (id, province,city,county) VALUES (:idVal,:Pro,:City,:County)"); //准备执行SQL查询
query.bindValue(":idVal", idNumber); //绑定要插入的值
query.bindValue(":Pro", list.at(1));
query.bindValue(":City", list.at(2));
query.bindValue(":County", list.at(3));
query.exec();
}
query.clear();
db.close();
return true;
}</span>
四.在main函数中由SQL条件查询查询数据库中对应的地区
Main函数首先运行了connection.h中createConnection()函数,读取csv中数据并保存至新建数据库的表中,接着打开已创建的数据库mydb.db,由条件查询查询id对应的地区,由qDebug()输出。<span style="font-size:18px;">//main.cpp
#include "connection.h"
#include <QApplication>
#include <QDebug>
#include <QVariant>
#include <QSqlDatabase>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if(!createConnection())
{
std::cerr<<"Can not create connection";
return -1;
}
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydb.db");
if(!db.open())
{
QMessageBox::warning(NULL,QObject::tr("初始化数据库"),QObject::tr("数据库文件打开故障!"));
}
QSqlQuery query(db);
int queryId = 441223; //要查询的身份证前6位,保存至变量
query.prepare("select * from District WHERE id ==? "); //id号码唯一的
query.addBindValue(queryId); //query的绑定机制绑定变量
query.exec();
QString place = "";
while(query.next())
{
for(int i = 1; i < 4 ;++i)
place += query.value(i).toString();
}
qDebug()<<"编号为"<<queryId<<"的发证地为"<<place;
db.close(); //关闭数据库
return a.exec();
}</span>
五、运行结果
Main函数中设置了查询编号441223对应的身份证所在市县,qDebug()输出结果如下: