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

时间:2020-03-05 18:57:25  来源:igfitidea点击:

我一直在尝试通过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)"会引发异常,错误号为0x8002000b,"无效索引"。

尝试使用pHPageBreaks-> Get_NewEnum()来获取枚举数以遍历该集合也会失败,并且会在调用Get_NewEnum()时立即出现相同错误。

我一直在寻找解决方案,到目前为止,我找到的最接近的东西是http://support.microsoft.com/kb/210663/en-us。我尝试过激活除分页符之外的各种单元格,包括刚超出要打印范围的单元格以及右下角的单元格(IV65536),但这没有帮助。

如果有人可以告诉我如何让Excel返回工作表中所有分页符的位置,那就太好了!

谢谢你。

@Joel:是的,我尝试显示用户界面,然后将" ScreenUpdating"设置为true会产生相同的结果。另外,自那以后,我尝试了将pSheet-> PrintArea设置为整个工作表和/或者调用pSheet-> ResetAllPageBreaks()的组合,然后才调用HPageBreaks集合,这也没有帮助。

@Joel:我已经使用过" pSheet-> UsedRange"来确定要滚动的行,而Excel确实会滚动越过所有水平中断,但是当我尝试访问第二个水平中断时仍然遇到相同的问题。不幸的是,切换到Excel 2007也无济于事。

解决方案

回答

如知识库文章所述,我们是否将ScreenUpdating设置为True?

我们可能需要将其实际切换为True,以强制重新绘制屏幕。听起来分页符的计算是实际渲染页面的副作用,而不是Excel按需执行的操作,因此我们必须在屏幕上触发页面渲染。

回答

通过Visual Basic对Excel 2007进行试验,我发现分页符是未知的,除非它至少已在屏幕上显示一次。

我能找到的最佳解决方法是从工作表的顶部向下滚动到包含数据的最后一行。然后,我们可以枚举所有分页符。

这是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到工作表底部的连续数据。如果不这样做,则需要使用其他方法来确定滚动的距离。