Qt QAxObject 批量写入 Excel
// 计算行的Range名称 QString excelHCalc(int n) { QString h; while (n > 0) { h.prepend(static_cast<char>((n % 26) + 'A' - 1)); n /= 26; } return h; } // 初始化 QAxObject *excel = new QAxObject(); QAxObject *workBooks = new QAxObject(); QAxObject *workBook = new QAxObject(); QAxObject *workSheets = new QAxObject(); QAxObject *workSheet = new QAxObject(); QAxObject *workRange; // 配置 if (excel->setControl("Excel.Application")) { // 使用office qDebug() << "使用Office"; } else if (excel->setControl("ket.Application")) { // 使用wps qDebug() << "使用WPS"; } else { qWaring() << "未安装Office或WPS"; QMessageBox::warning(this, tr("错误"), tr("未安装Office或WPS")); return; } excel->setProperty("Visible", true); // 设置为可见 workBooks = excel->querySubObject("WorkBooks"); // 操作表 workBooks->dynamicCall("Add"); // 新建 if (excel->setProperty("Caption", "Qt Excel")) { // 打开为 Excel qDebug() << R"(Qt Excel)"; } else if (!excel->setProperty("Caption", "DataToExcel")) { // 使用wps qDebug() << R"(DataToExcel)"; } else { qWaring() << "错误的Caption"; QMessageBox::warning(this, tr("错误"), tr("错误的Caption")); return; } workBook = excel->querySubObject("ActiveWorkBook"); workSheets = workBook->querySubObject("Sheets"); workSheet = workSheets->querySubObject("Item(int)", 1); workSheet->setProperty("Name", "Data"); // 设置工作表名称 // 数据 QVariantList table; // 表格 QVariantList tableLine; // 表格行 // 测试 for (int i = 0; i < 100; ++i) { // 列 tableLine << QStringLiteral("test%1").arg(i); } for (int i = 0; i < 100; ++i) { // 行 table << QVariant(tableLine); // 每次添加一行 } // 获取最宽列宽 int maxLineLength = 0; int lineLength = 0; for (const auto &line : table) { lineLength = line.toList().size(); if (maxLineLength < lineLength) { maxLineLength = lineLength; } } // 一次性写入 QString range = QStringLiteral("A1:%1%2").arg(excelHCalc(maxLineLength)).arg(table.size()); workRange = workSheet->querySubObject("Range(const QString&)", range); // workRange->setProperty("Value2", QVariant(table)); // 保存 QString filePath = QString("./datas/export/"); QString fileName = QString("data_%1.xls").arg(QDateTime::currentDateTime().toString("yyyyMMddHHmmss")); QDir dir; if (!dir.exists(filePath)) { // 如果文件夹不存在 dir.mkpath(filePath); // 则创建文件夹 } workBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(filePath + fileName)); // 保存 // 关闭 //excel->dynamicCall("Quit(void)"); // 删除 不然进程会进后台不会自动关闭 delete workRange; workRange = Q_NULLPTR; delete workSheet; workSheet = Q_NULLPTR; delete workSheets; workSheets = Q_NULLPTR; delete workBook; workBook = Q_NULLPTR; delete workBooks; workBooks = Q_NULLPTR; delete excel; excel = Q_NULLPTR;
转自:https://vanxkr.com/2020/12/Qt-Excel-write/
分类:
qt
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)