这是我记录Qt学习过程的第6篇心得文章,主要是方便自己编写的应用程序导出Excel数据的,走了不少弯路直接上代码。

实现代码:
//人员信息导出
ui->pbtn2->setEnabled(false);
// 打开文件对话框,选择 excel文件
QString fileName = QFileDialog::getSaveFileName(this, "人员信息导出", "personnel", "excel文件(*.xlsx)");
if (fileName.isEmpty()) return;
this->fun_statusBar("人员信息导出 " + fileName);

// 创建Excel应用程序对象
QAxObject *excel = new QAxObject("Excel.Application");
if (!excel->isNull())
{
    this->fun_statusBar("人员信息导出 创建Excel对象成功!");
    excel->setProperty("Visible", false);  //设置为false以在后台运行
    // excel->setProperty("SetVisible(bool)", false);  //设置为false以在后台运行
    // 新建工作簿
    QAxObject *workbooks = excel->querySubObject("Workbooks");
    this->fun_statusBar("人员信息导出 新建Excel工作簿成功!");
    // 添加一个工作簿
    QAxObject *workbook = workbooks->querySubObject("Add");
    this->fun_statusBar("人员信息导出 添加Excel工作簿成功!");
    QAxObject *worksheets = workbook->querySubObject("Worksheets");
    // 获取第一个工作簿
    // QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);
    QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1);
    this->fun_statusBar("人员信息导出 打开Excel获取第一个工作表成功!");
    // 设置工作表标题
    worksheet->setProperty("Name", "personnel");
    // 获取表格数据模型 根据自己表格使用的数据模型更改为 QAbstractItemModel获其他
    QSqlRelationalTableModel *itemModel = qobject_cast<QSqlRelationalTableModel *>(ui->tableView->model());
    if (itemModel)
    {
        this->fun_statusBar("人员信息导出 打开数据表成功!");
        int rowCount = itemModel->rowCount();
        int colCount = itemModel->columnCount();
        QString str = "";
        // 写入表头
        for (int col = 1; col <= colCount; ++col)
        {
            QString data = itemModel->headerData(col - 1, Qt::Horizontal).toString();
            QAxObject *cell = worksheet->querySubObject("Cells(int,int)", 1, col);
            cell->setProperty("Value", data);
            str += data + " ";
            // 设置文字格式
            QAxObject *range = cell->querySubObject("Characters()");
            QAxObject *font = range->querySubObject("Font");
            font->setProperty("Name", "黑体");                // 字体名称
            font->setProperty("Size", 12);                    // 字体大小
            font->setProperty("Color", 0x000000);             // 字体颜色(蓝色)
            cell->setProperty("HorizontalAlignment", -4108);  // 水平居中
            cell->setProperty("VerticalAlignment", -4108);    // 垂直居中
            //设置列宽
            QAxObject *column = worksheet->querySubObject("Columns(int)", col + 1);
            int columnWidth{};
            switch (col)
            {
                case 0:
                case 2:
                case 3:
                    columnWidth = 10;
                    break;
                case 7:
                    columnWidth = 12;
                    break;
                case 8:
                    columnWidth = 50;
                    break;
                case 11:
                case 12:
                    columnWidth = 14;
                    break;
                default:
                    columnWidth = 20;
                    break;
            }
            column->setProperty("ColumnWidth", columnWidth);  // 设置每列的宽度根据实际自己调整
            delete font;
            delete range;
            delete column;
            delete cell;
        }
        qDebug() << "人员信息导出:表头写入 " + str << Qt::endl;
        // 写入数据
        for (int row = 2; row <= rowCount; ++row)
        {
            str = "";
            for (int col = 1; col <= colCount; ++col)
            {
                QVariant data = itemModel->index(row - 2, col - 1).data();
                QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, col);
                // 前缀单引号以确保作为文本处理
                if (data.toString().length() == 18 && data.toString().contains(QRegExp("\\d{18}")))
                {
                    // 检查是否是身份证号(假设身份证号是18位数字)
                    cell->dynamicCall("SetValue(const QVariant&)", QString("'") + data.toString());
                }
                else if (data.toString().length() == 11 && data.toString().contains(QRegExp("\\d{11}")))
                {
                    // 检查是否是手机号码(假设手机号码是11位数字)
                    cell->dynamicCall("SetValue(const QVariant&)", QString("'") + data.toString());
                }
                else
                {
                    cell->dynamicCall("SetValue(const QVariant&)", data.toString());
                }
                // 设置单元格格式为文本
                cell->setProperty("NumberFormat", "@");           // "@" 表示文本格式
                cell->setProperty("HorizontalAlignment", -4108);  // 水平居中
                cell->setProperty("VerticalAlignment", -4108);    // 垂直居中
                str += data.toString() + " ";
                delete cell;
            }
            qDebug() << "人员信息导出:数据写入 " + str << Qt::endl;
        }
        this->fun_statusBar("人员信息导出 数据表数据写入成功!");
        // 保存工作簿
        if (!workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(fileName)).toBool())
        {
            skysonya.messageBox("warning", wTitle, "保存Excel文件失败!");
        }
    }
    else
    {
        skysonya.messageBox("warning", wTitle, "打开数据表失败!");
    }
    // 关闭工作簿
    workbook->dynamicCall("Close (bool)", false);
    // 退出Excel应用程序
    excel->dynamicCall("Quit()");
    // 清理对象
    delete worksheet;
    delete worksheets;
    delete workbook;
    delete workbooks;
    delete excel;
}
else
{
    skysonya.messageBox("warning", wTitle, "创建Excel对象失败!");
}
ui->pbtn2->setEnabled(true);
this->fun_statusBar()为自己构建的函数,代码如下:
//状态栏信息显示
void MainWindow::fun_statusBar(QString str)
{
    str = " 提示信息:" + str;
    this->statusBar()->showMessage(str);
    qDebug() << str << Qt::endl;
}

skysonya.messageBox()函数前文中已有介绍。

10-27 08:05