提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
最近学习QT发现QT中并没有封装直接读写Excel的库,但是有很多三方库以及一个官方库QAxObject。就根据查阅的资料写了一个简单的操作excel的函数
提示:以下是本篇文章正文内容,下面案例可供参考
一、配置 cmakelists.txt
由于我用的是QT 6.5.2,使用QAxObject需要对项目文件进行配置。相关配置如下:
// 使用 find_package 找到 AxContainer 模块
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets AxContainer)
// 链接 ActiveX 模块
target_link_libraries(demo4 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::AxContainer)
2.读Excel
代码如下(示例):
QString OperateExcel::ReadExcel(uint line, uint row) // 读excel数据,并转换为字符串
{
QAxObject *excel = new QAxObject(this); //建立excel操作对象
excel->setControl("Excel.Application"); //连接Excel控件
excel->setProperty("Visible", false); // 显示窗体
excel->setProperty("DisplayAlerts", false);//显示警告
QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿
QString str = QFileDialog::getOpenFileName(this,"打开",
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),"Excel 文件(*.xls *.xlsx)"); // 获取打开文件地址
workbooks->dynamicCall("Open(const QString&)", str);//打开刚才选定的excel
QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); // 获取当前活动的工作蒲对象
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1); // 获取工作簿中的第一个工作表对象
QAxObject *usedRange = worksheet->querySubObject("UsedRange"); // 获取工作表中使用的区域对象
QVariant var = usedRange->dynamicCall("Value"); //将所有的数据读取刀QVariant容器中保存
delete usedRange; // 释放内存
QVariantList array = var.toList(); // 将容器中数据转换为数组,行数据
workbooks->dynamicCall("Close()"); //关闭工作簿
excel->dynamicCall("Quit()"); //退出进程
QList<QVariant> dataList = array[line].toList(); // 列数据
QString data = dataList[row].toString();
qDebug() << line<< "行"<< row<< "列"<< ":"<< data;
return data;
}
3.写Excel
void OperateExcel::WriteExcel(const QString& path, const QString& data, int line, int row)
{
QAxObject* excel = new QAxObject("Excel.Application"); // 创建 Excel 应用程序对象
excel->setControl("Excel.Application"); // 设置控制对象为 Excel 应用程序
excel->setProperty("Visible", false);
excel->setProperty("DisplayAlerts", false);
QAxObject* workbooks = excel->querySubObject("WorkBooks"); // 获取工作簿集合
QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", path); // 打开指定路径的工作簿
QAxObject* sheet = workbook->querySubObject("WorkSheets(int)", 1); // 获取工作表
// 获取要写入数据的单元格范围
QString cellRange = QString("%1%2").arg(QChar('A' + row - 1)).arg(line);
QAxObject* cell = sheet->querySubObject("Range(const QString&)", cellRange);
if (NULL == cell || cell->isNull()) // 检查范围是否有效
{
delete cell;
delete sheet;
delete workbook;
delete workbooks;
delete excel;
return;
}
cell->dynamicCall("SetValue(const QVariant&)", QVariant(data)); // 将数据写入单元格
workbook->dynamicCall("Save"); // 保存工作簿
workbook->dynamicCall("Close (Boolean)", false); // 关闭工作簿
excel->dynamicCall("Quit(void)"); // 关闭 Excel 应用程序
// 释放内存
delete cell;
delete sheet;
delete workbook;
delete workbooks;
delete excel;
}
总结
由于也是最近开始学习QT,同时也学习一下C++,肯定有不对的地方。大家可以一起交流