Qt将数据库中的数据导出为html

一、源码分享

cpp 复制代码
bool ReportFormUtils::exportReportHtml(QString &errString, const QString tableName, const QString savePathAndName, const QString tableTitle, const QString tableInfo)
{
    Q_UNUSED(errString)
    Q_UNUSED(tableName)
    Q_UNUSED(savePathAndName)

#define SINGLE_OPT_ROW 1000
    QString cmd;
    quint32 i,j;
    quint32 row,col;
    bool occerError = false;
    QString fileWriteContent;

    //判断文件是否存在
    QFile file(savePathAndName);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        errString = tr("文件打开失败!");
        return false;
    }
    QTextStream out(&file);


    out << QString("<!DOCTYPE html>") << Qt::endl;
    out << QString("<html>") << Qt::endl;
    out << QString("<head>") << Qt::endl;
    out << QString("<meta charset=\"utf-8\">") << Qt::endl;
    out << QString("<title>");
    out << tableTitle << QString("</title>") << Qt::endl;
    out << QString("</head>") << Qt::endl;
    out << QString("<body>") << Qt::endl;
    out << QString(tableInfo) << Qt::endl;
    out << QString("<table border=\"1\">") << Qt::endl;


    SqliteHelper* sqlHelper = SqliteHelper::getInstance();
    QSqlDatabase *db = sqlHelper->getDatabase();

    QSqlQuery sqlQuery(*db);
    QSqlRecord record;
    //开始设置表头
    cmd =QString("select * from %1").arg(tableName);
    sqlQuery.prepare(cmd);
    if(!sqlQuery.exec())
    {
        errString = tr("数据库表头获取失败!");
        occerError = true;
        goto exit;
    }
    record = sqlQuery.record();
    col = record.count();      //获取列数
    //qDebug()<<"col:"<<col;
    //写入表头
    out << QString("<tr>") << Qt::endl;
    for(i=0;i<col;++i)
    {
        out << formatCell(record.fieldName(i)) << Qt::endl;
    }
    out << QString("</tr>") << Qt::endl;


    //获取数据行数
    cmd =QString("SELECT count(*) FROM %1;").arg(tableName);
    sqlQuery.prepare(cmd);
    if(!sqlQuery.exec())
    {
        errString = tr("数据库行数获取失败!");
        occerError = true;
        goto exit;
    }
    sqlQuery.next();
    row = sqlQuery.value(0).toInt();

    //开始导出数据
    for(i =0;i < row; i+=SINGLE_OPT_ROW)
    {
        sqlQuery.clear();
        cmd =QString("select * from %1 limit %2,%3").arg(tableName).arg(i).arg(SINGLE_OPT_ROW);
        //qDebug()<<cmd;
        sqlQuery.prepare(cmd);
        if(!sqlQuery.exec())
        {
            errString = tr("数据库数据获取失败!");
            occerError = true;
            goto exit;
        }
        //读取数据
        while(sqlQuery.next())
        {
            out << QString("<tr>") << Qt::endl;
            for(j=0;j<col;j++)
            {
                out << formatCell(sqlQuery.value(j).toString()) << Qt::endl;
            }
            out << QString("</tr>") << Qt::endl;
        }
    }
    out << QString("</table>") << Qt::endl;
    out << QString("</body>") << Qt::endl;
    out << QString("</html>") <<Qt::endl;
    qDebug()<<"currentThreadId = "<<QThread::currentThreadId();
exit:
    file.close();
    db->close();
    delete db;
    if(occerError)
        return false;

    return true;
}

void ReportFormUtils::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);
}

QString ReportFormUtils::formatCell(QString val)
{
    QString outStr = "<td";

    //文本对齐
    outStr += " align=\"";
    outStr += "center";
    outStr += "\"";

    //跨列
    outStr += QString::asprintf(" colspan=\"%d\"", 1);

    //跨行
    outStr += QString::asprintf(" rowspan=\"%d\"", 1);

    //背景色 bgcolor
    outStr += QString::asprintf(" bgcolor=\"#%x\"", 0xcce8cf);

    outStr += ">";

    //内容
    if (val.size()) {
        outStr += val;
    }

    outStr += "</td>";
    return outStr;
}

二、导出文件查看
三、浏览器查看

相关推荐
zh15702320 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
代码AI弗森20 小时前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
摇滚侠21 小时前
expdp 查看帮助
java·数据库·oracle
流年似水~21 小时前
MCP协议实战:从零搭建一个让Claude能“看见“数据库的工具服务
数据库·人工智能·程序人生·ai·ai编程
2401_8714928521 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
Dxy12393102161 天前
HTML中的Canvas入门:从零开始绘制图形世界
html
志栋智能1 天前
超自动化安全:构建智能安全运营的核心引擎
大数据·运维·服务器·数据库·安全·自动化·产品运营
滑雪的企鹅.1 天前
HTML头部元信息避坑指南大纲
前端·html
小短腿的代码世界1 天前
Qt文件系统与IO深度解析:从QFile到异步文件操作
开发语言·qt
zhoutongsheng1 天前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python