报告ReportEngineBase增加页眉页脚,修改因模板变动和分栏、边距等需要修改的函数代码。

This commit is contained in:
QI Mingxuan
2026-05-13 17:36:25 +08:00
parent b1c5ab546b
commit 1d3cacea75
6 changed files with 175 additions and 5 deletions
+55 -2
View File
@@ -88,6 +88,7 @@ namespace XP.ReportEngine.Services
var currentPage = new LayoutPage
{
PageNumber = currentPageNumber,
PageType = templatePage.Type,
Elements = new List<LayoutElement>()
};
pages.Add(currentPage);
@@ -107,13 +108,28 @@ namespace XP.ReportEngine.Services
var elementHeight = CalculateElementHeight(element);
var elementWidth = CalculateElementWidth(element, availableWidth);
// 强制分页元素 | Forced page break element
if (string.Equals(element.Type, "pagebreak", StringComparison.OrdinalIgnoreCase))
{
currentPageNumber++;
currentPage = new LayoutPage
{
PageNumber = currentPageNumber,
PageType = templatePage.Type,
Elements = new List<LayoutElement>()
};
pages.Add(currentPage);
currentY = margins.Top;
continue;
}
// 检查是否需要分页 | Check if pagination is needed
if (element.Type == "table" && element.Columns != null)
{
// 表格跨页拆分逻辑 | Table page-split logic
currentY = ProcessTableWithPageSplit(
element, template, margins, availableHeight, availableWidth,
currentY, pages, ref currentPage, ref currentPageNumber);
currentY, pages, ref currentPage, ref currentPageNumber, templatePage.Type);
}
else
{
@@ -125,6 +141,7 @@ namespace XP.ReportEngine.Services
currentPage = new LayoutPage
{
PageNumber = currentPageNumber,
PageType = templatePage.Type,
Elements = new List<LayoutElement>()
};
pages.Add(currentPage);
@@ -240,7 +257,7 @@ namespace XP.ReportEngine.Services
TemplateElement element, ReportTemplate template, MarginSettings margins,
float availableHeight, float availableWidth,
float currentY, List<LayoutPage> pages,
ref LayoutPage currentPage, ref int currentPageNumber)
ref LayoutPage currentPage, ref int currentPageNumber, string pageType)
{
var resolvedStyle = _templateEngine.ResolveStyle(template, element.Style);
var tableWidth = element.Size != null && element.Size.Length > 0 ? element.Size[0] : availableWidth;
@@ -262,6 +279,7 @@ namespace XP.ReportEngine.Services
currentPage = new LayoutPage
{
PageNumber = currentPageNumber,
PageType = pageType,
Elements = new List<LayoutElement>()
};
pages.Add(currentPage);
@@ -324,6 +342,7 @@ namespace XP.ReportEngine.Services
currentPage = new LayoutPage
{
PageNumber = currentPageNumber,
PageType = pageType,
Elements = new List<LayoutElement>()
};
pages.Add(currentPage);
@@ -359,6 +378,7 @@ namespace XP.ReportEngine.Services
currentPage = new LayoutPage
{
PageNumber = currentPageNumber,
PageType = pageType,
Elements = new List<LayoutElement>()
};
pages.Add(currentPage);
@@ -423,6 +443,9 @@ namespace XP.ReportEngine.Services
{
"text" => DefaultTextHeight,
"divider" => DefaultDividerHeight,
"spacer" => element.Size is { Length: >= 2 } ? element.Size[1] : DefaultTextHeight,
"row" => CalculateRowHeight(element),
"pagebreak" => 0f,
"image" => DefaultTextHeight,
"table" => CalculateTableHeight(element),
_ => DefaultTextHeight
@@ -442,6 +465,36 @@ namespace XP.ReportEngine.Services
return DefaultRowHeight + (dataRowCount * DefaultRowHeight);
}
/// <summary>
/// 计算 Row 容器高度 | Calculate row container height
/// 取子元素中最大高度,如果有 Size 定义则优先使用
/// Uses max child height, or Size definition if available
/// </summary>
private float CalculateRowHeight(TemplateElement element)
{
// 如果 row 本身有 Size[1] 定义,直接使用 | If row has Size[1], use it directly
if (element.Size != null && element.Size.Length > 1 && element.Size[1] > 0)
{
return element.Size[1];
}
// 否则取子元素中最大高度 | Otherwise use max child height
if (element.Children == null || element.Children.Count == 0)
return DefaultTextHeight;
float maxHeight = 0;
foreach (var child in element.Children)
{
float childHeight = DefaultTextHeight;
if (child.Size != null && child.Size.Length > 1 && child.Size[1] > 0)
{
childHeight = child.Size[1];
}
if (childHeight > maxHeight) maxHeight = childHeight;
}
return maxHeight > 0 ? maxHeight : DefaultTextHeight;
}
/// <summary>
/// 计算元素宽度 | Calculate element width
/// </summary>