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

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

实现代码:

cpp 复制代码
//读取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,作者周不易,在此也表示感谢!

相关推荐
哈市雪花1 小时前
相机:以鼠标点为中心缩放(使用OpenGL+QT开发三维CAD)
qt·相机·opengl·cad·缩放·工业软件·渲染效果
我是苏苏1 小时前
C#基础:Winform桌面开发中窗体之间的数据传递
开发语言·c#
斐波娜娜2 小时前
Maven详解
java·开发语言·maven
小码氓2 小时前
Java填充Word模板
java·开发语言·spring·word
暮鹤筠2 小时前
[C语言初阶]操作符
c语言·开发语言
Boilermaker19924 小时前
【Java EE】Mybatis-Plus
java·开发语言·java-ee
aramae4 小时前
C++ -- STL -- vector
开发语言·c++·笔记·后端·visual studio
Tony小周4 小时前
实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12
开发语言·数据库·qt
lixzest5 小时前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
沉默媛5 小时前
如何安装python以及jupyter notebook
开发语言·python·jupyter