使用 C# 打印 Excel 文档(详细教程)

在 .NET 环境中实现高质量的 Excel 打印并非易事。开发者需要精确控制页面边距、纸张大小、网格线显示等参数,同时还要支持物理打印机和虚拟 PDF 打印机。如果没有成熟的解决方案,这些需求往往会让开发者花费大量时间在调优和适配工作上。

本文将带领读者使用 Spire.XLS for .NET 结合 System.Drawing.Printing 命名空间,构建完整的 Excel 打印解决方案。通过本文的学习,你将掌握加载 Excel 文档、配置打印参数、输出到物理打印机以及将 Excel 转换为 PDF 等核心技能。

一、准备工作

1.1 环境要求

  • .NET Framework 4.0 及以上版本 或 .NET Core/.NET 5+
  • Visual Studio 2017 及以上版本

1.2 安装 Spire.XLS for .NET

通过 NuGet 包管理器安装:

复制代码
Install-Package Spire.XLS

或者在 Visual Studio 中通过 NuGet 包管理器搜索 Spire.XLS 进行安装。

二、核心命名空间引入

复制代码
using Spire.Xls;
using System.Drawing.Printing;

三、打印到物理打印机

3.1 完整代码示例

复制代码
using Spire.Xls;
using System.Drawing.Printing;

namespace PrintExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 加载 Excel 文档
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("Input.xlsx");

            // 2. 遍历并配置每个工作表
            for (int i = 0; i < workbook.Worksheets.Count; i++)
            {
                Worksheet worksheet = workbook.Worksheets[i];
                PageSetup pageSetup = worksheet.PageSetup;

                // 设置页边距(单位:英寸)
                pageSetup.TopMargin = 0.3;
                pageSetup.BottomMargin = 0.3;
                pageSetup.LeftMargin = 0.3;
                pageSetup.RightMargin = 0.3;

                // 打印时显示网格线
                pageSetup.IsPrintGridlines = true;

                // 将所有列缩放到一页
                pageSetup.FitToPagesWide = 1;
                pageSetup.FitToPagesTall = 0;

                // 设置纸张大小为 A4
                pageSetup.PaperSize = PaperSizeType.PaperA4;
            }

            // 3. 获取打印机设置
            PrinterSettings settings = workbook.PrintDocument.PrinterSettings;

            // 4. 指定打印机名称
            settings.PrinterName = "Your Printer Name";

            // 5. 执行打印
            workbook.PrintDocument.Print();
        }
    }
}

3.2 代码详解

加载 Excel 文档
复制代码
Workbook workbook = new Workbook();
workbook.LoadFromFile("Input.xlsx");

创建 Workbook 对象并通过 LoadFromFile 方法加载需要打印的 Excel 文件。

页面设置(PageSetup)

遍历每个工作表,进行详细的页面配置:

  • 页边距设置TopMarginBottomMarginLeftMarginRightMargin 设置上下左右边距,单位为英寸。
  • 网格线IsPrintGridlines = true 让打印结果保留网格线,更易于阅读数据。
  • 缩放设置
    • FitToPagesWide = 1:将所有列缩放到一页宽
    • FitToPagesTall = 0:不限制行数,按实际高度分页
  • 纸张大小PaperSize = PaperSizeType.PaperA4 设置为 A4 纸
打印机配置与执行
复制代码
PrinterSettings settings = workbook.PrintDocument.PrinterSettings;
settings.PrinterName = "Your Printer Name";
workbook.PrintDocument.Print();

获取打印机设置对象,指定目标打印机名称,最后调用 Print() 方法执行打印。

四、打印到虚拟打印机(Microsoft Print to PDF)

4.1 完整代码示例

复制代码
using Spire.Xls;
using System.Drawing.Printing;

namespace PrintExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // 加载 Excel 文档
            Workbook workbook = new Workbook();
            workbook.LoadFromFile("Input.xlsx");

            // 配置工作表(同前面示例)
            for (int i = 0; i < workbook.Worksheets.Count; i++)
            {
                Worksheet worksheet = workbook.Worksheets[i];
                PageSetup pageSetup = worksheet.PageSetup;
                pageSetup.TopMargin = 0.3;
                pageSetup.BottomMargin = 0.3;
                pageSetup.LeftMargin = 0.3;
                pageSetup.RightMargin = 0.3;
                pageSetup.IsPrintGridlines = true;
                pageSetup.FitToPagesWide = 1;
                pageSetup.FitToPagesTall = 0;
                pageSetup.PaperSize = PaperSizeType.PaperA4;
            }

            // 设置虚拟打印机
            PrinterSettings settings = workbook.PrintDocument.PrinterSettings;
            settings.PrintToFile = true;  // 启用打印到文件
            settings.PrinterName = "Microsoft Print to PDF";  // 指定虚拟打印机

            // 执行打印并指定输出 PDF 文件路径
            workbook.PrintDocument.Print("ToPdf.pdf");
        }
    }
}

4.2 关键点说明

与打印到物理打印机的主要区别:

设置项 说明
settings.PrintToFile = true 启用"打印到文件"模式
settings.PrinterName = "Microsoft Print to PDF" 指定虚拟打印机名称
workbook.PrintDocument.Print("ToPdf.pdf") 使用带参数的 Print 方法指定输出文件路径

五、常见打印机名称参考

Windows 系统默认打印机

复制代码
// 获取默认打印机名称
string defaultPrinter = new PrinterSettings().PrinterName;

常见打印机名称

打印机类型 名称示例
Microsoft Print to PDF "Microsoft Print to PDF"
Microsoft XPS Document Writer "Microsoft XPS Document Writer"
Foxit Reader PDF Printer "Foxit Reader PDF Printer"
物理打印机 "HP LaserJet MFP M227fdw"

获取系统所有打印机

复制代码
foreach (string printer in PrinterSettings.InstalledPrinters)
{
    Console.WriteLine(printer);
}

六、更多页面设置选项

6.1 常用 PageSetup 属性

复制代码
// 设置打印方向
pageSetup.Orientation = PageOrientationType.Landscape;  // 横向
pageSetup.Orientation = PageOrientationType.Portrait;   // 纵向

// 设置缩放比例(1-100)
pageSetup.Zoom = 90;

// 设置页眉/页脚
pageSetup.HeaderMargin = 0.5;
pageSetup.FooterMargin = 0.5;

// 设置打印区域
pageSetup.PrintArea = "A1:F50";

// 设置标题行(每页重复打印)
pageSetup.PrintTitleRows = "$1:$2";

// 设置水平/垂直居中
pageSetup.HorzAlignment = PageSetupHorzAlignment.Center;
pageSetup.VertAlignment = PageSetupVertAlignment.Center;

6.2 纸张大小类型

复制代码
pageSetup.PaperSize = PaperSizeType.PaperA3;
pageSetup.PaperSize = PaperSizeType.PaperA4;
pageSetup.PaperSize = PaperSizeType.PaperA5;
pageSetup.PaperSize = PaperSizeType.PaperLetter;
pageSetup.PaperSize = PaperSizeType.PaperLegal;

七、高级场景:静默打印

如果需要实现无对话框的静默打印:

复制代码
// 隐藏打印对话框
workbook.PrintDocument.PrintController = new StandardPrintController();

// 设置打印份数
workbook.PrintDocument.PrinterSettings.Copies = 2;

// 静默执行打印
workbook.PrintDocument.Print();

八、异常处理

建议在实际应用中加入异常处理:

复制代码
try
{
    // 检查打印机是否存在
    if (!PrinterSettings.InstalledPrinters.Cast<string>().Any(p => p == printerName))
    {
        throw new Exception($"打印机 '{printerName}' 不存在");
    }

    workbook.PrintDocument.Print();
    Console.WriteLine("打印成功!");
}
catch (Exception ex)
{
    Console.WriteLine($"打印失败:{ex.Message}");
}

九、总结

本文详细介绍了使用 C# 和 Spire.XLS 库打印 Excel 文档的完整方案:

场景 关键代码
物理打印机 PrinterName 指定打印机 + Print()
PDF 输出 PrintToFile = true + Print("output.pdf")
页面配置 通过 PageSetup 对象设置边距、纸张、缩放等
静默打印 PrintController = new StandardPrintController()

Spire.XLS 提供了丰富的页面设置选项,配合 System.Drawing.Printing 的打印机管理能力,可以灵活满足各种 Excel 打印需求。无论是批量打印报表,还是将 Excel 转换为 PDF 归档,本文提供的代码都能作为可靠的基础实现。

相关推荐
格林威13 小时前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
J总裁的小芒果13 小时前
参数过多-分批传参
c#
典典分享指南14 小时前
短视频分镜提示词:让 AI 出片的产品口播
java·c#·bash·composer·symfony
Z59981784115 小时前
c#软件开发学习笔记--WPF(Canvas、数据绑定、MVVM模式、值转换器)
笔记·学习·c#
淡海水16 小时前
05-03-栈队列-PriorityQueue-TElement-TPriority-NET6优先队列语义与四叉堆实现
服务器·前端·c#·priorityqueue·clr·telement
tryCbest17 小时前
Excel常用公式(WPS vs Office)
excel·wps
taller_200019 小时前
【006】何时用 Python?何时用 Excel 公式?一文讲清
python·excel·公式·pie·py
2601_9499506320 小时前
Word、PDF、Excel题目怎么快速整理?
pdf·word·excel
leonkay1 天前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发
CSDN_RTKLIB1 天前
数据库七大符号表
c#