Как перебрать все разрывы страниц на листе Excel 2003 через COM - PullRequest
1 голос
/ 17 сентября 2008

Я пытался получить расположение всех разрывов страниц на данном листе Excel 2003 через COM. Вот пример того, что я пытаюсь сделать:

Excel::HPageBreaksPtr pHPageBreaks = pSheet->GetHPageBreaks();
long count = pHPageBreaks->Count;
for (long i=0; i < count; ++i)
{
  Excel::HPageBreakPtr pHPageBreak = pHPageBreaks->GetItem(i+1); 
  Excel::RangePtr pLocation = pHPageBreak->GetLocation();

  printf("Page break at row %d\n", pLocation->Row);

  pLocation.Release();
  pHPageBreak.Release();
}
pHPageBreaks.Release();

Я ожидаю, что это напечатает номера строк каждого из горизонтальных разрывов страниц в pSheet. У меня проблема в том, что, хотя count правильно указывает количество разрывов страниц на листе, мне кажется, что я могу получить только первое. При втором запуске цикла вызов pHPageBreaks->GetItem(i) вызывает исключение с номером ошибки 0x8002000b, «недопустимый индекс».

Попытка использовать pHPageBreaks->Get_NewEnum(), чтобы заставить перечислитель выполнять итерацию по коллекции, также завершается неудачно с той же ошибкой, сразу после вызова Get_NewEnum().

Я искал решение, и самое близкое, что я нашел до сих пор, это http://support.microsoft.com/kb/210663/en-us. Я пытался активировать различные ячейки за пределами разрывов страниц, в том числе ячейки, выходящие за пределы диапазона, который будет напечатан , а также нижняя правая ячейка (IV65536), но это не помогло.

Если кто-нибудь подскажет, как заставить Excel возвращать расположения всех разрывов страниц на листе, это было бы здорово!

Спасибо.

@ Джоэл: Да, я попытался отобразить пользовательский интерфейс, а затем установить для ScreenUpdating значение true - это дало те же результаты. Кроме того, с тех пор я попробовал комбинации установки pSheet->PrintArea на весь лист и / или вызова pSheet->ResetAllPageBreaks() перед моим вызовом, чтобы получить коллекцию HPageBreaks, что тоже не помогло.

@ Джоэл: я использовал pSheet->UsedRange, чтобы определить строку, которую нужно прокрутить, а Excel прокручивает все горизонтальные разрывы, но у меня все еще остается та же проблема, когда я пытаюсь получить доступ ко второму. К сожалению, переход на Excel 2007 также не помог.

Ответы [ 2 ]

2 голосов
/ 17 сентября 2008

Экспериментируя с Excel 2007 из Visual Basic, я обнаружил, что разрыв страницы неизвестен, если он не был отображен на экране хотя бы один раз.

Лучший обходной путь, который я смог найти, - это пролистать страницу вниз от верхней части листа до последней строки, содержащей данные. Затем вы можете перечислить все разрывы страниц.

Вот код VBA ... дайте мне знать, если у вас возникли проблемы с преобразованием этого в COM:

Range("A1").Select
numRows = Range("A1").End(xlDown).Row

While ActiveWindow.ScrollRow < numRows
    ActiveWindow.LargeScroll Down:=1
Wend

For Each x In ActiveSheet.HPageBreaks
    Debug.Print x.Location.Row
Next

Этот код сделал одно упрощающее предположение:

  • Я использовал метод .End (xlDown), чтобы выяснить, как далеко идут данные ... это предполагает, что у вас есть непрерывные данные от A1 до нижней части листа. Если вы этого не сделаете, вам нужно использовать какой-то другой метод, чтобы выяснить, как далеко прокручивать дальше.
0 голосов
/ 17 сентября 2008

Вы установили ScreenUpdating в True, как упоминалось в статье базы знаний?

Возможно, вы захотите переключить его на True, чтобы вызвать перерисовку экрана. Похоже, что вычисление разрывов страниц является побочным эффектом фактического рендеринга страницы, а не тем, что делает Excel по требованию, поэтому вам нужно запустить рендеринг страницы на экране.

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