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

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

执行自动分页或重置分页符
要随时执行自动分页或重置当前分页符:
sheet.AutoSplitPage();
注意: 此方法本身运行很快(< 10 毫秒),但如果远程打印机被设为默认打印机,则可能会较慢,因为从远程打印机获取纸张大小可能需要超过 100 毫秒(取决于网络环境)。
显示分页线
要在屏幕上显示分页线:
sheet.EnableSettings(WorksheetSettings.View_ShowPageBreaks);
结果:

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

更改可打印范围
使用工作表的 PrintableRange 属性来更改可打印范围。
sheet.PrintableRange = new RangePosition(1, 1, 9, 9);

如果可打印范围超过纸张大小,将自动进行拆分。可打印范围之外的单元格不会被打印。
更改分页顺序
使用 PrintSettings.PageOrder 属性来更改分页方向。

sheet.PrintSettings.PageOrder = PrintPageOrder.DownThenOver;
更改页面设置
使用工作表的 PrintSettings 属性来更改纸张设置。
// 将页面设置为横向
sheet.PrintSettings.Landscape = true;
// 设置页边距
sheet.PrintSettings.Margins = new PageMargins(5);
示例:自动分页为横向

打印缩放
可以使用 PrintSettings 的 PageScaling 属性来设置打印缩放比例。
sheet.PrintSettings.PageScaling = 0.7f; // 缩放到 70%
注意: 更改打印缩放时,工作表将自动重新分页。
插入分页符
要插入分页符,使用工作表的 RowPageBreaks 和 ColumnPageBreaks 属性:
// 插入分页符
sheet.ColumnPageBreaks.Add(5);
电子表格被分为两页:

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

更改分页符
要更改或移动分页符索引(无论是用户分页符还是系统分页符),使用以下方法:
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);
打印会话
打印会话用于打印整个工作簿或指定的工作表。要打印整个工作簿或多个工作表,从工作簿实例(控件)创建打印会话。要打印单个工作表,从该工作表创建打印会话。

打印单个工作表
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;
显示边距指示器
当 ShowMargins 为 true 时,每个打印页面的边缘会绘制边距边界标记(在打印预览和打印输出中可见)。
sheet.PrintSettings.ShowMargins = true;
设置纸张大小
使用 PaperName 从预定义的纸张大小中选择。字符串必须与 PaperManager.PaperSizesInch 中的键匹配。
常用值:"A3"、"A4"、"A5"、"Letter"、"Legal"、"Ledger"、"B4"、"B5"、"JIS_B4"、"JIS_B5"。
sheet.PrintSettings.PaperName = "A4";
当 PaperName 设置为已知尺寸时,PaperWidth 和 PaperHeight 可以保持默认值。将 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 |
| ANSI | ANSI_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、移除 RowPageBreaks 和 ColumnPageBreaks 中的所有条目,然后调用 AutoSplitPage()。
PrintableRange 更改事件
订阅 PrintableRangeChanged 以在可打印范围更改时收到通知。
sheet.PrintableRangeChanged += (s, e) =>
{
Console.WriteLine("Printable range: " + sheet.PrintableRange.ToAddress());
};
PrintSettings 属性参考
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
PrinterName | string | null | 输出打印机名称。null = 系统默认。 |
PaperName | string | "Letter" | 纸张大小名称(PaperManager.PaperSizesInch 中的键)。 |
PaperWidth | float | 8.5f | 纸张宽度,英寸(当 PaperName 为 "Custom" 时使用)。 |
PaperHeight | float | 11f | 纸张高度,英寸(当 PaperName 为 "Custom" 时使用)。 |
Landscape | bool | false | true 表示横向。 |
Margins | PageMargins | new PageMargins(1f) | 页边距,英寸。 |
PageOrder | PrintPageOrder | DownThenOver | 页面顺序:DownThenOver 或 OverThenDown。 |
PageScaling | float | 1f | 缩放比例(0.1 – 4.0)。1f = 100%。 |
ShowGridLines | bool | false | 打印单元格网格线。 |
ShowMargins | bool | false | 在页面上绘制边距边界标记。 |