白夜忘川 2023-09-06 16:02 采纳率: 20%
浏览 45
已结题

C++打开加密的Excel表格

目的:C++打开加密的Excel表格读\写数据

求问1:有加了密的Excel文档,如何在代码打开的时候直接打开(不会弹窗让人输入密码)

已经有打开的代码了,部分代码如下,但是不知道怎么在打开的时候设置打开的密码(问就是我看不懂这部分代码,代码也不是我写的)

  {
        CoInitialize(NULL);

        // 获得EXCEL的CLSID
        CLSID clsid;
        hr = CLSIDFromProgID(L"Excel.Application", &clsid);

        // 创建实例
        hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);//
        if(!SUCCEEDED(hr))
        {
            return hr;
        }
        VARIANT x;
        x.vt = VT_I4;
        x.lVal = IsVi;
        AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);
        
        VARIANT k;
        k.vt = VT_BOOL;
        k.boolVal = false;
        AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"DisplayAlerts", 1, k);
    }

    // 获取Workbooks集合
    {
        VARIANT result;
        VariantInit(&result);
        hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
        pXlBooks = result.pdispVal;
    }
    // 调用Workbooks.Add()方法,创建一个新的Workbook
    {
        VARIANT vFilename;
        vFilename.vt = VT_BSTR;
        vFilename.bstrVal = ::SysAllocString(fileName);
        VARIANT result;
        VariantInit(&result);
        hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Open",1, vFilename);
        pXlBook = result.pdispVal;
    }

// AutoWrap() - Automation helper function...
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {
    bool isNeed = NotDele;
    try
    {
    // Begin variable-argument list...
    va_list marker;
    va_start(marker, cArgs);

    HRESULT hr=S_FALSE;
    if(!pDisp) {
        return hr;
    }
    
    // Variables used...
    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    char szName[200];

    // Convert down to ANSI
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

    // Get DISPID for name passed...
    hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
    if(FAILED(hr)) {
        return hr;
    }

    // Allocate memory for arguments...
    VARIANT *pArgs = new VARIANT[cArgs+1];
    //VARIANT pArgs[10];
    // Extract arguments...
    for(int i=0; i<cArgs; i++) {
        pArgs[i] = va_arg(marker, VARIANT);
    }

    // Build DISPPARAMS
    dp.cArgs = cArgs;
    dp.rgvarg = pArgs;

    // Handle special-case for property-puts!
    if(autoType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }

    // Make the call!
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
    if(FAILED(hr)) 
    {
        return hr;
    }
    // End variable-argument section...
    va_end(marker);
        delete [] pArgs;
    /*if(isNeed == false)
    {
    }*/
    return hr;
    }catch(_com_error e)
    {
        return S_FALSE;
    }
}

更新时间2023.9.7 9:45
补充说明,希望答案打开的方式是按照上述,因为后续要进行一些读写操作,如果换一种方法我就还得找新的读写方法。已看完各位朋友的方法,但是暂时还未成功打开,我不确定是不是我AutoWrap写得有问题,所以如果有能打开的朋友麻烦提供一些更多的代码。以及我加密的方式如下图,用的WPS,采用左边或者右边任意一种都可以。

img

  • 写回答

10条回答 默认 最新

  • bug菌¹ Java领域优质创作者 2023-09-06 16:25
    关注

    题主,这个问题我来替你解决(参考结合AI智能、文心一言),若有帮助,还望采纳,点击回答右侧采纳即可。


    要实现在代码打开加密的Excel文档而不弹窗输入密码,可以使用Microsoft Office开发工具包(Microsoft Office Interop)提供的API。

    以下是一个简单的示例代码,演示如何使用Microsoft Office Interop打开加密的Excel文档:

    #include <iostream>
    #include <windows.h>
    #include <atlcomcli.h>
    #include <stdexcept>
    
    #import "C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" \
        auto_rename no_dual_interfaces
    
    using namespace Excel;
    
    int main()
    {
        // 初始化COM(Component Object Model)库
        HRESULT hr = CoInitialize(NULL);
        if (FAILED(hr))
        {
            std::cerr << "Failed to initialize COM library" << std::endl;
            return hr;
        }
    
        try
        {
            // 创建Excel应用程序对象
            _ApplicationPtr excelApp(__uuidof(Application));
            
            // 禁用警告弹窗
            excelApp->DisplayAlerts = VARIANT_FALSE;
            
            // 打开Excel文件
            _WorkbookPtr workbook = excelApp->Workbooks->Open(
                "C:\\path\\to\\encrypted\\file.xlsx",
                Type::Missing, Type::Missing, Type::Missing,
                "password"); // 输入加密文件的密码
            
            // 在这里可以对Excel文件进行读写操作
            
            // 保存并关闭Excel文件
            workbook->Save();
            workbook->Close();
        }
        catch (const _com_error& error)
        {
            std::cerr << "COM error: " << error.ErrorMessage() << std::endl;
            return error.Error();
        }
    
        // 释放COM资源
        CoUninitialize();
        
        return 0;
    }
    

    在上面的代码中,我们首先使用CoInitialize函数初始化COM库。然后,我们创建了一个Excel应用程序对象,并禁用了警告弹窗。接下来,我们使用应用程序对象的Open方法打开加密的Excel文件,其中需要传入文件路径和密码。一旦Excel文件被打开,我们就可以在代码中对其进行读写操作(在这个示例中,我们只是简单地保存并关闭Excel文件)。最后,我们使用CoUninitialize函数释放COM库的资源。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月7日
  • 修改了问题 9月7日
  • 创建了问题 9月6日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。