如何使用自动化在C ++中迭代Excel列的集合?

我想做下面的VBA代码的道德等价物:

For Each col In Worksheets("Sheet1").Columns # do stuff Next col 

我已经为Exceltypes库生成了MFC包装,这让我到目前为止(生成的types都从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 } } 

编辑:为了回应OP的澄清:

这可能会做你正在寻找的东西:

 CSheets sheets = book.get_WorkSheets(); CWorkSheet sheet = sheets.get_ActiveSheet(); Range cols= sheet.get_Columns(); int nCols = cols.get_Count(); for (int i = nCols; i > 0; i--) { Range topCellOfCol = cells.get_Item(1, i); Range entireCol = topCellOfCol.get_EntireColumn(); if (entireCol.get_Hidden()) entireCol.Delete( xlShiftToLeft ); } 

感谢史蒂夫 ,我得到了大部分的方式。 事实certificate,尽pipeExcel VBA文档,Range :: Item具有不同的行为,具体取决于范围是如何创build的; 从而:

 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示例中是隐含的,但在文档中没有实际说明。