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

相关推荐
我叫小白菜17 分钟前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
狐凄23 分钟前
Python实例题:基于 Python 的简单聊天机器人
开发语言·python
weixin_446122461 小时前
JAVA内存区域划分
java·开发语言·redis
悦悦子a啊1 小时前
Python之--基本知识
开发语言·前端·python
QuantumStack2 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
whoarethenext3 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
代码的奴隶(艾伦·耶格尔)3 小时前
后端快捷代码
java·开发语言
Jay_5154 小时前
C++多态与虚函数详解:从入门到精通
开发语言·c++
路来了4 小时前
Python小工具之PDF合并
开发语言·windows·python
追风赶月、4 小时前
【QT】事件(鼠标、按键、定时器、窗口)
qt