当前位置: 首页 > article >正文

Qt 使用QXlsx将QTableView数据导出到Excel表格

这是我记录Qt学习过程的第7篇心得文章,上次写到使用QAxObject将QTableView数据导出到Excel表格,使用过程中发现,执行效率不高,而且当电脑同时安装Office和WPS时,还经常出错,于是就研究了QXlsx,发现利用QXlsx处理Excel真的太方便了,啥也不说,上代码。

实现代码:
//将QTableView数据写入EXcel,使用QXlsx
bool Skysonya::writeTableviewToExcelByQXlsx(const QString &fileName, QString tableName, QTableView *tableView,QString strTitle)
{
    QAbstractTableModel *model = qobject_cast<QAbstractTableModel *>(tableView->model());
    int rowCount = model->rowCount();
    int colCount = model->columnCount();
    QXlsx::Document xlsx;
    xlsx.addSheet(tableName);

    int colW[200] = {};
    // 写入表头并设置字体
    QXlsx::Format headerFormat;
    headerFormat.setFontName("黑体");  //设置字体
    headerFormat.setFontSize(12);      //设置字号
    headerFormat.setHorizontalAlignment(QXlsx::Format::AlignHCenter);  //设置单元格居中
    headerFormat.setBorderStyle(QXlsx::Format::BorderThin);            //设置单元格边线
    // 写入表头
    for (int col = 0; col < colCount + 1; ++col)
    {
        QString cell;
        if (col == 0)
            cell = "序号";  //增加序号列
        else
            cell = model->headerData(col - 1, Qt::Horizontal).toString();
        xlsx.write(1, col + 1, cell, headerFormat);
        // 设置列宽
        int columnWidth = cell.toLocal8Bit().length() + 2;  //计算字符串长度,中文字符占位2
        if (columnWidth > colW[col])
        {
            colW[col] = columnWidth;
            xlsx.setColumnWidth(col + 1, columnWidth);  // 设置每列宽度为字符数+2
        }
    }
    // qDebug() << "1:" << ArrayToString(colW, colCount) << Qt::endl;
    qDebug() << strTitle + ":数据表头写入成功!" << Qt::endl;
    QXlsx::Format itemFormat;
    itemFormat.setHorizontalAlignment(QXlsx::Format::AlignHCenter);
    itemFormat.setBorderStyle(QXlsx::Format::BorderThin);

    // 写入数据
    for (int row = 0; row < rowCount; ++row)
    {
        for (int col = 0; col < colCount + 1; ++col)
        {
            QString cell;
            if (col == 0)
                cell = QString::number(row + 1);
            else
                cell = model->data(model->index(row, col - 1)).toString();
            xlsx.write(row + 2, col + 1, cell, itemFormat);
            // 设置列宽
            int columnWidth = cell.toLocal8Bit().length() + 2;  //计算字符串长度,中文字符占位2
            if (columnWidth > colW[col])
            {
                colW[col] = columnWidth;
                xlsx.setColumnWidth(col + 1, columnWidth);  // 设置每列宽度为字符数+2
            }
        }
        // qDebug() << QString::number(row + 2) + ":" << ArrayToString(colW, colCount) << Qt::endl;
    }
    qDebug() << strTitle + ":数据表数据写入成功!" << Qt::endl;
    // 保存文件
    if (!xlsx.saveAs(fileName))
    {
        messageBox("warning", strTitle, "保存Excel文件失败!");
        return false;
    }
    qDebug() << strTitle + ":保存Excel文件成功!" << Qt::endl;
    xlsx.deleteLater();
    return true;
}

messageBox()函数参考拙文QT实现QMessageBox中文按钮

QXlsx下载与配置,查阅QXlsx Qt操作excel,作者周不易,在此也表示感谢!


http://www.kler.cn/a/375821.html

相关文章:

  • SQL 像英语是个善意的错误
  • linux alsa-lib snd_pcm_open函数源码分析(三)
  • 基于SpringBoot的健身房系统的设计与实现(源码+定制+开发)
  • Linux之nfs服务器和dns服务器
  • 计组-层次化存储结构
  • 后台管理系统的通用权限解决方案(七)SpringBoot整合SpringEvent实现操作日志记录(基于注解和切面实现)
  • Ceph 学习指南 集群部署【 cephadm 】
  • 嵌入式硬件设计:智能设备的核心
  • 人工智能中的学习方法详解
  • 盖电子章的软件
  • Tomcat安装和配置(超详细)
  • [运维] 服务器本地网络可用性检查脚本
  • 【深度学习】实验 — 动手实现 GPT【三】:LLM架构、LayerNorm、GELU激活函数
  • 基于单片机的宠物自动喂食系统的设计
  • 【Unity实战笔记】第二十二 · 基于SMB的角色控制中遇到的一些问题(斜坡移动鬼畜、落地卡顿、角色突进、头发动画失效等)
  • (五)关于InternVL2的模型训练二(如何训练目标定位模型)
  • IDEA中通义灵码的使用技巧
  • Python 游戏开发库比较与示例
  • vue当中的$使用方法
  • leetcode71:简化路径
  • uniapp开发小程序【简单的实现点击下拉选择性别功能】
  • c++11(下篇)
  • Node.js 发展史
  • 3.2 页面异常-2
  • Redis读性能慢问题排查和调优
  • PAT甲级-1133 Splitting A Linked List