Qt實現(xiàn)將qsqlite數(shù)據(jù)庫中的數(shù)據(jù)導出為Excel表格
更新時間:2024年12月31日 10:05:17 作者:小灰灰搞電子
這篇文章主要為大家詳細介紹了如何通過Qt實現(xiàn)將qsqlite數(shù)據(jù)庫中的數(shù)據(jù)導出為Excel表格,文中的示例代碼簡潔易懂,有需要的小伙伴可以了解一下
1、首先添加庫
QT += core gui sql axcontainer
sql:操作數(shù)據(jù)庫
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 1000 QVariant var; QVariantList varList; QList<QVariant> listVar; QList<QList<QVariant> > listListVar; quint32 writeRowCnt = 1;//寫入起始行計數(shù) QString range; QString cmd; QAxObject *writeRange = nullptr; quint32 row,col; //數(shù)據(jù)庫操作數(shù)據(jù) 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(); //判斷數(shù)據(jù)庫文件是否存在 QFile dbFiles(dbFile); if(!dbFiles.exists()) { emit export_res_signal(failed,tr("數(shù)據(jù)庫文件不存在!"),0,0); return; } dbFiles.close(); //判斷表是否存在 if(dbTableName.isEmpty()) { emit export_res_signal(failed,tr("數(shù)據(jù)庫表不存在!"),0,0); return; } //判斷xlsx文件是否存在 QFile xlsxFiles(xlsxFile); if(!xlsxFiles.exists()) { if(!xlsxFiles.open(QIODevice::WriteOnly)) { emit export_res_signal(failed,tr("xlsx文件創(chuàng)建失??!"),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); //創(chuàng)建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 Excel this->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); //獲取表單 //創(chuàng)建QSqlDatabase對象 // dbA = QSqlDatabase::addDatabase("QSQLITE",dbConnectName); // dbA.setDatabaseName("sqltest.db"); db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE",dbConnectName)); // db->addDatabase("QSQLITE",dbConnectName); db->setDatabaseName(dbFile); //打開數(shù)據(jù)庫 // if(!dbA.open()) // { // emit export_res_signal(failed,tr("數(shù)據(jù)庫打開失敗!"),0,0); // goto EXIT; // } // db = &dbA; if(!db->open()) { emit export_res_signal(failed,tr("數(shù)據(jù)庫打開失敗!"),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("數(shù)據(jù)庫表頭操作失敗!"),0,0); goto EXIT; } col = query->record().count(); //獲取列數(shù) 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; //獲取數(shù)據(jù)行數(shù) cmd =QString("SELECT count(*) FROM %1;").arg(dbTableName); if(!query->exec(cmd)) { emit export_res_signal(failed,tr("數(shù)據(jù)庫行數(shù)獲取失?。?),0,0); goto EXIT; } query->next(); row = query->value(0).toInt(); //開始導出數(shù)據(jù) 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("數(shù)據(jù)庫數(shù)據(jù)獲取失敗!"),0,0); goto EXIT; } //讀取數(shù)據(jù) int dataRowCnt = 0; while(query->next()) { listVar.clear(); for(j=0;j<col;j++) { listVar.append(query->value(j)); } listListVar.append(listVar); dataRowCnt++; } //寫入數(shù)據(jù) 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("數(shù)據(jù)正在導出!"),row,writeRowCnt-2); } emit export_res_signal(finish,tr("數(shù)據(jù)導出成功!"),row,row); EXIT: if(this->excel != nullptr) { this->workbook->dynamicCall("Save()" ); this->workbook->dynamicCall("Close()"); //關閉文件 this->excel->dynamicCall("Quit()");//關閉excel delete 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、結果查看
到此這篇關于Qt實現(xiàn)將qsqlite數(shù)據(jù)庫中的數(shù)據(jù)導出為Excel表格的文章就介紹到這了,更多相關Qt數(shù)據(jù)庫數(shù)據(jù)導出為Excel內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言數(shù)據(jù)結構順序表中的增刪改(尾插尾刪)教程示例詳解
這篇文章主要為大家介紹了C語言數(shù)據(jù)結構順序表中的增刪改教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02