C++ 如何在C++;

C++ 如何在C++;,c++,excel,automation,cell,C++,Excel,Automation,Cell,如果有人知道如何从Excel::Window指针转到打开的Excel单元格中的实际值,请告诉我。 以下是任务条件: -Excel当前在一个窗口中运行,一张工作表上有一个工作簿 -有些单元格有数据(简单地说,只有一个单元格[1,1]有数据,即“a”) 问题是如何找出只有一个单元格有数据,单元格是[1,1],数据是“a”。 首先是一段代码片段: int main( int argc, CHAR* argv[]) { CoInitialize( NULL ); HWND excelWind

如果有人知道如何从Excel::Window指针转到打开的Excel单元格中的实际值,请告诉我。 以下是任务条件: -Excel当前在一个窗口中运行,一张工作表上有一个工作簿 -有些单元格有数据(简单地说,只有一个单元格[1,1]有数据,即“a”) 问题是如何找出只有一个单元格有数据,单元格是[1,1],数据是“a”。 首先是一段代码片段:

int main( int argc, CHAR* argv[])
{
   CoInitialize( NULL );
   HWND excelWindow = FindWindow(L"XLMAIN", NULL);
   EnumChildWindows(excelWindow, (WNDENUMPROC) EnumChildProc, (LPARAM)1);
   return 0;
}
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM)
{
   WCHAR szClassName[64];
   if(GetClassNameW(hwnd, szClassName, 64))
   {
      if(_wcsicmp(szClassName, L"EXCEL7") == 0)
      {
         Excel::Window* pWindow = NULL;
         HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_NATIVEOM, __uuidof(Excel::Window), (void**)&pWindow);
         if(hr == S_OK)
         {
            // Here we need to answer the question using pWindow                
            pWindow->Release();
         }
         return false;     
      }     
   }
   return true;
}  
丹尼尔

我相信您正在使用Excel COM访问它。我从来没有使用C++做过,但是我猜它不应该比C语言有很大的不同。最困难的任务应该是导入必要的库。但我相信你已经做到了

您应该使用如下内容:

int full_cells = 0;
Excel::_Worksheet worksheet = pWindow->ActiveSheet;
for(int j = 1; j < worksheet.Columns.Count; j++)
{
    for (int i = 1; i < worksheet.Rows.Count; i++)
    {
        if(worksheet.Cells[i][j].Value != "")
        {
            full_cells++;
            cout << worksheet.Cells[i][j].Value;
        }
     }
}
int full_cells=0;
Excel::_工作表工作表=pWindow->ActiveSheet;
对于(int j=1;jcout以下是最终使用的代码:

#include <windows.h>
#include <oleacc.h>
#import "C:\Program Files (x86)\Common Files\microsoft shared\OFFICE14\MSO.DLL" no_implementation rename("RGB", "ExclRGB") rename("DocumentProperties", "ExclDocumentProperties") rename("SearchPath", "ExclSearchPath")
#import "C:\Program Files (x86)\Common Files\microsoft shared\VBA\VBA6\VBE6EXT.OLB" no_implementation
#import "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" rename("DialogBox", "ExclDialogBox") rename("RGB", "ExclRGB") rename("CopyFile", "ExclCopyFile") rename("ReplaceText", "ExclReplaceText")
#include <string>
using std::string;

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM)
{
    WCHAR szClassName[64];
    if(GetClassNameW(hwnd, szClassName, 64))
    {
        if(_wcsicmp(szClassName, L"EXCEL7") == 0)
        {
            //Get AccessibleObject
            Excel::Window* pWindow = NULL;
            IDispatch* pXlSheet = NULL;
            HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_NATIVEOM, __uuidof(Excel::Window), (void**)&pWindow);
            if(hr == S_OK)
            {               
                try {
                    VARIANT result;
                    VariantInit(&result);
                    AutoWrap(DISPATCH_PROPERTYGET, &result, pWindow, L"ActiveSheet", 0);
                    pXlSheet = result.pdispVal;
                    _variant_t sheetName;
                    VariantInit(&sheetName);
                    if ((pXlSheet != NULL) && (pXlSheet != (IDispatch*)0xCCCCCCCC))
                    AutoWrap(DISPATCH_PROPERTYGET, &sheetName, pXlSheet, L"Name", 0); 

                    // get cell which you need
                    string location = "C5"; 
                    location += ":" + location; // cell is a range with the same start/end cells
                    OLECHAR *sOleText=new OLECHAR[location.length()+1];
                    mbstowcs(sOleText,location.c_str(),location.length()+1);

                    IDispatch *pXlRange; // Get Range from Sheet
                    VARIANT parm;
                    parm.vt = VT_BSTR;
                    parm.bstrVal = ::SysAllocString(sOleText); 
                    VARIANT result;
                    VariantInit(&result);
                    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
                    VariantClear(&parm);
                    pXlRange = result.pdispVal;
                    Excel::RangePtr cell = pXlRange;
                    Excel::CharactersPtr ptr = cell->Characters;
                    _bstr_t text = ptr->Text; // here is needed text
                } catch (...) { }
            }
            return false;     // Stops enumerating through children
        }       
    }
    return true;
}

void main( int argc, CHAR* argv[])
{
    CoInitialize(NULL);
    HWND excelWindow = FindWindow(L"XLMAIN", NULL);
    EnumChildWindows(excelWindow, (WNDENUMPROC) EnumChildProc, (LPARAM)1);
    CoUninitialize();
}
#包括
#包括
#导入“C:\Program Files(x86)\Common Files\microsoft shared\OFFICE14\MSO.DLL”no_实现重命名(“RGB”、“ExclRGB”)重命名(“DocumentProperties”、“ExclDocumentProperties”)重命名(“SearchPath”、“ExclSearchPath”)
#导入“C:\Program Files(x86)\Common Files\microsoft shared\VBA\VBA6\VBE6EXT.OLB”否\u实现
#导入“C:\Program Files(x86)\Microsoft Office\Office14\EXCEL.EXE”重命名(“DialogBox”、“ExcluDialogBox”)重命名(“RGB”、“ExcluRGB”)重命名(“CopyFile”、“ExcluCopyFile”)重命名(“ReplaceText”、“ExcluReplaceText”)
#包括
使用std::string;
BOOL回调EnumChildProc(HWND-HWND,LPARAM)
{
WCHAR szClassName[64];
if(GetClassNameW(hwnd,szClassName,64))
{
如果(_wcsicmp(szClassName,L“EXCEL7”)==0)
{
//获取可访问对象
Excel::Window*pWindow=NULL;
IDispatch*pXlSheet=NULL;
HRESULT hr=AccessibleObjectFromWindow(hwnd、OBJID\u NATIVEOM、Excel::Window、void**)和pWindow);
如果(hr==S_正常)
{               
试一试{
变异结果;
方差(和结果);
自动包装(DISPATCH_PROPERTYGET和result,pWindow,L“ActiveSheet”,0);
pXlSheet=result.pdispVal;
_变体名称;
VariantInit(&sheetName);
如果((pXlSheet!=NULL)和(&(pXlSheet!=(IDispatch*)0xCCCC))
自动换行(DISPATCH_PROPERTYGET和sheetName,pXlSheet,L“Name”,0);
//找到你需要的手机
字符串位置=“C5”;
location+=“:”+location;//单元格是具有相同起始/结束单元格的区域
OLECHAR*sOleText=新的OLECHAR[location.length()+1];
mbstowcs(sOleText,location.c_str(),location.length()+1);
IDispatch*pXlRange;//从工作表获取范围
变异parm;
parm.vt=vt\u BSTR;
parm.bstrVal=::SysAllocString(sOleText);
变异结果;
方差(和结果);
自动包装(发送属性集和结果,pXlSheet,L“范围”,1,parm);
VariantClear(&parm);
pXlRange=result.pdispVal;
Excel::RangePtr cell=pXlRange;
Excel::CharactersPtr ptr=单元格->字符;
_bstr\u t text=ptr->text;//这里是所需的文本
}捕获(…){}
}
return false;//停止通过子项枚举
}       
}
返回true;
}
void main(int argc,CHAR*argv[])
{
共初始化(空);
HWND excelWindow=FindWindow(L“XLMAIN”,NULL);
EnumChildWindows(excelWindow,(WNDENUMPROC)EnumChildProc,(LPARAM)1);
coninitialize();
}
AutoWrap()函数取自,而初始示例取自
感谢所有帮助过我的人。

你好,西奥。谢谢你的代码片段。不幸的是,它只说明了主要思想,这对我来说从一开始就很清楚。如果你试图将这个片段插入我的代码中,你会得到很多代码错误,比如不兼容的类型。如何处理所有这些代码不像C中那么明显。还有documentation作为参考书很有用,但我需要的是说明。因此问题仍然存在。为什么要将pXlSheet与0xCCCC进行比较?您已经初始化了pXlSheet。