flingba 发表于 2024-10-13 13:13

有懂C++或者MFC修改已经打开的Excel内容的吗?

EXCEL窗口已经打开里面有内容,现在想修改它的内容,不是保存后修改,是直接改 现在可以用 GetActiveObject 来修改最开始打开的EXCEL窗口内容,但无法修改后面打开的,我是想先找到窗口,然后再修改内容(不是用模拟按键)。

qq465881818 发表于 2024-10-13 20:05


#include <iostream>
#include <Windows.h>
#include <comdef.h>
#include <Excel.h>

int main()
{
    CoInitialize(NULL);

    try
    {
      // 获取已经打开的Excel应用程序
      Excel::_ApplicationPtr pXlApp;
      HRESULT hr = pXlApp.GetActiveObject(L"Excel.Application");
      if (FAILED(hr))
      {
            std::cout << "无法获取已打开的Excel应用程序。" << std::endl;
            return 1;
      }

      // 获取活动工作簿
      Excel::_WorkbookPtr pWorkbook = pXlApp->ActiveWorkbook;
      if (pWorkbook == nullptr)
      {
            std::cout << "没有打开的工作簿。" << std::endl;
            return 1;
      }

      // 获取活动工作表
      Excel::_WorksheetPtr pWorksheet = pWorkbook->ActiveSheet;

      // 修改单元格内容
      // 例如,修改A1单元格的内容
      Excel::RangePtr pRange = pWorksheet->Range;
      pRange->Value2 = L"新内容";

      std::cout << "单元格A1的内容已修改。" << std::endl;

      // 如果需要,可以保存工作簿
      // pWorkbook->Save();
    }
    catch (_com_error& e)
    {
      std::cout << "错误: " << e.Description() << std::endl;
    }

    CoUninitialize();
    return 0;
}

你好,再见 发表于 2024-10-14 19:24

qq465881818 发表于 2024-10-13 20:05

#include
#include


还有Excel.h这个库?{:301_1009:}

回到52像回家 发表于 2024-10-19 23:29

GetActiveObject 只能获取第一个实例。你提出的问题很正确。
操作多个Excel实例,查找正在运行的Excel进程,连接到特定的实例,然后进行操作
可以使用 GetObject 或者 FindWindow 等函数结合Windows API来枚举打开的窗口,从而获取特定的Excel实例。
具体思路:
使用 FindWindow 找到Excel窗口句柄:通过遍历系统中的窗口,找到与Excel相关的窗口。
使用 AccessibleObjectFromWindow:通过窗口句柄获取Excel的COM对象。
通过 IDispatch 调用Excel的接口:获取到Excel实例后,可以通过COM接口操作Excel对象。
FindWindow 用来获取Excel的窗口句柄。
AccessibleObjectFromWindow 用来从窗口句柄获取COM对象。
一旦获取到COM对象,就可以像平常通过 IDispatch 接口调用Excel的方法一样,操作Excel文件的内容。

然后就可以根据需要进一步扩展代码
页: [1]
查看完整版本: 有懂C++或者MFC修改已经打开的Excel内容的吗?