欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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ù)用法總結

    C語言中返回錯誤信息的相關函數(shù)用法總結

    這篇文章主要介紹了C語言中返回錯誤信息的相關函數(shù)用法總結,包括strerror()函數(shù)和perror()函數(shù)以及ferror()函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • 使用C語言求N的階乘的方法

    使用C語言求N的階乘的方法

    這篇文章主要介紹了使用C語言求N的階乘的方法,包括一道相關的ACM題目示例,需要的朋友可以參考下
    2015-08-08
  • 詳解Qt如何使用QtWebApp搭建Http服務器

    詳解Qt如何使用QtWebApp搭建Http服務器

    這篇文章主要為大家詳細介紹了Qt如何使用QtWebApp搭建Http服務器,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • 用C語言實現(xiàn)五子棋小游戲

    用C語言實現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語言數(shù)據(jù)結構順序表中的增刪改(尾插尾刪)教程示例詳解

    C語言數(shù)據(jù)結構順序表中的增刪改(尾插尾刪)教程示例詳解

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結構順序表中的增刪改教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • 配合ffmpeg接口獲取視頻音頻媒體信息詳解

    配合ffmpeg接口獲取視頻音頻媒體信息詳解

    這篇文章主要為大家介紹了配合ffmpeg接口獲取視頻音頻媒體信息詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 詳解C++中future和promise的使用

    詳解C++中future和promise的使用

    future和promise的作用是在不同線程之間傳遞數(shù)據(jù),這篇文章主要為大家詳細介紹了C++中future和promise的具體使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-05-05
  • C++程序設計-五子棋

    C++程序設計-五子棋

    本文將以簡單的存儲結構及簡單的運算,條件語句,分支語句,循環(huán)語句結合,帶來一個雙人對戰(zhàn)版五子棋,這是一個簡單的模型,實現(xiàn)了五子棋最最基本的功能。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • C++實現(xiàn)的歸并排序算法詳解

    C++實現(xiàn)的歸并排序算法詳解

    這篇文章主要介紹了C++實現(xiàn)的歸并排序算法,結合實例形式詳細分析了歸并排序算法的原理、實現(xiàn)步驟、操作技巧與使用方法,需要的朋友可以參考下
    2017-05-05
  • C語言面試常見考點排序總結

    C語言面試常見考點排序總結

    深處開發(fā)崗,其實排序也是繞不開的環(huán)節(jié),其中冒泡排序,選擇排序,插入排序,歸并排序,快速排序,堆排序也是我在秋招以來頻繁問到的技術點,今天我們來重點聊聊排序
    2021-11-11

最新評論