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列的数据,可根据实际需求修改。

相关推荐
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】LLM会话管理模块设计
网络·c++·人工智能·学习·大模型
小此方2 小时前
「C++AI大模型接入SDK」(一) API接入与本地两种方式对比、API Key获取、API报文详解与简单API的构建
开发语言·c++·人工智能
GG-_-Bond10 小时前
9.1 kv存储resp协议模拟面试
c++
米糕闯编程11 小时前
鱼香ros2(五)用C++编写节点
c++·ros2·cmakelists·鱼香
xiangyun6112 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun6112 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
fpcc14 小时前
计算机原理—构建过程中的分段分析
c++
xxwxx__14 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Escalating_xu14 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
bnmoel14 小时前
C++ 基础入门篇(三):内联函数与空指针
c++·内联函数·nullptr·低层