这是我记录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表格中。