Skip to content

Excel页面布局与打印设置详解

页面布局基础

页面设置对象简介

在Excel自动化中,页面布局和打印设置是通过IExcelPageSetup接口来管理的。这个接口提供了对Excel页面设置功能的完整封装。

csharp
// 获取工作表的页面设置对象
var worksheet = workbook.Worksheets[0];
var pageSetup = worksheet.PageSetup;

// 基本页面设置
pageSetup.Orientation = XlPageOrientation.xlLandscape; // 横向
pageSetup.PaperSize = XlPaperSize.xlPaperA4;           // A4纸张
pageSetup.Zoom = 100;                                  // 100%缩放

页面方向设置

Excel支持纵向和横向两种页面方向:

csharp
public enum XlPageOrientation
{
    xlPortrait = 1,   // 纵向
    xlLandscape = 2   // 横向
}

// 应用场景示例
void SetPageOrientation(IExcelPageSetup pageSetup, bool isLandscape)
{
    pageSetup.Orientation = isLandscape ? 
        XlPageOrientation.xlLandscape : 
        XlPageOrientation.xlPortrait;
}

纸张大小设置

Excel支持多种纸张尺寸:

csharp
// 常用纸张类型枚举
public enum XlPaperSize
{
    xlPaperA4 = 9,         // A4纸张
    xlPaperLetter = 1,     // 信纸
    xlPaperLegal = 5,      // 法律用纸
    xlPaperA3 = 8,         // A3纸张
    xlPaperB5 = 13,        // B5纸张
    xlPaperEnvelope10 = 20 // 10号信封
}

// 动态设置纸张大小
void SetPaperSizeBasedOnContent(IExcelPageSetup pageSetup, int rowCount, int colCount)
{
    if (rowCount > 50 || colCount > 15)
    {
        pageSetup.PaperSize = XlPaperSize.xlPaperA3;
        pageSetup.Orientation = XlPageOrientation.xlLandscape;
    }
    else
    {
        pageSetup.PaperSize = XlPaperSize.xlPaperA4;
        pageSetup.Orientation = XlPageOrientation.xlPortrait;
    }
}

缩放和适合页面设置

csharp
// 缩放设置
void ConfigureScaling(IExcelPageSetup pageSetup)
{
    // 方法1:直接设置缩放比例
    pageSetup.Zoom = 85; // 85%缩放
    
    // 方法2:适合页面宽度和高度
    pageSetup.FitToPagesWide = 1; // 适合1页宽
    pageSetup.FitToPagesTall = 0; // 不限页高(自动调整)
    
    // 方法3:综合设置
    if (pageSetup.FitToPagesWide == 1 && pageSetup.FitToPagesTall == 1)
    {
        Console.WriteLine("文档将缩放到恰好一页大小");
    }
}

页面设置管理类

下面是一个完整的页面设置管理类:

csharp
public class PageLayoutManager
{
    private readonly IExcelPageSetup _pageSetup;
    
    public PageLayoutManager(IExcelPageSetup pageSetup)
    {
        _pageSetup = pageSetup ?? throw new ArgumentNullException(nameof(pageSetup));
    }
    
    // 设置标准A4页面
    public void SetStandardA4Layout()
    {
        _pageSetup.Orientation = XlPageOrientation.xlPortrait;
        _pageSetup.PaperSize = XlPaperSize.xlPaperA4;
        _pageSetup.Zoom = 100;
        _pageSetup.LeftMargin = 0.75;
        _pageSetup.RightMargin = 0.75;
        _pageSetup.TopMargin = 1.0;
        _pageSetup.BottomMargin = 1.0;
    }
    
    // 设置横向报表布局
    public void SetLandscapeReportLayout()
    {
        _pageSetup.Orientation = XlPageOrientation.xlLandscape;
        _pageSetup.PaperSize = XlPaperSize.xlPaperA4;
        _pageSetup.Zoom = 80; // 缩小以容纳更多列
        _pageSetup.CenterHorizontally = true;
        _pageSetup.CenterVertically = false;
    }
    
    // 重置为默认设置
    public void ResetToDefaults()
    {
        _pageSetup.Reset();
    }
    
    // 验证页面设置
    public bool ValidatePageSettings()
    {
        if (_pageSetup.Zoom < 10 || _pageSetup.Zoom > 400)
        {
            Console.WriteLine("警告:缩放比例应在10%-400%之间");
            return false;
        }
        
        if (_pageSetup.LeftMargin + _pageSetup.RightMargin > 6.0)
        {
            Console.WriteLine("警告:左右边距之和过大,可能影响打印效果");
            return false;
        }
        
        return true;
    }
}

页面设置的保存和恢复

csharp
public class PageSetupSnapshot
{
    public XlPageOrientation Orientation { get; set; }
    public XlPaperSize PaperSize { get; set; }
    public int Zoom { get; set; }
    public double LeftMargin { get; set; }
    public double RightMargin { get; set; }
    public double TopMargin { get; set; }
    public double BottomMargin { get; set; }
    
    public static PageSetupSnapshot CreateSnapshot(IExcelPageSetup pageSetup)
    {
        return new PageSetupSnapshot
        {
            Orientation = pageSetup.Orientation,
            PaperSize = pageSetup.PaperSize,
            Zoom = pageSetup.Zoom,
            LeftMargin = pageSetup.LeftMargin,
            RightMargin = pageSetup.RightMargin,
            TopMargin = pageSetup.TopMargin,
            BottomMargin = pageSetup.BottomMargin
        };
    }
    
    public void Restore(IExcelPageSetup pageSetup)
    {
        pageSetup.Orientation = Orientation;
        pageSetup.PaperSize = PaperSize;
        pageSetup.Zoom = Zoom;
        pageSetup.LeftMargin = LeftMargin;
        pageSetup.RightMargin = RightMargin;
        pageSetup.TopMargin = TopMargin;
        pageSetup.BottomMargin = BottomMargin;
    }
}

// 使用示例
void TemporaryPageSetup(IExcelPageSetup pageSetup, Action action)
{
    var snapshot = PageSetupSnapshot.CreateSnapshot(pageSetup);
    
    try
    {
        // 临时设置横向A3布局
        pageSetup.Orientation = XlPageOrientation.xlLandscape;
        pageSetup.PaperSize = XlPaperSize.xlPaperA3;
        
        action();
    }
    finally
    {
        // 恢复原始设置
        snapshot.Restore(pageSetup);
    }
}

页面设置的批量操作

csharp
public class BatchPageSetupManager
{
    private readonly IExcelWorkbook _workbook;
    
    public BatchPageSetupManager(IExcelWorkbook workbook)
    {
        _workbook = workbook;
    }
    
    // 为所有工作表设置相同的页面布局
    public void ApplyUniformLayoutToAllSheets(XlPageOrientation orientation, XlPaperSize paperSize)
    {
        foreach (var worksheet in _workbook.Worksheets)
        {
            var pageSetup = worksheet.PageSetup;
            pageSetup.Orientation = orientation;
            pageSetup.PaperSize = paperSize;
            pageSetup.Zoom = 100;
        }
    }
    
    // 根据工作表名称设置不同的布局
    public void ApplyCustomLayoutBySheetName(Dictionary<string, PageSetupSnapshot> layouts)
    {
        foreach (var worksheet in _workbook.Worksheets)
        {
            if (layouts.TryGetValue(worksheet.Name, out var snapshot))
            {
                snapshot.Restore(worksheet.PageSetup);
            }
        }
    }
    
    // 批量重置页面设置
    public void ResetAllPageSetups()
    {
        foreach (var worksheet in _workbook.Worksheets)
        {
            worksheet.PageSetup.Reset();
        }
    }
}

页边距设置

基本页边距设置

Excel页面边距以英寸为单位进行设置:

csharp
// 标准页边距设置
void SetStandardMargins(IExcelPageSetup pageSetup)
{
    // 标准商业文档边距
    pageSetup.LeftMargin = 1.0;   // 左边距1英寸
    pageSetup.RightMargin = 1.0;  // 右边距1英寸
    pageSetup.TopMargin = 1.0;    // 上边距1英寸
    pageSetup.BottomMargin = 1.0; // 下边距1英寸
}

// 最小化页边距(最大打印区域)
void SetMinimalMargins(IExcelPageSetup pageSetup)
{
    pageSetup.LeftMargin = 0.25;   // 最小左边距
    pageSetup.RightMargin = 0.25; // 最小右边距
    pageSetup.TopMargin = 0.25;   // 最小上边距
    pageSetup.BottomMargin = 0.25; // 最小下边距
}

// 不对称边距设置
void SetAsymmetricMargins(IExcelPageSetup pageSetup)
{
    pageSetup.LeftMargin = 1.5;   // 装订边距较宽
    pageSetup.RightMargin = 0.75; // 右边距较窄
    pageSetup.TopMargin = 1.0;
    pageSetup.BottomMargin = 1.0;
}

页眉页脚边距

csharp
void SetHeaderFooterMargins(IExcelPageSetup pageSetup)
{
    // 页眉页脚与内容区域的距离
    pageSetup.HeaderMargin = 0.5;  // 页眉边距0.5英寸
    pageSetup.FooterMargin = 0.5; // 页脚边距0.5英寸
    
    // 验证边距设置的合理性
    if (pageSetup.HeaderMargin > pageSetup.TopMargin)
    {
        Console.WriteLine("警告:页眉边距不能大于上边距");
        pageSetup.HeaderMargin = pageSetup.TopMargin - 0.1;
    }
}

居中设置

csharp
void ConfigureCentering(IExcelPageSetup pageSetup)
{
    // 水平居中
    pageSetup.CenterHorizontally = true;
    
    // 垂直居中
    pageSetup.CenterVertically = true;
    
    // 根据内容动态设置居中
    if (pageSetup.CenterHorizontally && pageSetup.CenterVertically)
    {
        Console.WriteLine("文档内容将在页面上完全居中显示");
    }
}

边距验证工具

csharp
public class MarginValidator
{
    public static bool ValidateMargins(IExcelPageSetup pageSetup)
    {
        var errors = new List<string>();
        
        // 检查最小边距
        if (pageSetup.LeftMargin < 0.25)
            errors.Add("左边距不能小于0.25英寸");
            
        if (pageSetup.RightMargin < 0.25)
            errors.Add("右边距不能小于0.25英寸");
            
        if (pageSetup.TopMargin < 0.25)
            errors.Add("上边距不能小于0.25英寸");
            
        if (pageSetup.BottomMargin < 0.25)
            errors.Add("下边距不能小于0.25英寸");
        
        // 检查页眉页脚边距
        if (pageSetup.HeaderMargin >= pageSetup.TopMargin)
            errors.Add("页眉边距必须小于上边距");
            
        if (pageSetup.FooterMargin >= pageSetup.BottomMargin)
            errors.Add("页脚边距必须小于下边距");
        
        // 输出错误信息
        if (errors.Any())
        {
            Console.WriteLine("边距设置错误:");
            foreach (var error in errors)
                Console.WriteLine($"  - {error}");
            return false;
        }
        
        return true;
    }
    
    public static void SuggestOptimalMargins(IExcelPageSetup pageSetup)
    {
        var totalWidthMargin = pageSetup.LeftMargin + pageSetup.RightMargin;
        var totalHeightMargin = pageSetup.TopMargin + pageSetup.BottomMargin;
        
        if (totalWidthMargin > 3.0)
        {
            Console.WriteLine("建议:左右边距之和较大,考虑减小边距以增加打印区域");
        }
        
        if (totalHeightMargin > 3.0)
        {
            Console.WriteLine("建议:上下边距之和较大,考虑减小边距以增加打印区域");
        }
    }
}

边距计算工具

csharp
public class MarginCalculator
{
    // 计算可用打印区域
    public static (double availableWidth, double availableHeight) CalculatePrintableArea(
        IExcelPageSetup pageSetup, XlPaperSize paperSize)
    {
        var paperDimensions = GetPaperDimensions(paperSize);
        
        var availableWidth = paperDimensions.width - pageSetup.LeftMargin - pageSetup.RightMargin;
        var availableHeight = paperDimensions.height - pageSetup.TopMargin - pageSetup.BottomMargin;
        
        return (availableWidth, availableHeight);
    }
    
    // 获取标准纸张尺寸
    private static (double width, double height) GetPaperDimensions(XlPaperSize paperSize)
    {
        return paperSize switch
        {
            XlPaperSize.xlPaperA4 => (8.27, 11.69),     // A4尺寸(英寸)
            XlPaperSize.xlPaperLetter => (8.5, 11.0),   // 信纸尺寸
            XlPaperSize.xlPaperA3 => (11.69, 16.54),   // A3尺寸
            XlPaperSize.xlPaperLegal => (8.5, 14.0),   // 法律用纸
            _ => (8.27, 11.69)                         // 默认A4
        };
    }
    
    // 根据内容自动调整边距
    public static void AutoAdjustMargins(IExcelPageSetup pageSetup, 
        int rowCount, int colCount, XlPaperSize paperSize)
    {
        var (width, height) = GetPaperDimensions(paperSize);
        
        // 根据列数调整左右边距
        if (colCount > 10)
        {
            pageSetup.LeftMargin = 0.5;
            pageSetup.RightMargin = 0.5;
        }
        else
        {
            pageSetup.LeftMargin = 1.0;
            pageSetup.RightMargin = 1.0;
        }
        
        // 根据行数调整上下边距
        if (rowCount > 40)
        {
            pageSetup.TopMargin = 0.5;
            pageSetup.BottomMargin = 0.5;
        }
        else
        {
            pageSetup.TopMargin = 1.0;
            pageSetup.BottomMargin = 1.0;
        }
    }
}

页眉页脚配置

基本页眉页脚设置

Excel页眉页脚支持三个区域:左、中、右

csharp
void ConfigureBasicHeadersFooters(IExcelPageSetup pageSetup)
{
    // 设置页眉
    pageSetup.LeftHeader = "公司名称";
    pageSetup.CenterHeader = "销售报表";
    pageSetup.RightHeader = DateTime.Now.ToString("yyyy-MM-dd");
    
    // 设置页脚
    pageSetup.LeftFooter = "机密文件";
    pageSetup.CenterFooter = "第 &P 页,共 &N 页"; // 使用页码代码
    pageSetup.RightFooter = "打印时间:&T";         // 使用时间代码
}

页眉页脚代码系统

Excel使用特殊代码来控制页眉页脚格式:

csharp
public class HeaderFooterCodeManager
{
    public static string GetStandardCode(int codeType)
    {
        return codeType switch
        {
            1 => "&P",      // 当前页码
            2 => "&N",      // 总页数
            3 => "&D",      // 当前日期
            4 => "&T",      // 当前时间
            5 => "&F",      // 文件名
            6 => "&A",      // 工作表名
            7 => "&Z",      // 文件路径
            8 => "&G",      // 图片
            9 => "&B",      // 粗体
            10 => "&I",     // 斜体
            11 => "&U",     // 下划线
            12 => "&\"Arial\"", // 字体
            13 => "&12",    // 字号
            _ => ""
        };
    }
    
    // 创建动态页眉页脚
    public static string CreateDynamicFooter(string fileName, string sheetName)
    {
        return $"文件:&F | 工作表:&A | 页码:第 &P 页,共 &N 页 | 打印时间:&D &T";
    }
    
    // 格式化代码组合
    public static string FormatWithCodes(string text, bool bold = false, bool italic = false)
    {
        var codes = "";
        if (bold) codes += "&B";
        if (italic) codes += "&I";
        
        return codes + text + (bold ? "&B" : "") + (italic ? "&I" : "");
    }
}

自定义页眉页脚设置

csharp
public class CustomHeaderFooterBuilder
{
    private readonly IExcelPageSetup _pageSetup;
    
    public CustomHeaderFooterBuilder(IExcelPageSetup pageSetup)
    {
        _pageSetup = pageSetup;
    }
    
    // 设置三栏式页眉
    public void SetThreeColumnHeader(string leftText, string centerText, string rightText)
    {
        _pageSetup.LeftHeader = leftText;
        _pageSetup.CenterHeader = centerText;
        _pageSetup.RightHeader = rightText;
    }
    
    // 设置带格式的页脚
    public void SetFormattedFooter(string fileName, string department, bool showPageNumbers = true)
    {
        var footer = $"部门:{department} | 文件:{fileName}";
        
        if (showPageNumbers)
        {
            footer += " | 第 &P 页";
        }
        
        _pageSetup.CenterFooter = footer;
    }
    
    // 设置不同奇偶页的页眉页脚
    public void SetDifferentOddEvenPages(string oddHeader, string evenHeader, 
                                        string oddFooter, string evenFooter)
    {
        _pageSetup.OddAndEvenPagesHeaderFooter = true;
        _pageSetup.CenterHeader = oddHeader; // 奇数页页眉
        // 注意:Excel中偶数页页眉需要通过其他方式设置
    }
    
    // 设置首页不同的页眉页脚
    public void SetDifferentFirstPage(string firstPageHeader, string firstPageFooter)
    {
        _pageSetup.DifferentFirstPageHeaderFooter = true;
        _pageSetup.CenterHeader = firstPageHeader;
        _pageSetup.CenterFooter = firstPageFooter;
    }
}

页眉页脚模板系统

csharp
public class HeaderFooterTemplate
{
    public string Name { get; set; }
    public string LeftHeader { get; set; }
    public string CenterHeader { get; set; }
    public string RightHeader { get; set; }
    public string LeftFooter { get; set; }
    public string CenterFooter { get; set; }
    public string RightFooter { get; set; }
    
    public static HeaderFooterTemplate CreateStandardTemplate()
    {
        return new HeaderFooterTemplate
        {
            Name = "标准模板",
            LeftHeader = "&F",                      // 文件名
            CenterHeader = "&A",                   // 工作表名
            RightHeader = "&D",                    // 日期
            LeftFooter = "机密文件",
            CenterFooter = "第 &P 页,共 &N 页",
            RightFooter = "打印时间:&T"
        };
    }
    
    public static HeaderFooterTemplate CreateFinancialTemplate(string companyName)
    {
        return new HeaderFooterTemplate
        {
            Name = "财务模板",
            LeftHeader = companyName,
            CenterHeader = "财务报表",
            RightHeader = $"会计期间:{DateTime.Now:yyyy-MM}",
            LeftFooter = "内部使用",
            CenterFooter = "审核人:______________",
            RightFooter = "第 &P 页"
        };
    }
    
    public void ApplyToPageSetup(IExcelPageSetup pageSetup)
    {
        pageSetup.LeftHeader = LeftHeader;
        pageSetup.CenterHeader = CenterHeader;
        pageSetup.RightHeader = RightHeader;
        pageSetup.LeftFooter = LeftFooter;
        pageSetup.CenterFooter = CenterFooter;
        pageSetup.RightFooter = RightFooter;
    }
}

public class HeaderFooterTemplateManager
{
    private readonly Dictionary<string, HeaderFooterTemplate> _templates;
    
    public HeaderFooterTemplateManager()
    {
        _templates = new Dictionary<string, HeaderFooterTemplate>
        {
            ["standard"] = HeaderFooterTemplate.CreateStandardTemplate(),
            ["financial"] = HeaderFooterTemplate.CreateFinancialTemplate("ABC公司")
        };
    }
    
    public void ApplyTemplate(IExcelPageSetup pageSetup, string templateName)
    {
        if (_templates.TryGetValue(templateName, out var template))
        {
            template.ApplyToPageSetup(pageSetup);
        }
    }
    
    public void RegisterTemplate(string name, HeaderFooterTemplate template)
    {
        _templates[name] = template;
    }
}

动态页眉页脚生成器

csharp
public class DynamicHeaderFooterGenerator
{
    public static string GenerateHeader(string documentType, string period, string author)
    {
        var header = $"{documentType}报表";
        
        if (!string.IsNullOrEmpty(period))
        {
            header += $" - {period}";
        }
        
        if (!string.IsNullOrEmpty(author))
        {
            header += $" | 编制:{author}";
        }
        
        return header;
    }
    
    public static string GenerateFooter(string version, string confidentiality, bool includePageInfo = true)
    {
        var footer = $"版本:{version}";
        
        if (!string.IsNullOrEmpty(confidentiality))
        {
            footer += $" | {confidentiality}";
        }
        
        if (includePageInfo)
        {
            footer += " | 第 &P 页";
        }
        
        return footer;
    }
    
    // 根据业务规则生成页眉页脚
    public static (string header, string footer) GenerateBusinessHeaders(
        string businessUnit, DateTime reportDate, string reportType)
    {
        var header = $"{businessUnit} - {reportType}";
        var footer = $"报告日期:{reportDate:yyyy-MM-dd} | 第 &P 页";
        
        return (header, footer);
    }
}

打印区域与标题设置

打印区域设置

csharp
public class PrintAreaManager
{
    private readonly IExcelWorksheet _worksheet;
    
    public PrintAreaManager(IExcelWorksheet worksheet)
    {
        _worksheet = worksheet;
    }
    
    // 设置打印区域
    public void SetPrintArea(string rangeAddress)
    {
        _worksheet.PageSetup.PrintArea = rangeAddress;
    }
    
    // 根据内容自动设置打印区域
    public void AutoSetPrintArea()
    {
        var usedRange = _worksheet.UsedRange;
        if (usedRange != null)
        {
            _worksheet.PageSetup.PrintArea = usedRange.Address;
        }
    }
    
    // 设置多个打印区域
    public void SetMultiplePrintAreas(params string[] rangeAddresses)
    {
        var combinedAreas = string.Join(",", rangeAddresses);
        _worksheet.PageSetup.PrintArea = combinedAreas;
    }
    
    // 清除打印区域
    public void ClearPrintArea()
    {
        _worksheet.PageSetup.PrintArea = "";
    }
    
    // 获取当前打印区域信息
    public PrintAreaInfo GetPrintAreaInfo()
    {
        var printArea = _worksheet.PageSetup.PrintArea;
        
        return new PrintAreaInfo
        {
            Address = printArea,
            IsSet = !string.IsNullOrEmpty(printArea),
            AreaCount = string.IsNullOrEmpty(printArea) ? 0 : printArea.Split(',').Length
        };
    }
}

public class PrintAreaInfo
{
    public string Address { get; set; }
    public bool IsSet { get; set; }
    public int AreaCount { get; set; }
}

打印标题设置

csharp
public class PrintTitleManager
{
    private readonly IExcelWorksheet _worksheet;
    
    public PrintTitleManager(IExcelWorksheet worksheet)
    {
        _worksheet = worksheet;
    }
    
    // 设置标题行(在多页打印时每页都显示)
    public void SetTitleRows(string rowsAddress)
    {
        _worksheet.PageSetup.PrintTitleRows = rowsAddress;
    }
    
    // 设置标题列
    public void SetTitleColumns(string columnsAddress)
    {
        _worksheet.PageSetup.PrintTitleColumns = columnsAddress;
    }
    
    // 自动设置标题行(通常是第一行)
    public void AutoSetTitleRows()
    {
        _worksheet.PageSetup.PrintTitleRows = "$1:$1"; // 第一行作为标题
    }
    
    // 设置多行标题
    public void SetMultiRowTitles(int rowCount)
    {
        if (rowCount > 0)
        {
            _worksheet.PageSetup.PrintTitleRows = $"$1:${rowCount}";
        }
    }
    
    // 清除标题设置
    public void ClearTitles()
    {
        _worksheet.PageSetup.PrintTitleRows = "";
        _worksheet.PageSetup.PrintTitleColumns = "";
    }
    
    // 验证标题设置
    public bool ValidateTitleSettings()
    {
        var titleRows = _worksheet.PageSetup.PrintTitleRows;
        var titleColumns = _worksheet.PageSetup.PrintTitleColumns;
        
        if (!string.IsNullOrEmpty(titleRows) && titleRows.Contains(","))
        {
            Console.WriteLine("警告:标题行设置包含多个区域,可能不适用于所有打印机");
            return false;
        }
        
        return true;
    }
}

分页符管理

csharp
public class PageBreakManager
{
    private readonly IExcelWorksheet _worksheet;
    
    public PageBreakManager(IExcelWorksheet worksheet)
    {
        _worksheet = worksheet;
    }
    
    // 添加水平分页符
    public void AddHorizontalPageBreak(int row)
    {
        // 注意:实际实现需要通过HPageBreaks集合
        // 这里展示概念性代码
        Console.WriteLine($"在行{row}添加水平分页符");
    }
    
    // 添加垂直分页符
    public void AddVerticalPageBreak(int column)
    {
        Console.WriteLine($"在列{column}添加垂直分页符");
    }
    
    // 清除所有分页符
    public void ClearAllPageBreaks()
    {
        Console.WriteLine("清除所有分页符");
    }
    
    // 根据内容自动设置分页符
    public void AutoSetPageBreaks(int maxRowsPerPage = 40)
    {
        var usedRange = _worksheet.UsedRange;
        if (usedRange != null)
        {
            var totalRows = usedRange.Rows.Count;
            var pageCount = (int)Math.Ceiling((double)totalRows / maxRowsPerPage);
            
            for (int i = 1; i < pageCount; i++)
            {
                AddHorizontalPageBreak(i * maxRowsPerPage);
            }
        }
    }
}

打印设置验证工具

csharp
public class PrintSettingsValidator
{
    public static PrintValidationResult ValidatePrintSettings(IExcelPageSetup pageSetup)
    {
        var result = new PrintValidationResult();
        
        // 检查打印区域
        if (string.IsNullOrEmpty(pageSetup.PrintArea))
        {
            result.Warnings.Add("未设置打印区域,将打印整个工作表");
        }
        
        // 检查缩放设置
        if (pageSetup.Zoom < 30)
        {
            result.Warnings.Add("缩放比例较低,可能影响打印清晰度");
        }
        
        // 检查边距设置
        if (pageSetup.LeftMargin + pageSetup.RightMargin > 5.0)
        {
            result.Warnings.Add("左右边距之和较大,可能浪费纸张");
        }
        
        // 检查页眉页脚
        if (string.IsNullOrEmpty(pageSetup.CenterFooter) && 
            string.IsNullOrEmpty(pageSetup.LeftFooter) && 
            string.IsNullOrEmpty(pageSetup.RightFooter))
        {
            result.Info.Add("未设置页脚,考虑添加页码等信息");
        }
        
        return result;
    }
}

public class PrintValidationResult
{
    public List<string> Errors { get; } = new List<string>();
    public List<string> Warnings { get; } = new List<string>();
    public List<string> Info { get; } = new List<string>();
    
    public bool HasIssues => Errors.Any() || Warnings.Any();
    
    public void PrintReport()
    {
        if (Errors.Any())
        {
            Console.WriteLine("打印设置错误:");
            foreach (var error in Errors)
                Console.WriteLine($"  ❌ {error}");
        }
        
        if (Warnings.Any())
        {
            Console.WriteLine("打印设置警告:");
            foreach (var warning in Warnings)
                Console.WriteLine($"  ⚠️ {warning}");
        }
        
        if (Info.Any())
        {
            Console.WriteLine("打印设置建议:");
            foreach (var info in Info)
                Console.WriteLine($"  ℹ️ {info}");
        }
    }
}

打印预览与选项

打印预览功能

csharp
public class PrintPreviewManager
{
    private readonly IExcelWorksheet _worksheet;
    
    public PrintPreviewManager(IExcelWorksheet worksheet)
    {
        _worksheet = worksheet;
    }
    
    // 显示打印预览
    public void ShowPrintPreview()
    {
        // 在实际实现中,这会调用Excel的打印预览功能
        Console.WriteLine("显示打印预览");
    }
    
    // 获取打印预览信息
    public PrintPreviewInfo GetPreviewInfo()
    {
        var pageSetup = _worksheet.PageSetup;
        
        return new PrintPreviewInfo
        {
            TotalPages = CalculateTotalPages(),
            CurrentZoom = pageSetup.Zoom,
            ShowGridlines = pageSetup.PrintGridlines,
            ShowHeadings = pageSetup.PrintHeadings,
            PageOrientation = pageSetup.Orientation.ToString(),
            PaperSize = pageSetup.PaperSize.ToString()
        };
    }
    
    private int CalculateTotalPages()
    {
        // 简化计算,实际实现需要更复杂的逻辑
        var usedRange = _worksheet.UsedRange;
        if (usedRange == null) return 1;
        
        var rowCount = usedRange.Rows.Count;
        return (int)Math.Ceiling(rowCount / 40.0); // 假设每页40行
    }
}

public class PrintPreviewInfo
{
    public int TotalPages { get; set; }
    public int CurrentZoom { get; set; }
    public bool ShowGridlines { get; set; }
    public bool ShowHeadings { get; set; }
    public string PageOrientation { get; set; }
    public string PaperSize { get; set; }
}

打印选项配置

csharp
public class PrintOptionsManager
{
    private readonly IExcelPageSetup _pageSetup;
    
    public PrintOptionsManager(IExcelPageSetup pageSetup)
    {
        _pageSetup = pageSetup;
    }
    
    // 设置打印质量选项
    public void SetPrintQualityOptions(bool draftMode, bool blackAndWhite)
    {
        _pageSetup.Draft = draftMode;
        _pageSetup.BlackAndWhite = blackAndWhite;
    }
    
    // 设置注释打印选项
    public void SetCommentsPrintOption(XlPrintLocation printLocation)
    {
        _pageSetup.PrintComments = printLocation;
    }
    
    // 设置错误打印选项
    public void SetErrorPrintOption(XlPrintErrors errorOption)
    {
        _pageSetup.PrintErrors = errorOption;
    }
    
    // 配置网格线和标题打印
    public void SetGridlinesAndHeadings(bool showGridlines, bool showHeadings)
    {
        _pageSetup.PrintGridlines = showGridlines;
        _pageSetup.PrintHeadings = showHeadings;
    }
    
    // 设置打印顺序
    public void SetPrintOrder(XlOrder order)
    {
        _pageSetup.Order = order;
    }
}

// 打印选项枚举
public enum XlPrintLocation
{
    xlPrintSheetEnd = 1,    // 在工作表末尾
    xlPrintInPlace = 16,    // 在原位置
    xlPrintNoComments = -4142 // 不打印注释
}

public enum XlPrintErrors
{
    xlPrintErrorsDisplayed = 0,    // 显示错误
    xlPrintErrorsBlank = 1,        // 空白
    xlPrintErrorsDash = 2,         // 横线
    xlPrintErrorsNA = 3            // N/A
}

public enum XlOrder
{
    xlDownThenOver = 1,    // 先列后行
    xlOverThenDown = 2     // 先行后列
}

高级打印功能

csharp
public class AdvancedPrintFeatures
{
    private readonly IExcelPageSetup _pageSetup;
    
    public AdvancedPrintFeatures(IExcelPageSetup pageSetup)
    {
        _pageSetup = pageSetup;
    }
    
    // 设置奇偶页不同的页眉页脚
    public void EnableOddEvenPagesHeaderFooter()
    {
        _pageSetup.OddAndEvenPagesHeaderFooter = true;
    }
    
    // 设置页眉页脚随文档缩放
    public void EnableScaleWithDocHeaderFooter()
    {
        _pageSetup.ScaleWithDocHeaderFooter = true;
    }
    
    // 设置页眉页脚与页边距对齐
    public void EnableAlignMarginsHeaderFooter()
    {
        _pageSetup.AlignMarginsHeaderFooter = true;
    }
    
    // 配置高级打印选项
    public void ConfigureAdvancedOptions(AdvancedPrintOptions options)
    {
        _pageSetup.OddAndEvenPagesHeaderFooter = options.UseOddEvenPages;
        _pageSetup.ScaleWithDocHeaderFooter = options.ScaleWithDoc;
        _pageSetup.AlignMarginsHeaderFooter = options.AlignMargins;
        _pageSetup.Draft = options.DraftMode;
    }
}

public class AdvancedPrintOptions
{
    public bool UseOddEvenPages { get; set; }
    public bool ScaleWithDoc { get; set; }
    public bool AlignMargins { get; set; }
    public bool DraftMode { get; set; }
    
    public static AdvancedPrintOptions CreateProfessionalOptions()
    {
        return new AdvancedPrintOptions
        {
            UseOddEvenPages = true,
            ScaleWithDoc = true,
            AlignMargins = true,
            DraftMode = false
        };
    }
}

打印任务管理

csharp
public class PrintJobManager
{
    private readonly IExcelWorkbook _workbook;
    
    public PrintJobManager(IExcelWorkbook workbook)
    {
        _workbook = workbook;
    }
    
    // 打印整个工作簿
    public void PrintEntireWorkbook()
    {
        foreach (var worksheet in _workbook.Worksheets)
        {
            PrintWorksheet(worksheet);
        }
    }
    
    // 打印指定工作表
    public void PrintWorksheet(IExcelWorksheet worksheet)
    {
        // 在实际实现中,这会调用Excel的打印功能
        Console.WriteLine($"打印工作表:{worksheet.Name}");
    }
    
    // 批量打印多个工作表
    public void PrintWorksheets(IEnumerable<string> sheetNames)
    {
        foreach (var sheetName in sheetNames)
        {
            var worksheet = _workbook.Worksheets[sheetName];
            if (worksheet != null)
            {
                PrintWorksheet(worksheet);
            }
        }
    }
    
    // 获取打印任务信息
    public PrintJobInfo GetPrintJobInfo()
    {
        return new PrintJobInfo
        {
            TotalSheets = _workbook.Worksheets.Count,
            EstimatedPages = CalculateTotalPages(),
            PrintTime = DateTime.Now
        };
    }
    
    private int CalculateTotalPages()
    {
        var totalPages = 0;
        foreach (var worksheet in _workbook.Worksheets)
        {
            // 简化计算
            totalPages += 2; // 假设每个工作表2页
        }
        return totalPages;
    }
}

public class PrintJobInfo
{
    public int TotalSheets { get; set; }
    public int EstimatedPages { get; set; }
    public DateTime PrintTime { get; set; }
}

实际应用案例

财务报表打印系统

csharp
public class FinancialReportPrinter
{
    private readonly IExcelWorkbook _workbook;
    private readonly PageLayoutManager _layoutManager;
    private readonly HeaderFooterTemplateManager _templateManager;
    
    public FinancialReportPrinter(IExcelWorkbook workbook)
    {
        _workbook = workbook;
        _layoutManager = new PageLayoutManager(workbook.Worksheets[0].PageSetup);
        _templateManager = new HeaderFooterTemplateManager();
    }
    
    // 配置财务报表打印设置
    public void ConfigureFinancialReportPrinting(string companyName, string reportPeriod)
    {
        foreach (var worksheet in _workbook.Worksheets)
        {
            var pageSetup = worksheet.PageSetup;
            
            // 设置页面布局
            _layoutManager.SetLandscapeReportLayout();
            
            // 设置页眉页脚
            _templateManager.ApplyTemplate(pageSetup, "financial");
            
            // 设置打印区域和标题
            var printAreaManager = new PrintAreaManager(worksheet);
            printAreaManager.AutoSetPrintArea();
            
            var titleManager = new PrintTitleManager(worksheet);
            titleManager.AutoSetTitleRows();
            
            // 设置高级选项
            var advancedOptions = AdvancedPrintOptions.CreateProfessionalOptions();
            var advancedFeatures = new AdvancedPrintFeatures(pageSetup);
            advancedFeatures.ConfigureAdvancedOptions(advancedOptions);
        }
    }
    
    // 生成打印配置报告
    public void GeneratePrintConfigurationReport()
    {
        Console.WriteLine("=== 财务报表打印配置报告 ===");
        
        foreach (var worksheet in _workbook.Worksheets)
        {
            var pageSetup = worksheet.PageSetup;
            var validator = new PrintSettingsValidator();
            var result = validator.ValidatePrintSettings(pageSetup);
            
            Console.WriteLine($"\n工作表:{worksheet.Name}");
            result.PrintReport();
        }
    }
    
    // 批量打印财务报表
    public void PrintFinancialReports(bool includeCharts = true)
    {
        var printManager = new PrintJobManager(_workbook);
        
        Console.WriteLine("开始打印财务报表...");
        
        if (includeCharts)
        {
            printManager.PrintEntireWorkbook();
        }
        else
        {
            // 只打印数据工作表,不打印图表工作表
            var dataSheets = _workbook.Worksheets
                .Where(ws => !ws.Name.Contains("Chart"))
                .Select(ws => ws.Name);
            
            printManager.PrintWorksheets(dataSheets);
        }
        
        Console.WriteLine("财务报表打印完成");
    }
}

销售报表打印优化

csharp
public class SalesReportPrinter
{
    private readonly IExcelWorksheet _worksheet;
    
    public SalesReportPrinter(IExcelWorksheet worksheet)
    {
        _worksheet = worksheet;
    }
    
    // 优化销售报表打印设置
    public void OptimizeSalesReportPrinting(int dataRowCount, int dataColCount)
    {
        var pageSetup = _worksheet.PageSetup;
        
        // 根据数据量动态调整页面设置
        if (dataColCount > 8)
        {
            // 列数较多,使用横向布局
            pageSetup.Orientation = XlPageOrientation.xlLandscape;
            pageSetup.Zoom = 85; // 适当缩小以适应页面
        }
        else
        {
            pageSetup.Orientation = XlPageOrientation.xlPortrait;
            pageSetup.Zoom = 100;
        }
        
        // 设置页边距
        var marginCalculator = new MarginCalculator();
        marginCalculator.AutoAdjustMargins(pageSetup, dataRowCount, dataColCount, XlPaperSize.xlPaperA4);
        
        // 设置页眉页脚
        var headerFooter = DynamicHeaderFooterGenerator.GenerateBusinessHeaders(
            "销售部", DateTime.Now, "月度销售报表");
        
        pageSetup.CenterHeader = headerFooter.header;
        pageSetup.CenterFooter = headerFooter.footer;
        
        // 设置打印区域和标题
        var printAreaManager = new PrintAreaManager(_worksheet);
        printAreaManager.AutoSetPrintArea();
        
        var titleManager = new PrintTitleManager(_worksheet);
        titleManager.SetMultiRowTitles(2); // 前两行作为标题
        
        // 验证打印设置
        var validator = new PrintSettingsValidator();
        var result = validator.ValidatePrintSettings(pageSetup);
        
        if (result.HasIssues)
        {
            Console.WriteLine("销售报表打印设置存在问题:");
            result.PrintReport();
        }
    }
    
    // 生成销售报表打印预览
    public void PreviewSalesReport()
    {
        var previewManager = new PrintPreviewManager(_worksheet);
        var previewInfo = previewManager.GetPreviewInfo();
        
        Console.WriteLine("=== 销售报表打印预览 ===");
        Console.WriteLine($"总页数:{previewInfo.TotalPages}");
        Console.WriteLine($"缩放比例:{previewInfo.CurrentZoom}%");
        Console.WriteLine($"页面方向:{previewInfo.PageOrientation}");
        Console.WriteLine($"纸张大小:{previewInfo.PaperSize}");
        
        previewManager.ShowPrintPreview();
    }
}

企业文档标准化打印系统

csharp
public class CorporateDocumentPrinter
{
    private readonly IExcelWorkbook _workbook;
    private readonly CorporatePrintPolicy _policy;
    
    public CorporateDocumentPrinter(IExcelWorkbook workbook, CorporatePrintPolicy policy)
    {
        _workbook = workbook;
        _policy = policy;
    }
    
    // 应用企业打印标准
    public void ApplyCorporatePrintStandards()
    {
        foreach (var worksheet in _workbook.Worksheets)
        {
            var pageSetup = worksheet.PageSetup;
            
            // 应用页面布局标准
            ApplyPageLayoutStandard(pageSetup);
            
            // 应用页眉页脚标准
            ApplyHeaderFooterStandard(pageSetup, worksheet.Name);
            
            // 应用打印选项标准
            ApplyPrintOptionsStandard(pageSetup);
            
            // 验证是否符合企业标准
            ValidateCorporateCompliance(pageSetup, worksheet.Name);
        }
    }
    
    private void ApplyPageLayoutStandard(IExcelPageSetup pageSetup)
    {
        pageSetup.Orientation = _policy.DefaultOrientation;
        pageSetup.PaperSize = _policy.DefaultPaperSize;
        pageSetup.Zoom = _policy.DefaultZoom;
        
        // 设置标准边距
        pageSetup.LeftMargin = _policy.StandardMargins.Left;
        pageSetup.RightMargin = _policy.StandardMargins.Right;
        pageSetup.TopMargin = _policy.StandardMargins.Top;
        pageSetup.BottomMargin = _policy.StandardMargins.Bottom;
    }
    
    private void ApplyHeaderFooterStandard(IExcelPageSetup pageSetup, string sheetName)
    {
        var template = _policy.GetHeaderFooterTemplate(sheetName);
        template.ApplyToPageSetup(pageSetup);
    }
    
    private void ApplyPrintOptionsStandard(IExcelPageSetup pageSetup)
    {
        pageSetup.PrintGridlines = _policy.ShowGridlines;
        pageSetup.PrintHeadings = _policy.ShowHeadings;
        pageSetup.BlackAndWhite = _policy.BlackAndWhitePrinting;
    }
    
    private void ValidateCorporateCompliance(IExcelPageSetup pageSetup, string sheetName)
    {
        var validator = new CorporatePrintValidator(_policy);
        var result = validator.ValidateCompliance(pageSetup, sheetName);
        
        if (!result.IsCompliant)
        {
            Console.WriteLine($"警告:工作表 '{sheetName}' 不符合企业打印标准");
            foreach (var issue in result.Issues)
            {
                Console.WriteLine($"  - {issue}");
            }
        }
    }
    
    // 生成企业文档打印报告
    public CorporatePrintReport GeneratePrintReport()
    {
        var report = new CorporatePrintReport
        {
            WorkbookName = _workbook.Name,
            SheetCount = _workbook.Worksheets.Count,
            ValidationDate = DateTime.Now
        };
        
        foreach (var worksheet in _workbook.Worksheets)
        {
            var validator = new CorporatePrintValidator(_policy);
            var result = validator.ValidateCompliance(worksheet.PageSetup, worksheet.Name);
            
            report.SheetReports.Add(new SheetPrintReport
            {
                SheetName = worksheet.Name,
                IsCompliant = result.IsCompliant,
                Issues = result.Issues.ToList()
            });
        }
        
        report.OverallCompliance = report.SheetReports.All(r => r.IsCompliant);
        
        return report;
    }
}

public class CorporatePrintPolicy
{
    public XlPageOrientation DefaultOrientation { get; set; } = XlPageOrientation.xlPortrait;
    public XlPaperSize DefaultPaperSize { get; set; } = XlPaperSize.xlPaperA4;
    public int DefaultZoom { get; set; } = 100;
    public bool ShowGridlines { get; set; } = false;
    public bool ShowHeadings { get; set; } = false;
    public bool BlackAndWhitePrinting { get; set; } = true;
    
    public Margins StandardMargins { get; } = new Margins { Left = 1.0, Right = 1.0, Top = 1.0, Bottom = 1.0 };
    
    public HeaderFooterTemplate GetHeaderFooterTemplate(string sheetName)
    {
        // 根据工作表名称返回相应的模板
        if (sheetName.Contains("财务"))
            return HeaderFooterTemplate.CreateFinancialTemplate("公司名称");
        else if (sheetName.Contains("销售"))
            return HeaderFooterTemplate.CreateStandardTemplate();
        else
            return HeaderFooterTemplate.CreateStandardTemplate();
    }
}

public class Margins
{
    public double Left { get; set; }
    public double Right { get; set; }
    public double Top { get; set; }
    public double Bottom { get; set; }
}

public class CorporatePrintReport
{
    public string WorkbookName { get; set; }
    public int SheetCount { get; set; }
    public DateTime ValidationDate { get; set; }
    public bool OverallCompliance { get; set; }
    public List<SheetPrintReport> SheetReports { get; } = new List<SheetPrintReport>();
}

public class SheetPrintReport
{
    public string SheetName { get; set; }
    public bool IsCompliant { get; set; }
    public List<string> Issues { get; set; } = new List<string>();
}

public class CorporatePrintValidator
{
    private readonly CorporatePrintPolicy _policy;
    
    public CorporatePrintValidator(CorporatePrintPolicy policy)
    {
        _policy = policy;
    }
    
    public ComplianceResult ValidateCompliance(IExcelPageSetup pageSetup, string sheetName)
    {
        var result = new ComplianceResult { SheetName = sheetName };
        
        // 检查页面方向
        if (pageSetup.Orientation != _policy.DefaultOrientation)
            result.Issues.Add("页面方向不符合标准");
        
        // 检查纸张大小
        if (pageSetup.PaperSize != _policy.DefaultPaperSize)
            result.Issues.Add("纸张大小不符合标准");
        
        // 检查边距
        if (Math.Abs(pageSetup.LeftMargin - _policy.StandardMargins.Left) > 0.1)
            result.Issues.Add("左边距不符合标准");
            
        // 类似检查其他边距...
        
        result.IsCompliant = !result.Issues.Any();
        
        return result;
    }
}

public class ComplianceResult
{
    public string SheetName { get; set; }
    public bool IsCompliant { get; set; }
    public List<string> Issues { get; } = new List<string>();
}

总结

本章详细介绍了Excel页面布局与打印设置的各个方面,包括:

  1. 页面布局基础 - 方向、纸张大小、缩放等基本设置
  2. 页边距配置 - 各种边距设置和优化技巧
  3. 页眉页脚系统 - 强大的代码系统和模板管理
  4. 打印区域与标题 - 精准控制打印内容和范围
  5. 打印预览与选项 - 高级打印功能和选项配置
  6. 实际应用案例 - 企业级打印解决方案