Как перебрать все разрывы страниц на листе Excel 2003 через COM

StackOverflow https://stackoverflow.com/questions/78053

Вопрос

Я пытался получить расположение всех разрывов страниц на данном листе 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 к истине - это дало те же результаты.Кроме того, с тех пор я пробовал комбинации настроек pSheet->PrintArea ко всему рабочему листу и/или вызову pSheet->ResetAllPageBreaks() перед моим звонком, чтобы получить HPageBreaks сбор, что тоже не помогло.

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

Это было полезно?

Решение

Экспериментируя с 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 до нижней части листа.Если вы этого не сделаете, вам нужно использовать другой метод, чтобы определить, как далеко продолжать прокрутку.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top