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

Qt使用QXlsx将Excel表格数据导入到SQLite数据库

这是我记录Qt学习过程的第8篇心得文章,上次写到Qt使用QAxObject将Excel表格数据导入到SQLite数据库,使用过程中发现,执行效率不高,于是就研究了QXlsx,发现利用QXlsx处理Excel真的太方便了,上一篇写了使用QXlsx将QTableView数据导出到Excel表格,肯定少不了数据导入的啊,上代码。

实现代码:

//读取EXcel数据导入到SQLite数据库,使用QXlsx
bool Skysonya::readExcelToSQLiteByQXlsx(const QString &fileName, QSqlDatabase sqliteDB, QString tableName,
                                        QString strTitle)
{
    QXlsx::Document xlsx(fileName);
    if (!xlsx.load())
    {
        messageBox("critical", strTitle, "打开Excel文件失败!");
        return false;
    }
    int rowCount = xlsx.dimension().rowCount();
    int colCount = xlsx.dimension().columnCount();

    QSqlQuery query(sqliteDB);
    query.exec("select * from " + tableName);
    QSqlRecord emptyRec = query.record();  //获取空记录,只有字段名
    QStringList fieldList{};
    for (int i = 1; i < emptyRec.count(); i++)
    {
        fieldList.append(emptyRec.fieldName(i));
    }
    QString sql = fieldList.join(",");
    qDebug() << strTitle + "SQL:" << sql << Qt::endl;
    sql = "insert into " + tableName + " (" + sql + ") values ";
    qDebug() << strTitle + "SQL:" << sql << Qt::endl;
    fieldList.clear();
    // 遍历单元格
    for (int row = 2; row < rowCount + 1; row++)
    {
        QStringList fList{};
        for (int col = 2; col < colCount + 1; col++)
        {
            // 获取单元格
            fList.append("'" + xlsx.read(row, col).toString() + "'");
        }
        fieldList.append("(" + fList.join(",") + ")");
        qDebug() << strTitle + "SQL:"
                 << "(" + fList.join(",") + ")" << Qt::endl;
    }
    sql += fieldList.join(",");
    // qDebug() << strTitle + "SQL:" << sql << Qt::endl;
    // 创建一个Warning弹出对话框,添加按钮:"Yes"、"No"、"Cancel"
    QString strInfo = "替换请选\"是\",追加请选\"否\",取消请选\"取消\"!";
    QMessageBox *msgBox = new QMessageBox(QMessageBox::Warning, strTitle, strInfo,
                                          QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
    msgBox->button(QMessageBox::Yes)->setText("是");       //将"Yes"按钮改为显示"是"
    msgBox->button(QMessageBox::No)->setText("否");        //将"No"按钮改为显示"否"
    msgBox->button(QMessageBox::Cancel)->setText("取消");  //将"Cancel"按钮改为显示"取消"
    int result = msgBox->exec();                           //显示Warning弹出对话框
    switch (result)
    {
        case QMessageBox::Yes:
            query.clear();
            query.exec("delete from " + tableName);
            query.clear();
            query.exec("delete from sqlite_sequence where name = '" + tableName + "'");
            strInfo = strTitle + ":数据替换";
            break;
        case QMessageBox::No:
            strInfo = strTitle + ":数据追加";
            break;
        default:
            break;
    }
    query.clear();
    if (!query.exec(sql))
    {
        messageBox("critical", strTitle, strInfo + "失败\n" + query.lastError().text());
        qDebug() << strInfo + "失败:" << query.lastError() << Qt::endl;
        return false;
    }
    qDebug() << strInfo + "成功!" << Qt::endl;
    xlsx.deleteLater();
    return true;
}

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

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


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

相关文章:

  • CentOS 7 安装 ntp,自动校准系统时间
  • 常用的 Lambda 表达式案例解析
  • OpenAI 提示工程指南详解
  • 小家电常用防水触摸IC
  • 一分钟学会MATLAB-数据清洗(含完整代码)
  • 【补题/atccoder】Toyota Programming Contest 2024#7(AtCoder Beginner Contest 362)
  • HTML前端页面设计静态网站-仿百度
  • 前端笔面试查漏补缺
  • python 使用进程池并发执行 SQL 语句
  • 向量库Milvus异常挂了,重新启动
  • Docker-在Centos中部署Shell脚本获取镜像并构建容器
  • 存档库 | 《非暴力沟通》
  • 【Vue CLI 】(更新中)
  • 配电室智能巡检机器人 挂轨简易 24小时 无人值守
  • RHCE的学习(9)
  • go:embed
  • 这个操作惊呆我了!海康存储 R1竟然可以这样部署Portainer
  • 18.农产品销售系统(基于springboot和vue的Java项目)
  • 优选算法第四讲:前缀和模块
  • 对比C/C++语言,Rust语言有什么优势?
  • 关于爬虫需要了解的基础知识 (一、 http协议)
  • OceanBase数据库的使用(兼容MySQL)
  • SpringBoot篇(简化操作的原理)
  • 【数据结构】树-二叉树-堆(下)
  • 本地部署bert-base-chinese模型交互式问答,gradio
  • IDEA设置语法高亮自动检查xml中sql语法