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页面布局与打印设置的各个方面,包括:
- 页面布局基础 - 方向、纸张大小、缩放等基本设置
- 页边距配置 - 各种边距设置和优化技巧
- 页眉页脚系统 - 强大的代码系统和模板管理
- 打印区域与标题 - 精准控制打印内容和范围
- 打印预览与选项 - 高级打印功能和选项配置
- 实际应用案例 - 企业级打印解决方案