如何使用 Excel 互操作查找自动分页符的位置



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

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

据我所知,Excel 不会在内部存储该数据,而是根据页面设置、打印机设置、手动存储的"分页符"标记以及单元格大小和内容更接近实时地计算数据。

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

我也坦率地承认,我可能完全错了,但从我自己的经验来看,情况很可能是这样。 当我自己的研究发现新的东西时,我会更新为//if//。

更新:链接

这几乎无关紧要,但在同一主题上。 也许它包含一些示例或数据,您可以为自己的目的进行操作。

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

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

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

试试吧!

  1. 打开 Excel
  2. 新建工作表
  3. 在单元格 A1 中键入"hi"

您将看到自动分页符(虚线)出现。

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

因此,每 34 行放置一次页脚。 简单!

但是,如果有不同高度的行,则毛发更多。现在你必须卷起袖子,烹饪自己的算法!目标是找到一个偏移量,该偏移量将始终将您降落在您想要的地方

我们知道 1 行 = 15 个行高度点(在 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 中插入多行文本来测试它。

如果这对您有帮助,请给它一个赞的支持。

最新更新