Qt QTableWidget表格导出为html表格

这篇博客介绍了如何将Qt的QTableWidget内容导出为HTML表格,便于数据对比和通用场景使用。提供了完整的Qt工程示例,包括代码和效果展示,支持设置表格的对齐方式、跨行、跨列和背景色。通过点击按钮,可以将QTableWidget的数据保存为HTML文件,方便在不同平台和设备上查看。
摘要由CSDN通过智能技术生成

                                                       Qt QTableWidget表格导出为html表格

一、简述

        记--QTableWidget导出为html表格。

用途举例:

               1、数据对比,比如数据库数据,需要对比合并,此时可转为文本,然后使用beyong compare、meld等工具进行对比差异。

               2、通用性场景,相对一excel表格,excel表格需要office或wps工具查看,html只需要又浏览器即可,移动端,PC端(windos、linux、IOS均可),且数据轻巧便携。

例子打包:下载:https://wwa.lanzoui.com/iusW5pspozc 密码:hd8v

二、效果

三、工程结构

 

 

四、测试代码

HtmlTable.pro文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = HtmlTable
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    htmltable.cpp

HEADERS  += mainwindow.h \
    htmltable.h

FORMS    += mainwindow.ui

htmltable.h文件

#ifndef HTMLTABLE_H
#define HTMLTABLE_H

#include <QList>

#define TABEL_TD_TEXT_MAX_LEN   (256)

enum {
    ALIGN_LEFT      = 1,
    ALIGN_RIGHT     = 2,
    ALIGN_CENTER    = 3
};

enum {
    Out_FAIL    = -1,
    Out_OK      = 0,
};

typedef struct {
    unsigned int align;
    unsigned int colspan;
    unsigned int rowspan;
    unsigned int bgColor;
    char text[TABEL_TD_TEXT_MAX_LEN];
} Table_TD_t;

typedef struct {
    QList<Table_TD_t> td_list;
} Table_TR_t;

typedef struct {
    QString title;
    QString info;
    QList<Table_TR_t> tr_list;
} Table_t;

int OutHtmlTable(QString filePath, Table_t *table);

#endif // HTMLTABLE_H

mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#define MIN(a,b)    ((a)>(b)?(a):(b))
#define TEST_TABLE_ROW_COUNT    (5)
#define TEST_TABLE_COL_COUNT    (10)
#define DATE_TIME_STR_MAX_LEN   (32)

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButtonTestHtmlTable_clicked();

    void on_pushButtonExportHtmltable_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 htmltable.cpp文件

#include "htmltable.h"
#include <QFile>
#include <QTextStream>

//文本对齐ID转字符串
static QString Align2Str(int align)
{
    QString align_str = "";
    switch (align)
    {
        case ALIGN_LEFT:
            align_str = "left";
            break;
        case ALIGN_RIGHT:
            align_str = "right";
            break;
        case ALIGN_CENTER:
            align_str = "center";
            break;
    }
    return align_str;
}

//格式化TD行
static QString FormatTD(Table_TD_t &td) {
    QString td_str = "<td";

    //文本对齐
    if (0 < td.align) {
        td_str += " align=\"";
        td_str += Align2Str(td.align);
        td_str += "\"";
    }

    //跨列
    if (0 < td.colspan) {
        td_str += QString::asprintf(" colspan=\"%d\"", td.colspan);
    }

    //跨行
    if (0 < td.rowspan) {
        td_str += QString::asprintf(" rowspan=\"%d\"", td.rowspan);
    }

    //背景色 bgcolor
    if (0 < td.bgColor) {
        td_str += QString::asprintf(" bgcolor=\"#%x\"", td.bgColor);
    }

    td_str += ">";

    //内容
    if (strnlen(td.text, sizeof(td.text))) {
        td_str += QString::fromLocal8Bit(td.text);
    }

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

//输出Html表格
int OutHtmlTable(QString filePath, Table_t *table)
{
    int i;
    int j;
    int tr_count;
    int td_count;

    if (NULL == table) {
        return Out_FAIL;
    }

    QFile file(filePath);
    if( file.open(QIODevice::WriteOnly | QIODevice::Text) ) {
        QTextStream out(&file);

        out << QString("<!DOCTYPE html>") << endl;
        out << QString("<html>") << endl;
        out << QString("<head>") << endl;
        out << QString("<meta charset=\"utf-8\">") << endl;
        out << QString("<title>");
        out << table->title << QString("</title>") << endl;
        out << QString("</head>") << endl;
        out << QString("<body>") << endl;
        out << QString(table->info) << endl;
        out << QString("<table border=\"1\">") << endl;
        //数据
        tr_count = table->tr_list.count();
        for (i = 0; i < tr_count; ++i) {
            out << QString("<tr>") << endl;

            //td 行数据
            td_count = table->tr_list[i].td_list.count();
            for (j = 0; j < td_count; ++j) {
                out << FormatTD(table->tr_list[i].td_list[j]) << endl;
            }

            out << QString("</tr>") << endl;
        }

        out << QString("</table>") << endl;
        out << QString("</body>") << endl;
        out << QString("</html>") << endl;

        file.close();
        return Out_OK;
    }
    return Out_FAIL;
}

 main.cpp文件

#include "mainwindow.h"
#include <QApplication>
#include <QTextCodec>

int main(int argc, char *argv[])
{

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "htmltable.h"
#include <QMessageBox>
#include <QDateTime>
#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle(tr("Html表格测试"));
    ui->tableWidget->setRowCount(3);
    ui->tableWidget->setColumnCount(2);
    QStringList strList ;
    strList << "努力" << "奋斗";
    ui->tableWidget->setHorizontalHeaderLabels(strList);
    ui->tableWidget->verticalHeader()->setVisible(false);
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("加油"));
    ui->tableWidget->setItem(0,1,new QTableWidgetItem("坚持"));
    ui->tableWidget->setItem(1,0,new QTableWidgetItem("勤奋"));
    ui->tableWidget->setItem(1,1,new QTableWidgetItem("学习"));
    ui->tableWidget->setItem(2,0,new QTableWidgetItem("世界"));
    ui->tableWidget->setItem(2,1,new QTableWidgetItem("和平"));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButtonTestHtmlTable_clicked()
{
    int i;
    int j;
    int row_count = TEST_TABLE_ROW_COUNT;
    int col_count = TEST_TABLE_COL_COUNT;
    Table_t table;
    table.title = "Hello Html Table";
    table.info = QString("Table Create Time:") + \
            QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

    //首行
    Table_TD_t table_td_head = {ALIGN_CENTER, 0, 0, 0, ""};
    Table_TR_t table_tr_head;

    //序号列
    strcpy(table_td_head.text, "No.");
    table_tr_head.td_list.append(table_td_head);

    //合并2列
    table_td_head.colspan = 2;
    table_td_head.bgColor = 0xcce8cf;
    strcpy(table_td_head.text, "标题1");
    table_tr_head.td_list.append(table_td_head);

    //合并5列
    table_td_head.colspan = 5;
    table_td_head.bgColor = 0x99CCFF;
    strcpy(table_td_head.text, "标题2");
    table_tr_head.td_list.append(table_td_head);

    //合并2列
    table_td_head.colspan = 3;
    table_td_head.bgColor = 0x99FF99;
    strcpy(table_td_head.text, "标题3");
    table_tr_head.td_list.append(table_td_head);
    table.tr_list.append(table_tr_head);

    //表格内容1
    Table_TD_t table_td = {0, 0, 0, 0, ""};
    for (i = 0; i < row_count; i++) {
        Table_TR_t table_tr;
        sprintf(table_td.text, "%d", i+1);
        table_tr.td_list.append(table_td);
        for (j = 0; j < col_count; j++) {
            sprintf(table_td.text, "Hello %d", j);
            table_tr.td_list.append(table_td);
        }
        table.tr_list.append(table_tr);
    }

    //合并行测试
    Table_TD_t table_td2 = {ALIGN_CENTER, 0, 0, 0, ""};
    Table_TR_t table_tr2;

    table_td2.rowspan = col_count;
    strcpy(table_td2.text, "合并行测试");
    table_tr2.td_list.append(table_td2);
    table.tr_list.append(table_tr2);

    //表格内容2
    Table_TD_t table_td3 = {0, 0, 0, 0, ""};
    for (i = 0; i < row_count; i++) {
        Table_TR_t table_tr;
        sprintf(table_td3.text, "%d", i+1);
        table_tr.td_list.append(table_td3);
        for (j = 0; j < col_count - 1; j++) {
            sprintf(table_td3.text, "Hello %d", j);
            table_tr.td_list.append(table_td3);
        }
        table.tr_list.append(table_tr);
    }

    //打开文件对话框,返回选择文件的绝对路径  父窗体   标题      默认打开路径(不写就会打开当前路径)
    QString save_file = QFileDialog::getSaveFileName(this, \
                                                     tr("保存文件"), \
                                                     "C:\\Users\\Liang\\Desktop\\test1.html", \
                                                     tr("html文件(*.html)"));
    if (0 >= save_file.length()) {
        return;
    }

    if (Out_OK == OutHtmlTable(save_file, &table)) {
        QMessageBox::information(this, tr("提示"), tr("已输出到")+save_file);
    } else {
        QMessageBox::critical(this, tr("提示"), tr("导出html失败!"));
    }
}

void MainWindow::on_pushButtonExportHtmltable_clicked()
{
    int row;
    int col;
    int row_count = ui->tableWidget->rowCount();
    int col_count = ui->tableWidget->columnCount();
    QString str = "";

    //打开文件对话框,返回选择文件的绝对路径  父窗体   标题      默认打开路径(不写就会打开当前路径)
    QString save_file = QFileDialog::getSaveFileName(this, \
                                                     tr("保存文件"), \
                                                     "C:\\Users\\Liang\\Desktop\\test1.html", \
                                                     tr("html文件(*.html)"));
    if (0 >= save_file.length()) {
        return;
    }

    Table_t table;
    table.title = "Hello Html Table";
    table.info = QString("Table Create Time:") + \
            QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

    //首行
    Table_TD_t table_td_head = {ALIGN_CENTER, 0, 0, 0, ""};
    Table_TR_t table_tr_head;
    for (col = 0; col < col_count; col++) {
        str = ui->tableWidget->horizontalHeaderItem(col)->text();
        strncpy(table_td_head.text, \
                str.toLocal8Bit().data(),
                sizeof(table_td_head.text)-1);
        table_tr_head.td_list.append(table_td_head);
    }
    table.tr_list.append(table_tr_head);

    //表格内容
    Table_TD_t table_td = {0, 0, 0, 0, ""};
    for (row = 0; row < row_count; row++) {
        Table_TR_t table_tr;
        for(col = 0; col < col_count; col++) {
            str = ui->tableWidget->item(row, col)->text();
            strncpy(table_td.text, \
                    str.toLocal8Bit().data(),
                    sizeof(table_td.text)-1);
            table_tr.td_list.append(table_td);
        }
        table.tr_list.append(table_tr);
    }


    if (Out_OK == OutHtmlTable(save_file, &table)) {
        QMessageBox::information(this, tr("提示"), tr("已输出到")+save_file);
    } else {
        QMessageBox::critical(this, tr("提示"), tr("导出html失败!"));
    }
}

 

五、待完善

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值