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,作者周不易,在此也表示感谢!

相关推荐
Wang's Blog8 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain9 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克6059 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67810 小时前
深挖C++:类和对象(中)
开发语言·c++
灿飞屋10 小时前
Rust 编程其实很简单
开发语言·rust
MOONICK12 小时前
QT元数据
开发语言·qt
D e re k ZH12 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
灿飞屋13 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
xiaoye-duck13 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
总要学点什么14 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质