关闭

使用Qt从excel读取数据至数据库

标签: Qt读取csvQt读取excel到数据库Qt打开csv文件excel数据到QSQLiteQt读取excel
2665人阅读 评论(6) 收藏 举报
分类:

一、前言

本文介绍了一种在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()输出结果如下:


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:79832次
    • 积分:1388
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:1篇
    • 译文:0篇
    • 评论:57条
    最新评论