是否可以向数据透视表添加手动分页符(Excel Interop)?
Is it possible to add manual page breaks to PivotTables (Excel Interop)?
当以编程方式生成 "normal" Excel sheet 时,可以将范围的分页符 属性 设置为 xlPageBreakManual,然后您可以指定分页的位置代码如下:
workbook.Worksheets[0].VPageBreaks.Add(sheet.Range["G1"]);
...但这在打印数据透视表时可能吗?我不这么认为,因为数据透视表是从数据源提供的(在我的例子中是 "raw data" 的一页,我随后隐藏了它),但如果是的话,我想知道如何。
这就是我现在为打印准备 PivotTablized sheet 所做的工作:
private void FormatPivotTable()
{
. . .
ConfigureForPrinting(_xlPivotTableSheet.UsedRange.Rows.Count);
}
private void ConfigureForPrinting(int finalRow)
{
string lastColumn = GetExcelTextColumnName(_xlPivotTableSheet.UsedRange.Columns.Count);
string printArea = String.Format("A1:{0}{1}", lastColumn, finalRow);
_xlPivotTableSheet.PageSetup.PrintArea = printArea;
_xlPivotTableSheet.PageSetup.Orientation = XlPageOrientation.xlLandscape;
_xlPivotTableSheet.PageSetup.Zoom = false;
_xlPivotTableSheet.PageSetup.FitToPagesWide = 1;
_xlPivotTableSheet.PageSetup.FitToPagesTall = 50;
_xlPivotTableSheet.PageSetup.LeftMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.RightMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.TopMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.BottomMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.HeaderMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.FooterMargin = _xlApp.Application.InchesToPoints(0.5);
string rangeToRepeat = string.Format("$A:[=12=]", lastColumn);
_xlPivotTableSheet.PageSetup.PrintTitleRows = rangeToRepeat;
}
用户想要的是每个逻辑数据块都放在一个 sheet 上,这样一个块(5 行)不会跨越多个 sheet。 IOW,如果块开始时当前页上的 space 行少于 5 行,则使用分页符跳到下一页。
数据透视表可以做到这一点吗?
我理解,当您提到 "logical blocks of data" 时,它表示对应于 PivotFieldItem
的数据。如果是这种情况,请尝试以下操作:
将这些 PivotTable
属性设置为 TRUE
:
ActiveSheet.PivotTables("PivotTable1").PrintTitles = True
ActiveSheet.PivotTables("PivotTable1").RepeatItemsOnEachPrintedPage = True
同时设置为 TRUE
LayoutPageBreak
属性 的 PivotField
,您希望在每次更改项目时为其设置分页符:
ActiveSheet.PivotTables("PivotTable1").PivotFields("Class").LayoutPageBreak = True
还需要将此属性设置为TRUE
,以防只有一条记录的项目。
ActiveSheet.PivotTables("PivotTable1").PivotFields("Class").LayoutBlankLine = True
根据需要替换 "PivotTable1" 和 "Class" 值
虽然上面的命令在 VBA
中,但它们应该可以让您很好地了解如何使用 C#
设置这些属性
当以编程方式生成 "normal" Excel sheet 时,可以将范围的分页符 属性 设置为 xlPageBreakManual,然后您可以指定分页的位置代码如下:
workbook.Worksheets[0].VPageBreaks.Add(sheet.Range["G1"]);
...但这在打印数据透视表时可能吗?我不这么认为,因为数据透视表是从数据源提供的(在我的例子中是 "raw data" 的一页,我随后隐藏了它),但如果是的话,我想知道如何。
这就是我现在为打印准备 PivotTablized sheet 所做的工作:
private void FormatPivotTable()
{
. . .
ConfigureForPrinting(_xlPivotTableSheet.UsedRange.Rows.Count);
}
private void ConfigureForPrinting(int finalRow)
{
string lastColumn = GetExcelTextColumnName(_xlPivotTableSheet.UsedRange.Columns.Count);
string printArea = String.Format("A1:{0}{1}", lastColumn, finalRow);
_xlPivotTableSheet.PageSetup.PrintArea = printArea;
_xlPivotTableSheet.PageSetup.Orientation = XlPageOrientation.xlLandscape;
_xlPivotTableSheet.PageSetup.Zoom = false;
_xlPivotTableSheet.PageSetup.FitToPagesWide = 1;
_xlPivotTableSheet.PageSetup.FitToPagesTall = 50;
_xlPivotTableSheet.PageSetup.LeftMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.RightMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.TopMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.BottomMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.HeaderMargin = _xlApp.Application.InchesToPoints(0.5);
_xlPivotTableSheet.PageSetup.FooterMargin = _xlApp.Application.InchesToPoints(0.5);
string rangeToRepeat = string.Format("$A:[=12=]", lastColumn);
_xlPivotTableSheet.PageSetup.PrintTitleRows = rangeToRepeat;
}
用户想要的是每个逻辑数据块都放在一个 sheet 上,这样一个块(5 行)不会跨越多个 sheet。 IOW,如果块开始时当前页上的 space 行少于 5 行,则使用分页符跳到下一页。
数据透视表可以做到这一点吗?
我理解,当您提到 "logical blocks of data" 时,它表示对应于 PivotFieldItem
的数据。如果是这种情况,请尝试以下操作:
将这些 PivotTable
属性设置为 TRUE
:
ActiveSheet.PivotTables("PivotTable1").PrintTitles = True
ActiveSheet.PivotTables("PivotTable1").RepeatItemsOnEachPrintedPage = True
同时设置为 TRUE
LayoutPageBreak
属性 的 PivotField
,您希望在每次更改项目时为其设置分页符:
ActiveSheet.PivotTables("PivotTable1").PivotFields("Class").LayoutPageBreak = True
还需要将此属性设置为TRUE
,以防只有一条记录的项目。
ActiveSheet.PivotTables("PivotTable1").PivotFields("Class").LayoutBlankLine = True
根据需要替换 "PivotTable1" 和 "Class" 值
虽然上面的命令在 VBA
中,但它们应该可以让您很好地了解如何使用 C#