如何通过COM遍历Excel 2003工作表中的所有分页符

我一直试图通过COM检索给定的Excel 2003工作表上的所有分页符的位置。 这是我想要做的事情的一个例子:

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)将抛出一个exception,错误号为0x8002000b,“无效索引”。

尝试使用pHPageBreaks->Get_NewEnum()来获得一个枚举器迭代集合也失败,同样的错误,立即调用Get_NewEnum()

我已经四处寻找解决scheme,到目前为止我发现的最接近的东西是http://support.microsoft.com/kb/210663/en-us 。 我试过激活分页符以外的各种单元格,包括超出要打印范围的单元格,以及右下angular的单元格(IV65536),但没有帮助。

如果有人可以告诉我如何让Excel返回表单中所有分页符的位置,那真是太棒了!

谢谢。

@Joel:是的,我试图显示用户界面,然后将ScreenUpdating设置为true – 它产生了相同的结果。 此外,我从此尝试了在调用HPageBreaks集合之前设置pSheet->PrintArea到整个工作表和/或调用pSheet->ResetAllPageBreaks()HPageBreaks ,这也没有帮助。

@Joel:我已经使用了pSheet->UsedRange来确定要滚动的行,并且Excel滚动了所有水平的中断,但是当我尝试访问第二个时,我仍然遇到同样的问题。 不幸的是,切换到Excel 2007也没有帮助。

试用Visual Basic中的Excel 2007,我发现分页符是不知道的,除非它至less在屏幕上显示一次。

我能find的最佳解决方法是从工作表的顶部到包含数据的最后一行。 然后你可以枚举所有的分页符。

这里的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需要,所以你必须触发一个页面呈现在屏幕上。