1、首先添加库

QT       += core gui sql axcontainer

sql:操作数据库
axcontainer:操作Excel表格

2、采用多线程的方式导出

expoer.h

#ifndef REPORTEXPORTTHREAD_H
#define REPORTEXPORTTHREAD_H#include <QObject>
#include <QDebug>
#include <QThread>
#include <QFile>
#include <QFileInfo>
#include <QAxObject>
#include <QStandardPaths>
#include <QDir>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QThread>
#include <QFileDialog>
class ReportExportThread : public QObject
{Q_OBJECT
public:typedef enum{exporting,failed,finish,}ExportState;
signals:void export_res_signal(ExportState state,QString info,quint32 totalNum,quint32 exportNum);
public:explicit ReportExportThread(QObject *parent = nullptr);void export_thread_run(QString dbFile,QString dbTableName,QString xlsxFile);private:void castListListVariant2Variant(const QList<QList<QVariant> > &cells, QVariant &res);
private:QAxObject *excel = nullptr;//excel操作对象QAxObject *workbooks = nullptr;QAxObject* workbook = nullptr; //打开QAxObject *activeWorkBook = nullptr;QAxObject *worksheet = nullptr; //表单};#endif // REPORTEXPORTTHREAD_H

export.cpp

#include "reportExportThread.h"
#include "Windows.h"
ReportExportThread::ReportExportThread(QObject *parent): QObject{parent}
{}void ReportExportThread::export_thread_run(QString dbFile, QString dbTableName, QString xlsxFile)
{#define SINGLE_OPT_ROW 1000QVariant var;QVariantList varList;QList<QVariant> listVar;QList<QList<QVariant> > listListVar;quint32 writeRowCnt = 1;//写入起始行计数QString range;QString cmd;QAxObject *writeRange = nullptr;quint32 row,col;//数据库操作数据QSqlDatabase *db = nullptr;QSqlDatabase dbA;QSqlQuery *query = nullptr;QString dbConnectName = "export";QAxObject* cellInterior = nullptr;QAxObject *font = nullptr;QColor bkColor(255, 255, 0 ,50);quint32 i,j;#define asset_null(a,info)\{\if(a == nullptr)\{\emit export_res_signal(failed,info,0,0);\goto EXIT;\}\}\
qDebug()<<"export_thread_run   "<<QThread::currentThreadId();//判断数据库文件是否存在QFile dbFiles(dbFile);if(!dbFiles.exists()){emit export_res_signal(failed,tr("数据库文件不存在!"),0,0);return;}dbFiles.close();//判断表是否存在if(dbTableName.isEmpty()){emit export_res_signal(failed,tr("数据库表不存在!"),0,0);return;}//判断xlsx文件是否存在QFile xlsxFiles(xlsxFile);if(!xlsxFiles.exists()){if(!xlsxFiles.open(QIODevice::WriteOnly)){emit export_res_signal(failed,tr("xlsx文件创建失败!"),0,0);return;}xlsxFiles.close();}xlsxFiles.close();//判断文件是否为只读QFileInfo fileInfo(xlsxFile);fileInfo.setFile(fileInfo.filePath()+"/~$"+fileInfo.fileName());if(fileInfo.exists())          //判断一下,有没有"~$XXX.xlsx"文件存在,是不是为只读{emit export_res_signal(failed,tr("xlsx文件为只读文件!"),0,0);return;}fileInfo.setFile(xlsxFile);//创建QAxObject对象CoInitializeEx(NULL, COINIT_MULTITHREADED);this->excel = new QAxObject();//建立excel操作对象connect(excel,&QAxObject::exception,this,[](int code, const QString &source, const QString &desc, const QString &help){qDebug()<<code;qDebug()<<source;qDebug()<<desc;qDebug()<<help;});this->excel->setControl("Excel.Application");//连接Excel控件this->excel->setProperty("Visible", false);//显示窗体看效果this->excel->setProperty("DisplayAlerts", false);//显示警告看效果this->excel->setProperty("Caption", "Qt Excel");      //标题为Qt Excelthis->workbooks = excel->querySubObject("WorkBooks");this->workbook = workbooks->querySubObject("Open(const QString&)",QDir::toNativeSeparators(fileInfo.absoluteFilePath())); //打开this->activeWorkBook = excel->querySubObject("ActiveWorkBook");this->worksheet = activeWorkBook->querySubObject("Sheets(int)",1); //获取表单//创建QSqlDatabase对象
//    dbA = QSqlDatabase::addDatabase("QSQLITE",dbConnectName);
//    dbA.setDatabaseName("sqltest.db");db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE",dbConnectName));
//    db->addDatabase("QSQLITE",dbConnectName);db->setDatabaseName(dbFile);//打开数据库
//    if(!dbA.open())
//    {//        emit export_res_signal(failed,tr("数据库打开失败!"),0,0);
//        goto EXIT;
//    }
//    db = &dbA;if(!db->open()){emit export_res_signal(failed,tr("数据库打开失败!"),0,0);goto EXIT;}query = new QSqlQuery(*db);//开始设置表头cmd =QString("PRAGMA table_info(%1);").arg(dbTableName);if(!query->exec(cmd)){emit export_res_signal(failed,tr("数据库表头操作失败!"),0,0);goto EXIT;}col = query->record().count();      //获取列数listVar.clear();listListVar.clear();while(query->next()){listVar.append(QVariant(query->value(1).toString()));//qDebug()<<query->value(1).toString();}listListVar.append(listVar);this->castListListVariant2Variant(listListVar,var);range = QString("A1:%1%2").arg(QChar('A'+col-1)).arg(writeRowCnt++);//qDebug()<<range;writeRange = this->worksheet->querySubObject("Range(const QString&)",range);asset_null(writeRange,tr("Excel打开失败!"));writeRange->dynamicCall("Value", var);//开始设置表头背景颜色cellInterior = writeRange->querySubObject("Interior");asset_null(cellInterior,tr("Excel打开失败!"));cellInterior->setProperty("Color", bkColor);//开始调整背景字体font = writeRange->querySubObject("Font");  //获取单元格字体asset_null(font,tr("Excel打开失败!"));font->setProperty("Bold", true);  //字体加粗font->setProperty("Color", QColor(255, 0, 0));  //设置单元格字体颜色(红色)delete writeRange;//获取数据行数cmd =QString("SELECT count(*) FROM %1;").arg(dbTableName);if(!query->exec(cmd)){emit export_res_signal(failed,tr("数据库行数获取失败!"),0,0);goto EXIT;}query->next();row = query->value(0).toInt();//开始导出数据for(i =0;i < row; i+=SINGLE_OPT_ROW){listListVar.clear();query->clear();cmd =QString("select * from %1 limit %2,%3").arg(dbTableName).arg(i).arg(SINGLE_OPT_ROW);//qDebug()<<cmd;if(!query->exec(cmd)){emit export_res_signal(failed,tr("数据库数据获取失败!"),0,0);goto EXIT;}//读取数据int dataRowCnt = 0;while(query->next()){listVar.clear();for(j=0;j<col;j++){listVar.append(query->value(j));}listListVar.append(listVar);dataRowCnt++;}//写入数据this->castListListVariant2Variant(listListVar,var);range = QString("A%1:%2%3").arg(writeRowCnt).arg(QChar('A'+col-1)).arg(dataRowCnt+writeRowCnt-1);//qDebug()<<range;writeRange = this->worksheet->querySubObject("Range(const QString&)",range);asset_null(writeRange,tr("Excel打开失败!"));writeRange->dynamicCall("Value", var);writeRowCnt+=dataRowCnt;delete writeRange;emit export_res_signal(exporting,tr("数据正在导出!"),row,writeRowCnt-2);}emit export_res_signal(finish,tr("数据导出成功!"),row,row);EXIT:if(this->excel != nullptr){this->workbook->dynamicCall("Save()" );this->workbook->dynamicCall("Close()");  //关闭文件this->excel->dynamicCall("Quit()");//关闭exceldelete excel;excel = nullptr;}if(query != nullptr){delete query;query = nullptr;}if(db->isOpen()){db->close();delete db;QSqlDatabase::removeDatabase(dbConnectName);}
}void ReportExportThread::castListListVariant2Variant(const QList<QList<QVariant> > &cells, QVariant &res)
{QVariantList vars;const int rows = cells.size();for(int i=0;i<rows;++i){vars.append(QVariant(cells[i]));}res = QVariant(vars);
}

3、如何使用

 reportExportThread->start();QString savePath = QFileDialog::getExistingDirectory(this,"请选择导入的文件夹!","",QFileDialog::ShowDirsOnly);emit start_export_thread("sqltest.db","produceTable",savePath+"/"+QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss")+".xlsx");

4、结果查看


5、完整工程

完整工程点击下载

Qt 将qsqlite数据库中的数据导出为Excel表格相关推荐

  1. vb 读取oracle中的表格数据,如何将数据库信息读取导出excel表格中-VB 从SQL数据库中把数据导出到Excel表格中,怎么写?...

    VB 从SQL数据库中把数据导出到Excel表格中,怎么写? INSERT INTO OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Data Source=&q ...

  2. 如何将存储在MongoDB数据库中的数据导出到Excel中?

    将MongoDB数据库中的数据导出到Excel中,只需以下几个步骤: (1)首先,打开MongoDB安装目录下的bin文件夹,(C:\Program Files (x86)\MongoDB\Serve ...

  3. 数据库中的表导出成excel表格 并发送给客户端

    需求概述 excel相信大家都不陌生了,公司里的白领也好大学学生也好的老朋友了,今天说说后端数据库里的内容怎么导出成excel表格 技术手段 后端:Servlet,poi,MyBaits 前端:axi ...

  4. java生成excel到本地_java 将数据库中的数据导出成Excel文件 并保存到本地 将文件地址返回给前端...

    /*** 导出数据为Excel文件 * 下面注释的代码为直接响应到服务器的 *@paramrequest *@paramresponse *@return */@GetMapping("/e ...

  5. php 链接excel表格数据,php 怎么把数据导出到excel表格?php 连接 excel表格数据库数据...

    php 怎么把数据导出到excel表格 php 把数据导出到excel表多种方法如使用 phpExcel 等,以下代码是直接通 header 生成 excel 文件的代码示例: header(&quo ...

  6. POI:从Excel文件中读取数据,向Excel文件中写入数据,将Excel表格中的数据插入数据库,将数据库中的数据添加到Excel表

    POI 简介: POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能. ...

  7. Java实现Excel导入数据库,数据库中的数据导入到Excel

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 实现的功能: Java实现Excel导入数据库,如果存在就更新 数据库中的数据导入到Excel 1. ...

  8. 把数据库中的数据制作成Excel数据

    把数据库中的数据制作成Excel数据 如果我们在使用Excel的时候,需要把数据库中的数据制作成Excel数据透视表,我们该怎么操作呢?如果数据在数据库中,我们不用把数据导入到工作表中,我们可以直接以 ...

  9. mysql 数据透视_把数据库中的数据制作成Excel数据透视表

    如果我们在使用Excel的时候,需要把数据库中的数据制作成Excel数据透视表,我们该怎么操作呢?如果数据在数据库中,我们不用把数据导入到工作表中,我们可以直接以数据库的全部数据或者部分数据制作数据透 ...

最新文章

  1. Nagios—服务和性能监控
  2. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
  3. java cron表达式_Java 程序员都应该去使用一下这款强大的国产工具类库
  4. [Step By Step]SAP HANA PAL指数回归预测分析Exponential Regression编程实例EXPREGRESSION(模型)...
  5. java8 base64_Java 8中的Base64 –加入乐趣为时不晚
  6. 在mojoportal项目中发邮件使用的是dotnetopenmail
  7. 女大学生毕业相亲程序员,吃了一顿大排档,一看车钥匙后犹豫了!
  8. SCOM2016 OMSDK 服务无法启动
  9. TFS环境搭建--MSSQL2008安装
  10. oracle rac实例停止,oracle rac启停命令使用实例
  11. windows 和 ubuntu服务器之间用Xshell互传文件
  12. 屏蔽搜狗输入法快捷键
  13. 郑立:一个80后互联网创业神话的倒掉
  14. 关于火星坐标、偏移、加偏和纠偏、无偏的理解
  15. poj1985和poj1849(树的直径)
  16. 【Arduino实验12 1602 LCD显示】
  17. MySQL批量修改表的编码和字符集
  18. IDEA在创建包时如何把包分开实现自动分层
  19. 微软帝国踏上Windows7征途(图)
  20. 笔记本电脑内存升级经历

热门文章

  1. 安装vue-element-admin出现 ls-remote -h -t ssh://git@github.com/sohee-lee7/Squire.git错误
  2. 1696: [Usaco2007 Feb]Building A New Barn新牛舍
  3. 终端安全-设备指纹篇
  4. UEFI 之 Capsule Update (固件更新)
  5. 破产清算与注册资金有关系吗
  6. 第二章:如何学习自动化测试
  7. html5 网页便利贴,【实例】html5中使用localStorage实现简易的便利贴网页
  8. 【排错】 Outlook邮件正文显示空白问题的排错
  9. [Unity学习笔记:FPS游戏制作(3)]子弹拖尾,碰撞与枪口火焰效果
  10. golang 判断字符串是否为数字字符串