Как перебрать коллекцию столбцов Excel в C ++ с помощью автоматизации? - PullRequest
0 голосов
/ 27 февраля 2009

Я хочу сделать моральный эквивалент следующего кода VBA:

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

Я сгенерировал оболочки MFC для библиотеки типов Excel, которые позволили мне зайти так далеко (все сгенерированные типы получены из 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 (скрыты) и удалить их из таблицы.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2009

Я предполагаю, что вы пытаетесь перебрать все ячейки в электронной таблице. Вы можете получить диапазон «все ячейки» активного листа и просмотреть его строки и столбцы:

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
        }
     }

РЕДАКТИРОВАТЬ: В ответ на уточнение ОП:

Это, вероятно, сделает то, что вы ищете:

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 );        
    }
0 голосов
/ 28 февраля 2009

Благодаря Стиву , я получил большую часть пути туда. Оказывается, что, несмотря на документацию 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, но фактически не указано в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...