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

一、前言

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


  • 8
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Qt可以使用QAxObject类来操作Excel文件。下面是一个使用QAxObject类读取Excel文件数据的示例代码: ```c++ #include <QAxObject> #include <QDebug> int main(int argc, char *argv[]) { QAxObject excel("Excel.Application"); // 创建Excel对象 excel.setProperty("Visible", false); // 设置Excel不可见 QAxObject *workbooks = excel.querySubObject("Workbooks"); QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", "example.xlsx"); // 打开Excel文件 QAxObject *worksheets = workbook->querySubObject("Worksheets"); QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1); // 获取第一个工作表 QAxObject *usedRange = worksheet->querySubObject("UsedRange"); QAxObject *rows = usedRange->querySubObject("Rows"); QAxObject *columns = usedRange->querySubObject("Columns"); int rowCount = rows->property("Count").toInt(); // 获取行数 int columnCount = columns->property("Count").toInt(); // 获取列数 for(int i = 1; i <= rowCount; ++i){ for(int j = 1; j <= columnCount; ++j){ QAxObject *cell = worksheet->querySubObject("Cells(int,int)", i, j); QVariant cellValue = cell->property("Value"); // 获取单元格值 qDebug() << cellValue.toString(); // 输出单元格值 delete cell; // 释放单元格对象 } } delete columns; delete rows; delete usedRange; delete worksheet; workbook->dynamicCall("Close()"); // 关闭工作簿 delete workbook; delete worksheets; delete workbooks; excel.dynamicCall("Quit()"); // 退出Excel return 0; } ``` 以上示例代码假设Excel文件名为example.xlsx,第一个工作表中读取数据从第一个单元格开始。你可以根据实际情况修改代码的对应参数。需要注意的是,使用QAxObject类需要在.pro文件添加QT += axcontainer配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值