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

相关推荐
whoarethenext11 分钟前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
代码的奴隶(艾伦·耶格尔)1 小时前
后端快捷代码
java·开发语言
Jay_5151 小时前
C++多态与虚函数详解:从入门到精通
开发语言·c++
路来了1 小时前
Python小工具之PDF合并
开发语言·windows·python
追风赶月、2 小时前
【QT】事件(鼠标、按键、定时器、窗口)
qt
xiaolang_8616_wjl2 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
盛夏绽放2 小时前
Vue3 中 Excel 导出的性能优化与实战指南
vue.js·excel
WJ.Polar2 小时前
Python数据容器-list和tuple
开发语言·python
FrostedLotus·霜莲3 小时前
C++主流编辑器特点比较
开发语言·c++·编辑器
超级码.里奥.农3 小时前
零基础 “入坑” Java--- 七、数组(二)
java·开发语言