如何使用Excel Interop查找自动分页符的位置?

时间:2012-06-18 17:45:26

标签: c# excel-interop

我有一个跨越多个页面的工作表,包括垂直和水平。它有一些行和列设置为在每个页面上重复。我想知道这些分页符将会在哪里;我本质上希望将分页预览中的信息​​添加到我的C#代码中,以便我可以修复跨页面合并的单元格,以及添加一页宽的签名框。

我尝试使用Worksheet.HPageBreaks属性,但HPageBreaks.Count属性始终为null,即使我知道工作表有多个页面。

2 个答案:

答案 0 :(得分:1)

据我所知,Excel不会在内部存储该数据,而是根据PageSettings,PrinterSettings,手动存储" PageBreak"来计算更接近实时的数据。标记,细胞大小和内容。

我建议的最佳解决方案是尝试自己计算这些东西。

我也自由地承认我可能完全错了,但根据我自己的经验,情况可能就是这样。如果//当我自己的研究发现新的东西时,我会更新。

更新:链接

这几乎不相关,但在同一主题上。也许它包含一些您可以为自己的目的操纵的示例或数据。

http://social.msdn.microsoft.com/Forums/sv/exceldev/thread/0d1fd9f2-9111-42c4-ad36-3082f4311202

答案 1 :(得分:0)

假设您要在分页符的最后一行放置自定义页脚。

在横向的新空白工作表中,页面的最后一行是第34行。

试试吧!

  1. 打开Excel
  2. 新工作表
  3. 键入" hi"在单元格A1中
  4. 您会看到自动分页符(虚线)。

    如果行高不变,则每页有34行。

    所以每隔34行放置页脚。简单!

    但如果有不同高度的行,那就更好了。现在你必须卷起袖子做自己的算法!目标是找到一个总是落在你意图的位置的偏移量。

    我们知道1行= 15个RowHeight点(100%dpi)。方法是在给定单元格中找到换行计数,以确定要偏移的行数。

    // cell w/ multiple lines of text 
    Excel.Range rng = ws.get_Range("A3"); 
    
    int lineBreakCnt = rng.Text.Count(x => x == '\n'); 
    
    // if range is merged, it will not auto-adjust RowHeight. So:
    int rowHeight = 15; // 15 points = 1 
    int rowHeight = lineBreakCnt > 1 ? rowHeight * lineBreakCnt + (rowHeight / 2) : rowHeight * lineBreakCnt + rowHeight;
    
    rng.RowHeight = rowHeight;
    
    //Calc footer row
    int footerRow = 34;
    
    //depending how much cell contents push down, adjust footer row
    if (lineBreakCnt == 1)
    {
       footerRow -= (lineBreakCnt - 2) + 2;
    }
    else
    if (lineBreakCnt > 1)
    {
       footerRow -= (lineBreakCnt -2) + 1;
    }
    
    ws.get_Range("A" + footerRow).Formula = "Cool footer w/ formatted text here";
    

    通过插入A3中的多行文本进行测试。

    如果这对您有所帮助,请给予支持。