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

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

这是我记录Qt学习过程的第5篇心得文章,主要是方便自己编写的应用程序导入Excel数据的,走了不少弯路直接上代码。

实现代码:

//人员信息导入
ui->pbtn1->setEnabled(false);

// 打开文件对话框,选择 excel文件
QString fileName = QFileDialog::getOpenFileName(this, "人员信息导入", ".", "excel文件(*.xls *.xlsx)");
if (fileName.isEmpty()) return;
this->fun_statusBar("人员信息导入 " + fileName);

// 创建Excel应用程序对象
QAxObject *excel = new QAxObject("Excel.Application");
if (!excel->isNull())
{
    this->fun_statusBar("人员信息导入 创建Excel对象成功!");
    excel->setProperty("Visible", false);  //设置为false以在后台运行
    // 打开现有的工作簿
    QAxObject *workbooks = excel->querySubObject("Workbooks");
    QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", fileName);
    this->fun_statusBar("人员信息导入 打开Excel文件成功!");
    // 获取第一个工作簿
    QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1);
    this->fun_statusBar("人员信息导入 获取Excel工作簿成功!");
    // 获取工作簿的行数和列数
    QAxObject *usedRange = worksheet->querySubObject("UsedRange");
    QAxObject *rowsRange = usedRange->querySubObject("Rows");
    int rowCount = rowsRange->property("Count").toInt();  //获取行数
    QAxObject *colsRange = usedRange->querySubObject("Columns");
    int colCount = colsRange->property("Count").toInt();  //获取列数
    qDebug() << "人员信息导入:" << usedRange << rowCount << colCount << Qt::endl;
    // 读取工作表全部数据
    QVariantList allEnvDataList = usedRange->dynamicCall("Value").toList();
    // 人员信息导入
    QSqlQuery qry = QSqlQuery(sqliteDB);//假定有一个QSqlDatabase sqliteDB,已经正确连接数据库
    QString sql =
        "insert into personnel (单位,姓名,性别,籍贯,"
        "家庭住址,身份证号,手机好吗) values ";
    for (int row = 1; row < rowCount; row++)//row从1开始,跳过表格标题栏
    {
        QList<QVariant> lineEnvDataList = allEnvDataList[row].toList();
        sql += "(";
        for (int col = 1; col < colCount; col++)//col从1开始,跳过序号列
        {
            // qDebug() << lineEnvDataList[col].toString();
            sql += "'" + lineEnvDataList[col].toString() + "',";
        }
        sql = sql.chopped(1) + "),";
    }
    sql = sql.chopped(1);
    qDebug() << "人员信息导入SQL:" << sql << Qt::endl;
    // 创建一个Warning弹出对话框,添加按钮:"Yes"、"No"、"Cancel"
    QString strInfo = "替换请选\"是\",追加请选\"否\",取消请选\"取消\"!";
    QMessageBox *msgBox = new QMessageBox(QMessageBox::Warning, wTitle + " - 人员信息导入", 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:
        qry.clear();
        qry.exec("delete from personnel");//删除数据
        qry.clear();
        qry.exec("delete from sqlite_sequence where name = 'personnel'");//重排序号
        qry.clear();
        qry.exec(sql);
        this->fun_statusBar("人员信息导入 人员信息数据替换成功!");
        break;
    case QMessageBox::No:
        qry.clear();
        qry.exec(sql);
        this->fun_statusBar("人员信息导入 人员信息数据追加成功!");
        break;
    default:
        break;
    }
    qry.finish();
    // 关闭工作簿(不保存更改)
    workbook->dynamicCall("Close(bool)", false);
    // 退出Excel应用程序
    excel->dynamicCall("Quit()");
    // 清理对象
    delete colsRange;
    delete rowsRange;
    delete usedRange;
    delete worksheet;
    delete workbook;
    delete workbooks;
    delete excel;
    fun_tabmodeTableView(ui->tableView);//将数据显示在tableView表格
}
else
{
    skysonya.messageBox("warning", wTitle + " - 人员信息导入", "创建Excel对象失败!");
}
ui->pbtn1->setEnabled(true);

this->fun_statusBar()为自己构建的函数,代码如下:

//状态栏信息显示
void MainWindow::fun_statusBar(QString str)
{
    str = " 提示信息:" + str;
    this->statusBar()->showMessage(str);
    qDebug() << str << Qt::endl;
}

 skysonya.messageBox()函数前文中已有介绍。

fun_tabmodeTableView(ui->tableView)为数据显示函数,将数据从数据库中显示在QTableView表格中。


http://www.kler.cn/news/366969.html

相关文章:

  • 数据库的诗篇:深入探索 MySQL 表操作的艺术与哲学
  • 【Vulnhub靶场】DC-4
  • 【ARM】ARM架构参考手册_Part B 内存和系统架构(5)
  • Github关于LLM热门项目(10k+)
  • 10分钟使用Strapi(无头CMS)生成基于Node.js的API接口,告别繁琐开发,保姆级教程,持续更新中。
  • uniapp uview 上传图片,数据以formData + File 形式传输
  • 用GG修改器修改龙与骑士人物、酒馆属性
  • 华为:高级ACL 特定ip访问特定ip命令
  • 腾讯云:数智教育专场-学习笔记
  • libharu 中文问题
  • 关于iPhone 16 Pro评测视频评论区特征的多维度分析
  • MySQL—索引 |ू・ω・` )
  • 基于websocket简易封装一个全局消息通知组件
  • C++ STL - 容器
  • Jmeter实际应用
  • hive查询语句
  • 【ROS机器人运动控制激光雷达数据获取激光雷达避障篇——C++实现】
  • Linux常用命令1
  • S-Function
  • 洛谷——P8468 [Aya Round 1 C] 文文的构造游戏(01构造问题)
  • 【Kubernets】k8s进阶-深入了解一下Label的用法
  • npm ERR! 503 Service Unavailable one of the uplinks i
  • 云轴科技ZStack信创云平台助力上海科技大学实现信创业务落地
  • 散列表:如何打造一个工业级水平的散列表?
  • 2024.10.9华为留学生笔试题解
  • C++ | Leetcode C++题解之第513题找树左下角的值