自动分页

当需要打印工作表时,ReoGrid 会自动执行分页操作。分页操作扫描工作表,并根据分页设置确定每页的打印范围。例如,下图展示了一个已进行纵向分页的工作表。

108

与 Excel 类似,ReoGrid 会找到每页能容纳的最大单元格数。无法完整打印的单元格将被移到下一页,如下所示:

109

执行自动分页或重置分页符

要随时执行自动分页或重置当前分页符:

sheet.AutoSplitPage();

注意: 此方法本身运行很快(< 10 毫秒),但如果远程打印机被设为默认打印机,则可能会较慢,因为从远程打印机获取纸张大小可能需要超过 100 毫秒(取决于网络环境)。

显示分页线

要在屏幕上显示分页线:

sheet.EnableSettings(WorksheetSettings.View_ShowPageBreaks);

结果: 120

自动检查可打印边界

如果未指定可打印范围,ReoGrid 将自动查找已使用的单元格范围并将其设置为可打印范围。

121

更改可打印范围

使用工作表的 PrintableRange 属性来更改可打印范围。

sheet.PrintableRange = new RangePosition(1, 1, 9, 9);

122

如果可打印范围超过纸张大小,将自动进行拆分。可打印范围之外的单元格不会被打印。

更改分页顺序

使用 PrintSettings.PageOrder 属性来更改分页方向。

112

sheet.PrintSettings.PageOrder = PrintPageOrder.DownThenOver;

更改页面设置

使用工作表的 PrintSettings 属性来更改纸张设置。

// 将页面设置为横向
sheet.PrintSettings.Landscape = true;

// 设置页边距
sheet.PrintSettings.Margins = new PageMargins(5);

示例:自动分页为横向

123

打印缩放

可以使用 PrintSettingsPageScaling 属性来设置打印缩放比例。

sheet.PrintSettings.PageScaling = 0.7f;    // 缩放到 70%

注意: 更改打印缩放时,工作表将自动重新分页。

插入分页符

要插入分页符,使用工作表的 RowPageBreaksColumnPageBreaks 属性:

// 插入分页符
sheet.ColumnPageBreaks.Add(5);

电子表格被分为两页:

124

用户分页符和系统分页符

有两种类型的分页符:实线是用户分页符,由 AutoSplitPage 方法或用户操作生成;虚线是系统分页符,由 ReoGrid 自动插入以将工作表分为多页。

125

更改分页符

要更改或移动分页符索引(无论是用户分页符还是系统分页符),使用以下方法:

void sheet.ChangeColumnPageBreak(int oldIndex, int newIndex);
void sheet.ChangeRowPageBreak(int oldIndex, int newIndex);

一旦分页符被更改,它将变为用户分页符,不再由 ReoGrid 自动更新。

遍历页面

工作表的 IteratePrintPages 方法用于遍历所有打印页面。该方法返回每页的范围位置:

sheet.IteratePrintPages( range => {
  Console.WriteLine("Page range is: " + range.ToAddress());
  return true;
});

输出如下所示:

Page range is: A1:E11
Page range is: F1:K11

也可以按指定顺序遍历页面:

sheet.IteratePrintPages(PrintPageOrder.OverThenDown, range => { ... });

如果未指定分页顺序,将使用打印设置中的页面顺序。

禁止终端用户更改/调整分页符

要防止终端用户使用鼠标更改分页符索引,设置工作表设置:

sheet.SetSettings(WorksheetSettings.Behavior_AllowUserChangingPageBreaks, false);

打印会话

打印会话用于打印整个工作簿或指定的工作表。要打印整个工作簿或多个工作表,从工作簿实例(控件)创建打印会话。要打印单个工作表,从该工作表创建打印会话。

263

打印单个工作表

var session = worksheet.CreatePrintSession();
session.Print();

打印整个工作簿(所有工作表)

var session = reoGridControl.CreatePrintSession();
session.Print();

打印指定的工作表

var session = reoGridControl.CreatePrintSession();
session.Worksheets.Clear();
session.Worksheets.Add(grid.Worksheets["Sheet1"]);
session.Worksheets.Add(grid.Worksheets["Sheet3"]);
session.Print();

打印预览

以下代码显示标准 .NET 打印预览对话框:

var sheet = reoGridControl.CurrentWorksheet;

using (var session = sheet.CreatePrintSession())
{
  using (PrintPreviewDialog ppd = new PrintPreviewDialog())
  {
    ppd.Document = session.PrintDocument;
    ppd.SetBounds(200, 200, 1024, 768);
    ppd.PrintPreviewControl.Zoom = 1d;
    ppd.ShowDialog(this);
  }
}

打印

以下代码使用默认打印设置打印工作表。

var session = sheet.CreatePrintSession();
session.Print();

通过标准打印对话框打印

以下代码显示标准打印对话框,然后打印指定的工作表。

System.Drawing.Printing.PrintDocument doc = null;

try
{
  doc = worksheet.CreatePrintSession().PrintDocument;
}
catch (Exception ex)
{
  MessageBox.Show(this, ex.Message, this.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
  return;
}

using (var pd = new System.Windows.Forms.PrintDialog())
{
  pd.Document = doc;
  pd.UseEXDialog = true;  // 在 64 位 Windows 中

  if (pd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  {
    doc.PrinterSettings = pd.PrinterSettings;
    doc.Print();
  }
}

if (doc != null) doc.Dispose();

显示系统页面设置对话框

using (PageSetupDialog psd = new PageSetupDialog())
{
  // 将 ReoGrid 页面设置转换为系统页面设置
  psd.PageSettings = worksheet.PrintSettings.CreateSystemPageSettings();

  psd.AllowMargins = true;
  psd.AllowPrinter = true;
  psd.AllowPaper = true;
  psd.EnableMetric = true;

  if (psd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  {
    // 将系统页面设置转换为 ReoGrid 页面设置
    worksheet.PrintSettings.ApplySystemPageSettings(psd.PageSettings);
  }
}

以编程方式选择打印机

使用 PrintSettings.PrinterName 将输出直接发送到特定打印机,无需显示对话框。将其设置为 null(默认值)以使用系统默认打印机。

sheet.PrintSettings.PrinterName = "Microsoft Print to PDF";

var session = sheet.CreatePrintSession();
session.Print();

打印网格线

默认情况下,网格线不会被打印。将 ShowGridLines 设置为 true 以在打印输出中包含网格线。

sheet.PrintSettings.ShowGridLines = true;

显示边距指示器

ShowMarginstrue 时,每个打印页面的边缘会绘制边距边界标记(在打印预览和打印输出中可见)。

sheet.PrintSettings.ShowMargins = true;

设置纸张大小

使用 PaperName 从预定义的纸张大小中选择。字符串必须与 PaperManager.PaperSizesInch 中的键匹配。

常用值:"A3""A4""A5""Letter""Legal""Ledger""B4""B5""JIS_B4""JIS_B5"

sheet.PrintSettings.PaperName = "A4";

PaperName 设置为已知尺寸时,PaperWidthPaperHeight 可以保持默认值。将 PaperName 设置为 "Custom" 允许您显式指定尺寸:

sheet.PrintSettings.PaperName   = "Custom";
sheet.PrintSettings.PaperWidth  = 6.0f;   // 英寸
sheet.PrintSettings.PaperHeight = 9.0f;   // 英寸

所有尺寸以英寸为单位。Landscape 标志在计算可打印区域时会自动交换宽度和高度。

可用纸张大小

类别名称
ISO A 系列A0 – A8
ISO B 系列B0 – B10
ISO C 系列C2 – C6
JIS B 系列JIS_B0 – JIS_B12
北美Letter, Legal, Ledger, Tabloid, Executive
ANSIANSI_C, ANSI_D, ANSI_E
其他D0, SRA0 – SRA4, RA0 – RA2, Custom

设置页边距

PageMargins 以英寸为单位存储四个独立的边距值。使用单值构造函数同时设置四边,或使用四值构造函数独立控制。

// 四边边距均为 1 英寸
sheet.PrintSettings.Margins = new PageMargins(1f);

// 上=0.5,下=0.5,左=1,右=1(英寸)
sheet.PrintSettings.Margins = new PageMargins(0.5f, 0.5f, 1f, 1f);

// 调整单独的边
var m = sheet.PrintSettings.Margins;
m.Left  = 0.75f;
m.Right = 0.75f;
sheet.PrintSettings.Margins = m;

// 移除所有边距
sheet.PrintSettings.Margins = PageMargins.Empty;

重置所有分页符

调用 ResetAllPageBreaks() 清除所有用户定义的分页符,并从头重新运行自动分页。

sheet.ResetAllPageBreaks();

这等同于清除 PrintableRange、移除 RowPageBreaksColumnPageBreaks 中的所有条目,然后调用 AutoSplitPage()

PrintableRange 更改事件

订阅 PrintableRangeChanged 以在可打印范围更改时收到通知。

sheet.PrintableRangeChanged += (s, e) =>
{
    Console.WriteLine("Printable range: " + sheet.PrintableRange.ToAddress());
};

PrintSettings 属性参考

属性类型默认值说明
PrinterNamestringnull输出打印机名称。null = 系统默认。
PaperNamestring"Letter"纸张大小名称(PaperManager.PaperSizesInch 中的键)。
PaperWidthfloat8.5f纸张宽度,英寸(当 PaperName"Custom" 时使用)。
PaperHeightfloat11f纸张高度,英寸(当 PaperName"Custom" 时使用)。
Landscapeboolfalsetrue 表示横向。
MarginsPageMarginsnew PageMargins(1f)页边距,英寸。
PageOrderPrintPageOrderDownThenOver页面顺序:DownThenOverOverThenDown
PageScalingfloat1f缩放比例(0.1 – 4.0)。1f = 100%。
ShowGridLinesboolfalse打印单元格网格线。
ShowMarginsboolfalse在页面上绘制边距边界标记。
这篇文章对您有帮助吗?