C++如何在excel中同时插入多行

C++可以使用COM对象来操作Excel应用程序,以下是一个示例代码,展示如何在Excel中同时插入多行,其中假设新插入的行数据存储在二维数组data中,行数为rowCount,列数为columnCount

c++ 复制代码
#include <Windows.h>
#include <iostream>
#include <comutil.h>
#pragma comment(lib, "comsuppw.lib")

int main()
{
    // 初始化COM库
    CoInitialize(nullptr);

    // 创建Excel应用程序对象
    IDispatch* pExcel = nullptr;
    CLSID clsid;
    CLSIDFromProgID(L"Excel.Application", &clsid);
    CoCreateInstance(clsid, nullptr, CLSCTX_LOCAL_SERVER, IID_IDispatch, (LPVOID*)&pExcel);

    // 创建新工作簿
    VARIANT result;
    VARIANT vtName;
    VariantInit(&vtName);
    vtName.vt = VT_BSTR;
    vtName.bstrVal = SysAllocString(L"NewWorkbook");
    pExcel->Invoke(
        DISPID_WORKBOOKS_ADD,
        IID_NULL,
        LOCALE_USER_DEFAULT,
        DISPATCH_METHOD,
        &result,
        nullptr,
        1,
        new VARIANT{ vtName }
    );
    IDispatch* pWorkbook = result.pdispVal;

    // 获取第一个工作表
    IDispatch* pWorksheet = nullptr;
    {
        VARIANT index;
        VariantInit(&index);
        index.vt = VT_I4;
        index.lVal = 1;
        VARIANT result;
        VariantInit(&result);
        pWorkbook->Invoke(
            DISPID_WORKBOOK_SHEETS,
            IID_NULL,
            LOCALE_USER_DEFAULT,
            DISPATCH_PROPERTYGET,
            &result,
            nullptr,
            1,
            &index
        );
        IDispatch* pSheets = result.pdispVal;
        pSheets->Invoke(
            DISPID_SHEETS_ITEM,
            IID_NULL,
            LOCALE_USER_DEFAULT,
            DISPATCH_PROPERTYGET,
            &result,
            nullptr,
            1,
            &index
        );
        pWorksheet = result.pdispVal;
        pSheets->Release();
    }

    // 在指定位置插入多行
    int rowCount = 3;
    int columnCount = 4;
    VARIANT vtStartRow;
    VARIANT vtEndRow;
    VARIANT vtCount;
    vtStartRow.vt = VT_I4;
    vtEndRow.vt = VT_I4;
    vtCount.vt = VT_I4;
    vtStartRow.lVal = 2; // 起始行为第2行
    vtEndRow.lVal = vtStartRow.lVal + rowCount - 1; // 结束行为要插入的最后一行
    vtCount.lVal = rowCount;
    SAFEARRAY* saData = nullptr;
    {
        SAFEARRAYBOUND bounds[2];
        bounds[0].lLbound = 0;
        bounds[0].cElements = rowCount;
        bounds[1].lLbound = 0;
        bounds[1].cElements = columnCount;
        saData = SafeArrayCreate(VT_VARIANT, 2, bounds);
        VARIANT* pData = nullptr;
        SafeArrayAccessData(saData, (LPVOID*)&pData);
        for (int i = 0; i < rowCount; ++i)
        {
            for (int j = 0; j < columnCount; ++j)
            {
                VariantInit(&pData[i * columnCount + j]);
                pData[i * columnCount + j].vt = VT_BSTR;
                std::wstring s = L"Data_" + std::to_wstring(i) + L"_" + std::to_wstring(j);
                pData[i * columnCount + j].bstrVal = SysAllocString(s.c_str());
            }
        }
        SafeArrayUnaccessData(saData);
    }
    pWorksheet->Invoke(
        DISPID_WORKSHEET_RANGE,
        IID_NULL,
        LOCALE_USER_DEFAULT,
        DISPATCH_PROPERTYGET,
        &result,
        nullptr,
        1,
        new VARIANT{ bstr_t(L"A") + std::to_bstr(vtStartRow.lVal).c_str() + ":" + bstr_t(L"Z") + std::to_bstr(vtEndRow.lVal).c_str() }
    );
    IDispatch* pRange = result.pdispVal;
    pRange->Invoke(
        DISPID_RANGE_INSERT,
        IID_NULL,
        LOCALE_USER_DEFAULT,
        DISPATCH_METHOD,
        nullptr,
        new VARIANT{ vtCount },
        0,
        nullptr
    );
    pRange->Invoke(
        DISPID_RANGE_VALUE,
        IID_NULL,
        LOCALE_USER_DEFAULT,
        DISPATCH_PROPERTYPUT,
        nullptr,
        new VARIANT{ vtMissing },
        1,
        new DISPPARAMS{ nullptr, nullptr, columnCount, 0 }
    );
    pRange->Invoke(
        DISPID_RANGE_VALUE,
        IID_NULL,
        LOCALE_USER_DEFAULT,
        DISPATCH_PROPERTYPUTREF,
        nullptr,
        new VARIANT{ saData },
        1,
        new DISPPARAMS{ nullptr, nullptr, columnCount, 0 }
    );
    pRange->Release();
    SafeArrayDestroy(saData);

    // 关闭工作簿
    pWorkbook->Invoke(
        DISPID_WORKBOOK_CLOSE,
        IID_NULL,
        LOCALE_USER_DEFAULT,
        DISPATCH_METHOD,
        nullptr,
        new VARIANT{ false },  // 不保存修改
        0,
        nullptr
    );

    // 退出Excel应用程序
    pExcel->Invoke(
        DISPID_APPLICATION_QUIT,
        IID_NULL,
        LOCALE_USER_DEFAULT,
        DISPATCH_METHOD,
        nullptr,
        0,
        nullptr
    );

    // 释放COM资源
    pWorksheet->Release();
    pWorkbook->Release();
    pExcel->Release();
    CoUninitialize();

    return 0;
}

该示例代码插入了3行4列的数据,可根据实际需求修改。

相关推荐
Want5956 分钟前
C/C++动态爱心
c++
ysa0510308 分钟前
利用数的变形简化大规模问题#数论
c++·笔记·算法
DARLING Zero two♡41 分钟前
【优选算法】D&C-Mergesort-Harmonies:分治-归并的算法之谐
java·数据结构·c++·算法·leetcode
胡萝卜3.01 小时前
C++面向对象继承全面解析:不能被继承的类、多继承、菱形虚拟继承与设计模式实践
开发语言·c++·人工智能·stl·继承·菱形继承·组合vs继承
蜗牛沐雨1 小时前
解决 OpenSSL 3.6.0 在 macOS 上 Conan 构建失败的链接错误
c++·macos
louisdlee.2 小时前
树状数组维护DP——前缀最大值
数据结构·c++·算法·dp
Q741_1472 小时前
C++ 分治 归并排序 归并排序VS快速排序 力扣 912. 排序数组 题解 每日一题
c++·算法·leetcode·归并排序·分治
三体世界2 小时前
Qt从入门到放弃学习之路(1)
开发语言·c++·git·qt·学习·前端框架·编辑器
minji...3 小时前
算法题 逆波兰表达式/计算器
数据结构·c++·算法·1024程序员节
ZhiqianXia3 小时前
C++ 常见代码异味(Code Smells)
c++