QT应用编程: 导出QTableWidget数据写入到Execl表格

December 17, 2023
测试
测试
测试
测试
13 分钟阅读

一、环境介绍

操作系统介绍:win10 64位

QT版本: 5.12.6

二、功能介绍

将QTableWidget表格编辑的数据写入到本地execl表格文件中保存。

Header: #include <QAxObject> 
qmake:  QT += axcontainer

三、示例代码

/*
日期: 2020-12-23
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 导出数据到execl表格
*/
void Widget::SaveExeclData()
{
    int value;
    value=QMessageBox::question(this,"提示","确定导出表格数据到Execl?",
    QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes);
    if(value==QMessageBox::No)return;

    //获取保存的文件路径
    QString filepath = QFileDialog::getSaveFileName(this, "选择保存文件名称",
    QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),
                        "Excel 文件(*.xls *.xlsx)");

    qDebug()<<"filepath:"<<filepath;

    if(filepath.isEmpty())
    {
        QMessageBox::critical(this,"提示","未选择正确的文件.导出失败.",
        QMessageBox::Ok,QMessageBox::Ok);
        return;
    }

    QAxObject *excel = new QAxObject(this);
    if(excel->setControl("Excel.Application"))
    {
        excel->dynamicCall("SetVisible (bool Visible)","false");
        excel->setProperty("DisplayAlerts", false);
        QAxObject *workbooks = excel->querySubObject("WorkBooks");
        workbooks->dynamicCall("Add");
        QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
        QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
        QTableWidget *table=ui->tableWidget_Measure;
        int i,j,colcount=table->columnCount(),rowcount=table->rowCount();
        QAxObject *cell,*col;
        cell=worksheet->querySubObject("Cells(int,int)", 1, 1);
        cell->dynamicCall("SetValue(const QString&)", "title");
        cell->querySubObject("Font")->setProperty("Size", 18);
        worksheet->querySubObject("Range(const QString&)", "1:1")->setProperty("RowHeight", 60);
        QString cellTitle;
        cellTitle.append("A1:");
        cellTitle.append(QChar(colcount  + 'A'));
        cellTitle.append(QString::number(1));
        QAxObject *range = worksheet->querySubObject("Range(const QString&)", cellTitle);
        range->setProperty("WrapText", true);
        range->setProperty("MergeCells", true);
        range->setProperty("HorizontalAlignment", -4108);
        range->setProperty("VerticalAlignment", -4108);

        //行的表头
        for(i=0;i<colcount;i++)
        {
            QString columnName;
            cell=worksheet->querySubObject("Cells(int,int)", 2, i+2);
            columnName=table->horizontalHeaderItem(i)->text();
            cell->dynamicCall("SetValue(const QString&)", columnName);//打印到excel
            cell->querySubObject("Font")->setProperty("Bold", true);
            cell->querySubObject("Interior")->setProperty("Color",QColor(191, 191, 191));
            cell->setProperty("HorizontalAlignment", -4108);
            cell->setProperty("VerticalAlignment", -4108);
        }

        //列的表头
        for(i=0;i<rowcount;i++)
        {
            //读取
            QString rowName;
            //修改内容
            cell=worksheet->querySubObject("Cells(int,int)", i+3, 1);
            //获取垂直表头
            // rowName=table->verticalHeaderItem(i)->text();
            //horizontalHeaderItem(i)->text();//获取此处的文本内容,i是列号,就是第几列中的文本内容
            //写表头数据
            cell->dynamicCall("SetValue(const QString&)",i);
            cell->querySubObject("Font")->setProperty("Bold", true);
            cell->querySubObject("Interior")->setProperty("Color",QColor(191, 191, 191));
            cell->setProperty("HorizontalAlignment", -4108);
            cell->setProperty("VerticalAlignment", -4108);
        }
		
        //数据
        for(i=0;i<table->rowCount();i++)
        {
            for (j=0;j<colcount;j++)
            {
                QString rowdata;
                rowdata=table->item(i,j)->text();
                worksheet->querySubObject("Cells(int,int)", i+3, j+2)->dynamicCall("SetValue(const QString&)",rowdata);
            }
        }
		
        QString lrange;
        lrange.append("A2:");
        lrange.append(colcount + 'A');
        lrange.append(QString::number(table->rowCount() +2));//终止行
        range = worksheet->querySubObject("Range(const QString&)", lrange);
        range->querySubObject("Borders")->setProperty("LineStyle", QString::number(1));
        range->querySubObject("Borders")->setProperty("Color", QColor(0, 0, 0));
        QString rowsName;
        rowsName.append("A2:");
        rowsName.append(colcount + 'A');
        rowsName.append(QString::number(table->rowCount() + 2));
        range = worksheet->querySubObject("Range(const QString&)", rowsName);
        range->setProperty("RowHeight", 20);
        range->setProperty("ColumnWidth", 60);
        workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));
        workbook->dynamicCall("Close()");
        excel->dynamicCall("Quit()");
        delete excel;
        excel=nullptr;
        if(QMessageBox::question(nullptr,"完成","文件已经导出,是否现在打开?",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
        {
            QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(filepath)));
        }
    }
    else
    {
        QMessageBox::warning(nullptr,"错误","未能创建 Excel 对象,请安装 Microsoft Excel。",QMessageBox::Apply);
    }
}

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多