在 Qt 程序中操作 Excel 文件的常用方法有QAxObject、QtXlsx开源库、CSV格式等。
一、QAxObject
使用 QAxObject (仅限 Windows,需安装 Excel)
1、环境配置
- 添加依赖
在.pro
文件中添加QT += axcontainer
以支持 ActiveX 组件。 - 包含头文件
#include <QAxObject> #include <QVariant>
2、读取数据(每个单元格)
//创建 Excel 实例
QAxObject *excel = new QAxObject("Excel.Application");
excel->dynamicCall("SetVisible(bool)", false); // 隐藏 Excel 界面//打开工作簿和工作表
QAxObject *workbooks = excel->querySubObject("WorkBooks");
QAxObject *workbook = workbooks->querySubObject("Open(QString)", "C:/test.xlsx");
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1); // 选择第一个工作表//读取数据(逐个单元格读取)
QAxObject *cell = worksheet->querySubObject("Cells(int,int)", 1, 1); // 读取 A1 单元格
QVariant value = cell->dynamicCall("Value()");
delete cell; // 手动释放内存//释放资源
range->deleteLater();
workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
delete excel; // 必须显式释放资源
3、批量读取数据(N个单元格)
//创建 Excel 实例
QAxObject *excel = new QAxObject("Excel.Application");
excel->dynamicCall("SetVisible(bool)", false); // 隐藏 Excel 界面//打开工作簿和工作表
QAxObject *workbooks = excel->querySubObject("WorkBooks");
QAxObject *workbook = workbooks->querySubObject("Open(QString)", "C:/test.xlsx");
QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1); // 选择第一个工作表//读取数据(高效处理大量数据)
QAxObject *range = worksheet->querySubObject("Range(QString)", "B1:C10000"); // 读取 B1 到 C10000 区域
QVariant data = range->property("Value"); // 获取二维数组形式的数据
QVariantList rows = data.toList();
foreach (const QVariant &row, rows) {QVariantList cols = row.toList();// 处理每行数据
}//释放资源
range->deleteLater();
workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
delete excel; // 必须显式释放资源
4、写入数据
#include <QAxObject>void WriteExcel() {// 启动 Excel 应用QAxObject* excel = new QAxObject("Excel.Application");excel->setProperty("Visible", true); // 设置可见// 创建工作簿和工作表QAxObject* workbooks = excel->querySubObject("Workbooks");QAxObject* workbook = workbooks->querySubObject("Add");QAxObject* sheets = workbook->querySubObject("Worksheets");QAxObject* sheet = sheets->querySubObject("Item(int)", 1); // 第一个工作表// 写入数据到 A1 单元格QAxObject* cell = sheet->querySubObject("Range(QVariant)", "A1");cell->setProperty("Value", "Qt 写入的数据");// 保存并退出workbook->dynamicCall("SaveAs(const QString&)", "C:\\测试.xlsx");excel->dynamicCall("Quit()");
}
5、高级功能
1)插入单张图片
1.1)通过 Shapes.AddPicture 方法插入图片,需指定坐标、尺寸和链接方式。
坐标可通过单元格的 Left 和 Top 属性动态获取。
void insertImage(QAxObject* worksheet, const QString& imagePath, int row, int col) {// 获取目标单元格的坐标QAxObject* range = worksheet->querySubObject("Cells(int, int)", row, col);double left = range->property("Left").toDouble();double top = range->property("Top").toDouble();// 插入图片并设置属性QAxObject* shapes = worksheet->querySubObject("Shapes");QAxObject* picture = shapes->querySubObject("AddPicture(const QString&, bool, bool, double, double, double, double)",imagePath, // 图片路径false, // LinkToFile: 不链接到外部文件true, // SaveWithDocument: 图片随文档保存left, // 左侧位置(单元格左边界坐标)top, // 顶部位置(单元格顶部坐标)100, // 宽度(单位:磅)80 // 高度(单位:磅));// 释放资源delete picture;delete shapes;delete range;
}
1.2)动态调整图片位置和大小
结合单元格范围计算坐标: