在 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)动态调整图片位置和大小
结合单元格范围计算坐标: