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

标签 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   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 );        
    }

关于c++ - 如何使用自动化在 C++ 中迭代 Excel 列的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/593037/

相关文章:

vba - 通过宏从过滤范围中删除行

Android Espresso 测试卡在 perform(click());

javascript - 如何使用 <img src> 或 <a href> 标签验证图像在前端是否可见/存在

java - 如何从 sikuli 中的 FindFailed 异常继续,而不是重新执行整个脚本

c++ - MPI 警告 : Program exiting with outstanding receive requests

c++ - 带有 boolean 参数的模板

c++ - 在 Sun Studio (NetBeans) 中组织大型 C++ 系统

c++ - boost c++ unordered_map 使用的是什么哈希函数?

excel - 令人惊讶的嵌套循环持续时间

c# - 如何加快从 C# 创建 excel Excel 电子表格的速度?