QT使用QXlsx导出读取sqLite数据库中所有数据到execl

一.Qt QTabWidget控件使用

1. 新建Tab页

新建tab页添加到QTabWidget控件中,分别修改currenttabText为
数据库表列表,表字段详细,表数据分别显示sqllite数据库中的所有表列表,选中表的表字段,以及表中的详细数据,如下图示:
在这里插入图片描述

2. 加载SqLite数据库

添加菜单栏,选中db数据库,加载数据!

 //选择数据库文件
    QString xlsFile = QFileDialog::getOpenFileName(this,QString(),QString(),"sqlite数据库(*.db)");
            if(xlsFile.isEmpty())
                return;
   //根据文件所在路径加载数据库
   QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","sqlite_master");
   db.setDatabaseName(xlsFile);
   //判断数据库是否能够打开
   if(db.open())
   {}
    else
        QMessageBox::information(NULL, "提示","未能打开db数据库!",
                                            QMessageBox::Ok , QMessageBox::Ok);
    db.close();

二.Qt 读取sqlite数据库中的数据

1. 加载sqlite数据库中的所有表与视图列表数据

在选中数据库时,就直接加载数据库中的所有表的详细信息,并将QSqlQueryModel添加到tab页对应的QTableView控件上:

//选择数据库文件
    QString xlsFile = QFileDialog::getOpenFileName(this,QString(),QString(),"sqlite数据库(*.db)");
            if(xlsFile.isEmpty())
                return;
   //根据文件所在路径加载数据库
   db = QSqlDatabase::addDatabase("QSQLITE","sqlite_master");
   db.setDatabaseName(xlsFile);
   //判断数据库是否能够打开
   if(db.open())
   {
        model = new QSqlQueryModel;
        model->setQuery("select * from  sqlite_master", db);
        ui->tableView->setModel(model);
    }
    else
        QMessageBox::information(NULL, "提示","未能打开db数据库!",
                                            QMessageBox::Ok , QMessageBox::Ok);
    db.close();

得到包含sqlite数据库中表与视图的详细信息如下图结果:
在这里插入图片描述

2. 查询sqlite数据库表的字段信息,以及数据

通过对上面表的显示结果绑定双击事件加载对应表的详细信息,以及数据

void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)
{
    QVariant data= model->data(index.parent());
    model->query().seek(index.row());
    if(db.open())
    {
    	//查询表字所有字段
        QSqlQueryModel* modesl=new QSqlQueryModel;
        ui->tab2->setToolTip(model->query().value("name").toString());
         modesl->setQuery("PRAGMA table_info("+model->query().value("name").toString()+")", db);
        ui->tableinfoView->setModel(modesl);
		
		//查询表中所有数据
        QSqlQueryModel* modesm=new QSqlQueryModel;
        ui->tab3->setToolTip(model->query().value("name").toString());
        modesm->setQuery("select * from "+model->query().value("name").toString(), db);
        ui->tableViewall->setModel(modesm);
    }
    db.close();
}

结果如下图示:
表结构:
在这里插入图片描述
表数据:
在这里插入图片描述

3. QT 查询sqlite数据库表的所有信息(包括循环表列表数据等)

Qt查询数据库中数据:

QSqlQuery SQls(db);
SQls.prepare("select * from  sqlite_master");
QList<QString> Tablist;
if(SQls.exec())
{
	int row=1;
	//得到表的列名
	QSqlRecord sqlRecord(SQls.record());
	for(int i = 0; i < sqlRecord.count(); i++){
	qDebug() <<  sqlRecord.fieldName(i);
	};
	
	//获取表行数据  --循环每一行
 	while (SQls.next()) {
    Tablist.append(SQls.value("name").toString());
        for(int c=1;c<=SQls.record().count();c++) {
			qDebug() <<  QString::fromUtf8(SQls.value(c-1).toByteArray());
 		}}
}

三.Qt 使用QXlsx导出数据到Execl

1.将QXlsx库添加到项目中

下载QXlsx源码.
将QXlsx库文件添加到项目文件下并在项目下添加

INCLUDEPATH += $$PWD xlsx
include(xlsx/qtxlsx.pri)

具体如下图图示:
在这里插入图片描述

2.QXlsx导出sqLite数据库中的所有数据

QXlsx导出sqLite数据库中的表名称,表列表,表数据等,
修改字体样式,合并单元格等导出(可以参考源码中examples文件下的案例)

//数据库是否合法
if(db.isValid())
    {
    //数据库是否能够打开
        if(db.open())
        {
            QXlsx::Document xlsx;
            QXlsx::Format format1;/*设置标题单元的样式*/
            QXlsx::Format format2;/*设置标题单元的样式*/
            format1.setFontSize(10);/*设置字体大小*/
            format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/
            format1.setBorderStyle(QXlsx::Format::BorderThin);/*边框样式*/
            format1.setFontBold(true);/*设置加粗*/

            format2.setFontSize(9);/*设置字体大小*/
            format2.setHorizontalAlignment(QXlsx::Format::AlignHCenter);/*横向居中*/
            format2.setBorderStyle(QXlsx::Format::BorderThin);/*边框样式*/
            if(!xlsx.selectSheet("sqlite_master")){/*在当前打开的xlsx文件中,找一个名字为ziv的sheet*/
                xlsx.addSheet("sqlite_master");//找不到的话就添加一个名为ziv的sheet
            }
            QSqlQuery SQls(db);
            SQls.prepare("select * from  sqlite_master");
             QList<QString> Tablist;
            if(SQls.exec())
            {
                int row=1;
                QSqlRecord sqlRecord(SQls.record());
                for(int i = 0; i < sqlRecord.count(); i++){
//                    qDebug() <<  sqlRecord.fieldName(i);
                    xlsx.write(row, i+1,sqlRecord.fieldName(i),format1);
                }

                row=2;
                while (SQls.next()) {
                     Tablist.append(SQls.value("name").toString());
                    for(int c=1;c<=SQls.record().count();c++)
                    {
                        xlsx.write(row, c,QString::fromUtf8(SQls.value(c-1).toByteArray()),format2);
                    }
                    row++;
                }

                for (int tab = 0; tab < Tablist.size(); ++tab) {
                   xlsx.addSheet(Tablist[tab]);//找不到的话就添加一个名为ziv的sheet
                   if(xlsx.selectSheet(Tablist[tab]))
                   {
                       SQls.prepare("PRAGMA table_info("+Tablist[tab]+")");
                       int row=1;
                       if(SQls.exec())
                       {
                           xlsx.write(row, 1,QString::fromUtf8("表字段"),format1);

                           row++;
                           QSqlRecord sqlRecord(SQls.record());
                           for(int i = 0; i < sqlRecord.count(); i++){
           //                    qDebug() <<  sqlRecord.fieldName(i);
                               xlsx.write(row, i+1,sqlRecord.fieldName(i),format1);
                           }

                           row++;
                           while (SQls.next()) {
                               for(int c=1;c<=SQls.record().count();c++)
                               {
                                   xlsx.write(row, c,QString::fromUtf8(SQls.value(c-1).toByteArray()),format2);
                               }
                               row++;
                           }

                       }

                        SQls.prepare("select * from "+Tablist[tab]);
                        if(SQls.exec())
                        {
                            xlsx.write(row, 1,QString::fromUtf8("表数据"),format1);
                            row++;
                            QSqlRecord sqlRecord(SQls.record());
                            for(int i = 0; i < sqlRecord.count(); i++){
            //                    qDebug() <<  sqlRecord.fieldName(i);
                                xlsx.write(row, i+1,sqlRecord.fieldName(i),format1);
                            }

                            row++;
                            while (SQls.next()) {
                                for(int c=1;c<=SQls.record().count();c++)
                                {
                                    xlsx.write(row, c,QString::fromUtf8(SQls.value(c-1).toByteArray()),format2);
                                }
                                row++;
                            }
                        }
                   }
                }
            }
            QFileDialog fileDialog;
            QString fileName = fileDialog.getSaveFileName(this,tr("Open File"),"/home",tr("Text File(*.xlsx)"));
            if(fileName.isEmpty())
                return;
            xlsx.saveAs(fileName);
            QMessageBox::information(NULL, "提示","操作完毕",QMessageBox::Ok , QMessageBox::Ok);
        }
         db.close();
    }
    else
    {
        QMessageBox::information(NULL, "提示","database is no open", QMessageBox::Ok , QMessageBox::Ok);
    }

最后得到execl如下图示结果:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

得鹿梦鱼、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值