最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實現(xiàn)將qsqlite數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出為Excel表格

 更新時間:2024年12月31日 10:05:17   作者:小灰灰搞電子  
這篇文章主要為大家詳細(xì)介紹了如何通過Qt實現(xiàn)將qsqlite數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出為Excel表格,文中的示例代碼簡潔易懂,有需要的小伙伴可以了解一下

1、首先添加庫

QT       += core gui sql axcontainer

sql:操作數(shù)據(jù)庫

axcontainer:操作Excel表格

2、采用多線程的方式導(dǎo)出

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");      //標(biāo)題為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);

    //開始設(shè)置表頭
    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);
    //開始設(shè)置表頭背景顏色
    cellInterior = writeRange->querySubObject("Interior");
    asset_null(cellInterior,tr("Excel打開失?。?));
    cellInterior->setProperty("Color", bkColor);

    //開始調(diào)整背景字體
    font = writeRange->querySubObject("Font");  //獲取單元格字體
    asset_null(font,tr("Excel打開失??!"));
    font->setProperty("Bold", true);  //字體加粗
    font->setProperty("Color", QColor(255, 0, 0));  //設(shè)置單元格字體顏色(紅色)
    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();
    //開始導(dǎo)出數(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ù)正在導(dǎo)出!"),row,writeRowCnt-2);
    }



    emit export_res_signal(finish,tr("數(shù)據(jù)導(dǎo)出成功!"),row,row);

    EXIT:

    if(this->excel != nullptr)
    {
        this->workbook->dynamicCall("Save()" );
        this->workbook->dynamicCall("Close()");  //關(guān)閉文件
        this->excel->dynamicCall("Quit()");//關(guān)閉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,"請選擇導(dǎo)入的文件夾!",
                                                         "",
                                                         QFileDialog::ShowDirsOnly);


    emit start_export_thread("sqltest.db","produceTable",savePath+"/"+QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss")+".xlsx");

4、結(jié)果查看

到此這篇關(guān)于Qt實現(xiàn)將qsqlite數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出為Excel表格的文章就介紹到這了,更多相關(guān)Qt數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出為Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

江阴市| 东丰县| 静宁县| 马山县| 临漳县| 凤山县| 赤水市| 繁昌县| 高州市| 新化县| 景宁| 财经| 枣庄市| 灵璧县| 金塔县| 河东区| 贵港市| 台安县| 二连浩特市| 孝昌县| 汨罗市| 景东| 新泰市| 保亭| 锡林浩特市| 洪江市| 双峰县| 平原县| 固安县| 洛川县| 尚义县| 运城市| 罗江县| 旌德县| 华容县| 甘南县| 禄丰县| 夏邑县| 阿拉善右旗| 嘉荫县| 汝阳县|