Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;使用自动化?_C++_Excel_Automation - Fatal编程技术网

C++ 如何在C++;使用自动化?

C++ 如何在C++;使用自动化?,c++,excel,automation,C++,Excel,Automation,我想做以下VBA代码的道德等效: For Each col In Worksheets("Sheet1").Columns # do stuff Next col 我已经为Excel类型库生成了MFC包装器,这让我走了这么远(生成的类型都源自COleDispatchDriver: CApplication app; app.CreateDispatch( clsid, e ); CWorkbooks wbks( app.get_Workbooks() ); CWorkbook

我想做以下VBA代码的道德等效:

For Each col In Worksheets("Sheet1").Columns
    # do stuff
Next col
我已经为Excel类型库生成了MFC包装器,这让我走了这么远(生成的类型都源自
COleDispatchDriver

CApplication app;
app.CreateDispatch( clsid, e );

CWorkbooks  wbks( app.get_Workbooks() );
CWorkbook   book( wbks.Open( filename, /* optional args */ ) );
CRange      cols( app.get_Columns() );
long        numCols = cols.get_Count();
从这里开始,我陷入了困境。看起来我可以使用
Range::get_Item(rowid,colid)
在单元格上进行迭代,然后从单元格中获取列,但我一直在寻找上述循环的更直接的翻译


(编辑)澄清:我实际上并不关心单个单元格。我的目标是确定哪些列的宽度为0(隐藏),并将其从工作表中删除。

我假设您正在尝试遍历电子表格中的所有单元格。您可以获得活动工作表的“所有单元格”范围,并在其行和列之间循环:

CSheets sheets = book.get_WorkSheets();
CWorkSheet sheet = sheets.get_ActiveSheet();
Range cells = sheet.get_Cells();

int nRows = cells.get_Rows().get_Count();
int nCols = cells.get_Columns().get_Count();

for (int i = 0; i <= nRows; i++)
    {
    for (int j = 0; j <= nCols; j++)
        {
        Range cell = cells.get_Item(i+1,j+1);
        //Do stuff with individual cell
        }
     }
多亏了,我基本上做到了这一点。事实证明,尽管有Excel VBA文档,但Range::Item根据创建范围的方式具有不同的行为;因此:

COleVariant OPTIONAL( (long)DISP_E_PARAMNOTFOUND, VT_ERROR );

Range cols = sheet.get_Columns();
for ( long i = cols.get_Count(); i > 0; --i )
{
    Range col = cols.get_Item( COleVariant( i ), OPTIONAL ) ;
    // ...
}
将遍历表示列的范围,以及

Range rows = sheet.get_Rows();
for ( long i = rows.get_Count(); i > 0; --i )
{
    Range row = cols.get_Item( COleVariant( i ),  OPTIONAL );
    // ...
}
将遍历表示行的范围。这在VBA示例中是隐式的,但在文档中没有实际说明

Range rows = sheet.get_Rows();
for ( long i = rows.get_Count(); i > 0; --i )
{
    Range row = cols.get_Item( COleVariant( i ),  OPTIONAL );
    // ...
}