一、打开Excel文件
- 首先在.pro文件加入:QT += axcontainer
- 引入头文件: #include
qDebug() << "尝试打开Excel" << path << endl; // 操作Excel的对象 QAxObject *excel = NULL; // workbook对象 QAxObject *workbooks = NULL; // workbook对象 QAxObject *workbook = NULL; excel = new QAxObject("Excel.Application"); //true 表示操作文件时可见,false表示为不可见 excel->dynamicCall("SetVisible(bool)", true); workbooks = excel->querySubObject("WorkBooks"); // 指定路径打开Excel workbook = workbooks->querySubObject("Open(QString&)", path);
二、获取worksheet
// 获取所有worksheets QAxObject * worksheets = workbook->querySubObject("WorkSheets"); // count属性获取worksheet数量 int iWorkSheet = worksheets->property("Count").toInt(); qDebug() << QString("Excel文件中表的个数: %1").arg(QString::number(iWorkSheet)); // 取得第一个worksheet QAxObject * worksheet = worksheets->querySubObject("Item(int)", 1); // 根据名称获取worksheet QAxObject* pWorkSheet = NULL; try { pWorkSheet = worksheets->querySubObject("Item(QString)", name); } catch (...) { qCritical()<
三、数据读取
// 获取有数据的区域 QAxObject * usedrange = worksheet->querySubObject("UsedRange"); // 通过rows获取行数 QAxObject * rows = usedrange->querySubObject("Rows"); int iRows = rows->property("Count").toInt(); qDebug() << QString("行数为: %1").arg(QString::number(iRows)); // 通过Columns获取列数 QAxObject * columns = usedrange->querySubObject("Columns"); int iColumns = columns->property("Count").toInt(); qDebug() << QString("列数为: %1").arg(QString::number(iColumns)); //————————数据的起始行——— int iStartRow = rows->property("Row").toInt(); qDebug() << QString("起始行为: %1").arg(QString::number(iStartRow)); //————————数据的起始列———————————— int iColumn = columns->property("Column").toInt(); qDebug() << QString("起始列为: %1").arg(QString::number(iColumn)); // 将所有的数据读取到QVariant容器中保存 QVariant var = usedrange->dynamicCall("Value"); // 将QVariant转换为Qlist的二维数组 QVariantList varRows=var.toList(); if(varRows.isEmpty()) { qDebug() << "没有数据" << endl; }else{ const int row_count = varRows.size(); QVariantList rowData; // 转换过程 for(int i=0;iquerySubObject("Range(QVariant, QVariant)",A); // 设置值 cellA->dynamicCall("SetValue(const QVariant&)",QVariant("新值"));
四、数据写入
// 不显示任何警告信息。如果为true在关闭是会出现类似“文件已修改,是否保存”的提示excel->setProperty("DisplayAlerts", false); // 保存数据 workbook->dynamicCall("Save()"); // 另存 // workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));
五、添加worksheet
QAxObject *pWorkSheet = NULL; try { //获取工作表数目 int count = worksheets->property("Count").toInt(); // 取得最后一个表 QAxObject *pLastSheet = worksheets->querySubObject("Item(int)", count); // 新增一个表 pWorkSheet = worksheets->querySubObject("Add(QVariant)", pLastSheet->asVariant()); // 移动位置 pLastSheet->dynamicCall("Move(QVariant)", pWorkSheet->asVariant()); // 设置工作表名称 pWorkSheet->setProperty("Name", name); } catch (...) { qCritical() <
六、根据名称删除表
try { QAxObject *pFirstSheet = worksheets->querySubObject("Item(QString)", name); pFirstSheet->dynamicCall("delete"); } catch (...) { qCritical()<
七、按索引删除表
try { QAxObject *pFirstSheet = worksheets->querySubObject("Item(int)", index); pFirstSheet->dynamicCall("delete"); } catch (...) { qCritical()<
八、释放Excel对象
Excel对象如果没有释放,会造成进程里Excel相关进程无法自动退出。
// 关闭workbook workbook->dynamicCall("Close()"); // 关闭excel excel->dynamicCall("Quit()"); if (excel) { delete excel; excel = NULL; }
九、QT其它操作Excel的方法
1. QtXlsx
网址:http://qtxlsx.debao.me
可以不安装Excel就能方便地对Excel文件进行操作。
2. ODBC操作Excel文件
须安装MS Access数据库引擎。
其它库功能对比: