第八章:打印与导出
前言
欢迎来到第八章!
经过前面七章的学习,你的 Spread 表格已经具备了数据展示、美化、计算、交互、数据处理等完整功能。
但还有一个最常见的需求:用户想把表格打印出来,或者导出为 Excel/PDF 文件。
今天我们就来学习 FpSpread 的打印与导出功能。学完这一章,你的表格将真正具备“企业级交付”能力。
一、打印基础
1.1 最简单的打印
一行代码就能调出打印对话框:
csharp
// 弹出打印对话框,用户确认后打印 fpSpread1.PrintSheet(0); // 0 表示打印第一个 Sheet
1.2 静默打印(无对话框)
csharp
// 不弹出任何对话框,直接发送到默认打印机 PrintInfo printInfo = new PrintInfo(); printInfo.PrintToPrinter = true; printInfo.ShowDialog = false; // 不显示对话框 fpSpread1.SetPrintInfo(printInfo, 0); fpSpread1.PrintSheet(0);
1.3 打印预览
csharp
// 显示打印预览窗口 fpSpread1.PrintPreview(0);
二、打印设置(PrintInfo)
PrintInfo对象提供了丰富的打印配置选项。
2.1 基本设置
csharp
PrintInfo printInfo = new PrintInfo(); // 纸张设置 printInfo.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169); printInfo.Landscape = false; // 横向打印(true=横向,false=纵向) printInfo.Margin = new PrintMargin(50, 50, 50, 50); // 上、左、下、右(单位:1/100英寸) // 打印范围 printInfo.PrintType = PrintType.All; // 打印所有页(其他选项:CellRange、Selection、VisibleRows) // 打印质量 printInfo.PrintQuality = PrintQuality.High; // 打印份数 printInfo.Copies = 2; // 应用设置 fpSpread1.SetPrintInfo(printInfo, 0); fpSpread1.PrintSheet(0);2.2 页眉和页脚
csharp
PrintInfo printInfo = new PrintInfo(); // 页眉(居左、居中、居右用 \t 分隔) printInfo.Header = "公司机密\t销售报表\t打印日期:{Date}"; // 页脚 printInfo.Footer = "第 {Page} 页 / 共 {PageCount} 页\t\t制表人:管理员"; // 页眉/页脚字体 printInfo.HeaderFont = new Font("微软雅黑", 9, FontStyle.Bold); printInfo.FooterFont = new Font("宋体", 8); // 页眉/页脚高度 printInfo.HeaderHeight = 40; printInfo.FooterHeight = 30; fpSpread1.SetPrintInfo(printInfo, 0);页眉/页脚支持的变量:
| 变量 | 说明 | 示例输出 |
|---|---|---|
{Date} | 当前日期 | 2024-01-15 |
{Time} | 当前时间 | 14:30:25 |
{Page} | 当前页码 | 1 |
{PageCount} | 总页数 | 5 |
{SheetName} | 工作表名称 | Sheet1 |
2.3 缩放与自适应
csharp
PrintInfo printInfo = new PrintInfo(); // 缩放到一页宽 printInfo.ZoomFactor = 0; // 0 表示自动适应 printInfo.ZoomToFit = true; // 自动适应页面宽度 // 手动设置缩放比例(如 80%) printInfo.ZoomFactor = 80; // 百分比 printInfo.ZoomToFit = false; // 打印整个工作表在一页内 printInfo.ZoomToFit = true; printInfo.BestFitToWide = 1; // 适应宽度 printInfo.BestFitToTall = 1; // 适应高度 fpSpread1.SetPrintInfo(printInfo, 0);
2.4 网格线与边框
csharp
PrintInfo printInfo = new PrintInfo(); // 打印网格线 printInfo.PrintGrid = true; printInfo.PrintGridLineColor = Color.LightGray; // 打印行头/列头(默认 true) printInfo.PrintRowHeader = true; printInfo.PrintColumnHeader = true; // 打印背景色/图片(默认 true) printInfo.PrintBackground = true; // 打印颜色(黑白/彩色) printInfo.PrintColor = true; // true=彩色,false=黑白 fpSpread1.SetPrintInfo(printInfo, 0);
2.5 重复打印标题行/列
多页打印时,让标题行在每一页都出现:
csharp
PrintInfo printInfo = new PrintInfo(); // 重复打印第 0-2 行(表头),在每一页顶部都打印 printInfo.RepeatRowStart = 0; printInfo.RepeatRowEnd = 2; // 重复打印第 0 列(第一列),在每一页左侧都打印 printInfo.RepeatColStart = 0; printInfo.RepeatColEnd = 0; fpSpread1.SetPrintInfo(printInfo, 0);
2.6 分页控制
csharp
// 在指定行之前插入分页符 fpSpread1.Sheets[0].SetRowPageBreak(20, true); // 在第20行前分页 // 在指定列之前插入分页符 fpSpread1.Sheets[0].SetColumnPageBreak(5, true); // 在第5列前分页 // 取消分页符 fpSpread1.Sheets[0].SetRowPageBreak(20, false); fpSpread1.Sheets[0].ClearRowPageBreaks();
三、导出 Excel
3.1 基础导出
csharp
// 保存为 Excel 文件 fpSpread1.SaveExcel("C:\\报表.xlsx", FarPoint.Excel.ExcelSaveFlags.SaveCustomColumnHeaders); // 保存为 Excel 97-2003 格式(.xls) fpSpread1.SaveExcel("C:\\报表.xls", FarPoint.Excel.ExcelSaveFlags.SaveCustomColumnHeaders);3.2 带对话框的导出
csharp
private void btnExport_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Excel文件|*.xlsx|Excel 97-2003|*.xls"; sfd.FileName = $"报表_{DateTime.Now:yyyyMMdd}"; if (sfd.ShowDialog() == DialogResult.OK) { FarPoint.Excel.ExcelSaveFlags flags = FarPoint.Excel.ExcelSaveFlags.SaveCustomColumnHeaders; // 根据扩展名决定保存格式 if (sfd.FileName.EndsWith(".xls")) flags |= FarPoint.Excel.ExcelSaveFlags.SaveAsFiltered; // 保存为旧格式 fpSpread1.SaveExcel(sfd.FileName, flags); MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } }3.3 导出选项详解
csharp
// 多种导出标志的组合使用 FarPoint.Excel.ExcelSaveFlags flags = FarPoint.Excel.ExcelSaveFlags.SaveCustomColumnHeaders | // 保存自定义列头 FarPoint.Excel.ExcelSaveFlags.SaveAsFiltered | // 保存为筛选格式 FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat | // 使用 OpenXML 格式(.xlsx) FarPoint.Excel.ExcelSaveFlags.NoTotals; // 不导出汇总行 // 只导出当前筛选后的数据 flags |= FarPoint.Excel.ExcelSaveFlags.ExportAsFiltered; // 不导出公式,只导出值 flags |= FarPoint.Excel.ExcelSaveFlags.DataOnly; fpSpread1.SaveExcel("C:\\报表.xlsx", flags);常用 ExportFlags:
| 标志 | 说明 |
|---|---|
SaveCustomColumnHeaders | 保存自定义列头 |
SaveAsFiltered | 保存为筛选格式(.xls) |
UseOOXMLFormat | 使用 .xlsx 格式 |
DataOnly | 只保存数据,不保存公式 |
NoFormulas | 不保存公式 |
NoNotes | 不保存批注 |
ExportAsFiltered | 只导出筛选后的行 |
四、导出 PDF
4.1 基础 PDF 导出
csharp
// 安装需引入 FarPoint.Win.Spread.dll,导出为 PDF fpSpread1.SavePdf("C:\\报表.pdf", 0); // 0 表示第一个 Sheet // 保存所有 Sheet 到一个 PDF fpSpread1.SavePdf("C:\\全部报表.pdf");4.2 PDF 打印设置
csharp
// 创建 PDF 专用的 PrintInfo PrintInfo printInfo = new PrintInfo(); printInfo.PrintType = PrintType.All; printInfo.Landscape = true; // 横向 printInfo.ZoomToFit = true; // 适应页面宽度 printInfo.Header = "公司销售报表"; printInfo.Footer = "第 {Page} 页 / 共 {PageCount} 页"; // 应用设置 fpSpread1.SetPrintInfo(printInfo, 0); // 导出 PDF(使用设置) fpSpread1.SavePdf("C:\\报表.pdf", 0);4.3 带对话框的 PDF 导出
csharp
private void btnExportPDF_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "PDF文件|*.pdf"; sfd.FileName = $"报表_{DateTime.Now:yyyyMMdd}"; if (sfd.ShowDialog() == DialogResult.OK) { // 可选的 PDF 导出设置 // 1. 设置质量(默认值 = 300) fpSpread1.PdfExportQuality = 200; // 2. 导出 fpSpread1.SavePdf(sfd.FileName, 0); MessageBox.Show("PDF 导出成功!"); // 3. 询问是否打开 if (MessageBox.Show("是否立即打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { System.Diagnostics.Process.Start(sfd.FileName); } } }五、导出 CSV 和 HTML
5.1 导出 CSV
csharp
// 保存为 CSV(逗号分隔) fpSpread1.SaveText("C:\\数据.csv", TextFileFlags.ExportHeaders); // 保存为其他分隔符 fpSpread1.SaveText("C:\\数据.txt", TextFileFlags.ExportHeaders, null, "\t"); // Tab分隔 // 导出时包含/排除列头 TextFileFlags flags = TextFileFlags.ExportHeaders | TextFileFlags.ExportFormulas; fpSpread1.SaveText("C:\\数据.csv", flags);5.2 导出 HTML
csharp
// 保存整个 Sheet 为 HTML fpSpread1.SaveHtml("C:\\报表.html", 0); // 0 表示第一个 Sheet // 保存单个区域为 HTML fpSpread1.SaveHtml("C:\\区域.html", new CellRange(0, 0, 10, 5)); // 保存所有 Sheet 到一个 HTML 文件 fpSpread1.SaveHtml("C:\\全部报表.html", true); // true 表示所有 Sheet六、打印/导出的事件
6.1 打印前/后事件
csharp
// 开始打印 fpSpread1.PrintMessageBoxShowing += (sender, e) => { e.MessageBox = new FpPrintMessageBox(); e.MessageBox.Message = "正在准备打印,请稍后..."; }; // 打印进度 fpSpread1.PrintProgress += (sender, e) => { Console.WriteLine($"打印进度:{e.Percent}%"); progressBar1.Value = e.Percent; }; // 打印完成 fpSpread1.PrintSheetComplete += (sender, e) => { if (e.Error != null) MessageBox.Show($"打印出错:{e.Error.Message}"); else MessageBox.Show("打印完成!"); };6.2 导出事件
csharp
// 导出 Excel 前:可以进行最后的数据处理 fpSpread1.SaveExcelStarting += (sender, e) => { // 在导出前执行一些操作,如隐藏某些列 fpSpread1.Sheets[0].Columns[5].Visible = false; }; // 导出 Excel 完成 fpSpread1.SaveExcelCompleted += (sender, e) => { Console.WriteLine($"导出完成,文件:{e.FileName}"); };七、完整示例:报表中心
csharp
public partial class ReportForm : Form { public ReportForm() { InitializeComponent(); LoadReportData(); } private void LoadReportData() { // 模拟加载销售报表 SheetView sheet = fpSpread1.Sheets[0]; // 设置列头 sheet.ColumnHeader.Cells[0, 0].Text = "月份"; sheet.ColumnHeader.Cells[0, 1].Text = "销售额"; sheet.ColumnHeader.Cells[0, 2].Text = "成本"; sheet.ColumnHeader.Cells[0, 3].Text = "利润"; sheet.ColumnHeader.Cells[0, 4].Text = "利润率"; // 填充测试数据 string[] months = { "1月", "2月", "3月", "4月", "5月", "6月" }; Random rnd = new Random(); for (int i = 0; i < months.Length; i++) { sheet.Cells[i, 0].Value = months[i]; sheet.Cells[i, 1].Value = rnd.Next(80, 150) * 10000; sheet.Cells[i, 2].Value = rnd.Next(50, 100) * 10000; sheet.Cells[i, 3].Formula = $"=B{i+2}-C{i+2}"; sheet.Cells[i, 4].Formula = $"=D{i+2}/B{i+2}"; // 设置利润率格式为百分比 PercentCellType percentType = new PercentCellType(); percentType.DecimalPlaces = 1; sheet.Cells[i, 4].CellType = percentType; } // 统计行 sheet.Rows.Add(months.Length, 1); int sumRow = months.Length; sheet.Cells[sumRow, 0].Value = "合计"; sheet.Cells[sumRow, 1].Formula = $"=SUM(B2:B{sumRow})"; sheet.Cells[sumRow, 2].Formula = $"=SUM(C2:C{sumRow})"; sheet.Cells[sumRow, 3].Formula = $"=D{sumRow}+1"; } // 打印预览 private void btnPrintPreview_Click(object sender, EventArgs e) { SetPrintSettings(); fpSpread1.PrintPreview(0); } // 直接打印 private void btnPrint_Click(object sender, EventArgs e) { SetPrintSettings(); fpSpread1.PrintSheet(0); } // 打印设置 private void SetPrintSettings() { PrintInfo printInfo = new PrintInfo(); // 页眉页脚 printInfo.Header = "公司月度销售报表\t\t{Date}"; printInfo.Footer = "第 {Page} 页 / 共 {PageCount} 页"; // 缩放 printInfo.ZoomToFit = true; // 重复标题行 printInfo.RepeatRowStart = 0; printInfo.RepeatRowEnd = 0; // 边距 printInfo.Margin = new PrintMargin(50, 50, 50, 50); fpSpread1.SetPrintInfo(printInfo, 0); } // 导出 Excel private void btnExportExcel_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Excel文件|*.xlsx"; sfd.FileName = $"销售报表_{DateTime.Now:yyyyMMdd}"; if (sfd.ShowDialog() == DialogResult.OK) { FarPoint.Excel.ExcelSaveFlags flags = FarPoint.Excel.ExcelSaveFlags.SaveCustomColumnHeaders | FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat; fpSpread1.SaveExcel(sfd.FileName, flags); MessageBox.Show("导出成功!", "提示"); if (MessageBox.Show("是否打开文件?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { System.Diagnostics.Process.Start(sfd.FileName); } } } // 导出 PDF private void btnExportPDF_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "PDF文件|*.pdf"; sfd.FileName = $"销售报表_{DateTime.Now:yyyyMMdd}"; if (sfd.ShowDialog() == DialogResult.OK) { // 复用打印设置 SetPrintSettings(); fpSpread1.PdfExportQuality = 200; fpSpread1.SavePdf(sfd.FileName, 0); MessageBox.Show("PDF 导出成功!"); } } // 导出 CSV private void btnExportCSV_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "CSV文件|*.csv"; sfd.FileName = $"销售报表_{DateTime.Now:yyyyMMdd}"; if (sfd.ShowDialog() == DialogResult.OK) { fpSpread1.SaveText(sfd.FileName, TextFileFlags.ExportHeaders); MessageBox.Show("CSV 导出成功!"); } } }八、常见问题
Q1:打印出来和屏幕显示不一样?
A:检查PrintInfo中的ZoomToFit、BestFitToWide、BestFitToTall设置。
Q2:导出的 Excel 文件很大?
A:尝试使用ExportAsFiltered标志,或只导出需要的数据区域。
Q3:PDF 导出中文乱码?
A:需要在PrintInfo中设置支持中文的字体:
csharp
printInfo.HeaderFont = new Font("微软雅黑", 10); printInfo.FooterFont = new Font("微软雅黑", 9);Q4:导出图片/图表到 Excel?
A:FpSpread 原生支持导出图表,只要在 Spread 中添加了图表控件,导出到 Excel 时会自动保留。
本章小结
今天我们学了:
| 功能 | 关键代码 | 常用场景 |
|---|---|---|
| 打印预览 | PrintPreview() | 用户确认格式后再打印 |
| 直接打印 | PrintSheet() | 静默打印,不弹对话框 |
| 打印设置 | PrintInfo | 页眉页脚、缩放、重复标题 |
| Excel 导出 | SaveExcel() | 用户需要编辑报表 |
| PDF 导出 | SavePdf() | 不可编辑的最终交付件 |
| CSV 导出 | SaveText() | 数据交换、导入其他系统 |
| HTML 导出 | SaveHtml() | 网页展示 |
