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表格中。

上一篇:BFS解决最短路问题(3)_单词接龙


下一篇:springboot074智能物流管理系统(论文+源码)_kaic-5系统详细实现