C#实现为Excel添加水印的两种方案对比

 更新时间:2026年09月28日 11:32:14   作者:秋天的落叶铺满小路  
本文将手把手教你用免费.NET库Spire.XLS在C#中实现页眉图片水印和背景图片水印,并对比两种方案的打印与显示差异,感兴趣的小伙伴可以了解下

在报表分发、合同归档、机密数据共享等场景中,给 Excel 文档添加水印是一种简单且实用的版权标识手段。水印既可以由图片构成,也可以由文字构成。对中文使用者来说,"机密"、"内部资料"、"严禁外传"等中文字样的水印更贴近实际业务。

安装

可以通过 NuGet 将该库引入到项目中。

NuGet 包管理器控制台

Install-Package FreeSpire.XLS

.NET CLI

dotnet add package FreeSpire.XLS

安装完成后,在代码中引入命名空间 Spire.Xls 即可使用。

两种水印方案对比

Excel 的水印并不是真正的"水印"对象,本质上是通过页眉图片或工作表背景图片模拟出来的,因此两种方案在打印、视图、定位等方面表现差异明显。

对比项页眉图片水印背景图片水印
打印输出随文档一同被打印不出现在打印结果中
视图可见性仅在"页面布局"或"分页预览"模式下可见,普通视图看不到所有视图模式下都可见
位置控制需要手动调整页眉区域的边距来让图片居中自动铺满整个工作表数据区
视觉一致性受分页影响,相邻页可能错位整张工作表只显示同一张图片

页眉图片水印

优点:水印会出现在文档的最终打印输出中,适合必须打印归档的场景。

缺点:在 Excel 的 "Normal" 视图下不可见,只能在 "Page Layout" 或 "Page Break Preview" 下看到;要把图片调到页面正中央,要小心调整图片上方和左侧的页边距。

背景图片水印

优点:水印图片覆盖整张工作表,呈现效果一致。

缺点:水印不会出现在打印输出中。

方案一:通过页眉添加图片水印

下述示例遍历文档中的所有工作表,并把同一张水印图片设置到页眉中央位置。

using Spire.Xls;
using System.Drawing;
namespace AddWatermarkToExcelUsingHeader
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 Workbook 对象
            Workbook workbook = new Workbook();
            // 加载 Excel 文档
            workbook.LoadFromFile(@"C:\Users\Administrator\Desktop\Input.xlsx");
            // 加载水印图片
            Image image = Image.FromFile(@"C:\Users\Administrator\Desktop\confidential.png");
            // 遍历文档中所有工作表
            for (int i = 0; i < workbook.Worksheets.Count; i++)
            {
                // 获取指定工作表
                Worksheet worksheet = workbook.Worksheets[i];
                // 在页眉中央插入图片占位符
                worksheet.PageSetup.CenterHeader = "&G";
                // 将图片设置到页眉中央
                worksheet.PageSetup.CenterHeaderImage = image;
            }
            // 保存结果文件
            workbook.SaveToFile("AddWatermark.xlsx", ExcelVersion.Version2016);
            // 释放资源
            workbook.Dispose();
        }
    }
}

注意:&G 是 Excel 自身的页眉图片占位符,所有文本(如"机密"字样)应直接烘焙到图片中,而不是写在 CenterHeader 字符串 里。

方案二:将图片设置为工作表背景

下述示例把图片作为工作表的背景水印,适用于仅屏幕查看、需要强可见性的场景。

using Spire.Xls;
using System.Drawing;
namespace AddWatermarkToExcelUsingBackground
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 Workbook 对象
            Workbook workbook = new Workbook();
            // 加载 Excel 文档
            workbook.LoadFromFile(@"C:\Users\Administrator\Desktop\Input.xlsx");
            // 加载水印图片
            Bitmap bitmapImage = new Bitmap(Image.FromFile(@"C:\Users\Administrator\Desktop\sample.png"));
            // 遍历文档中所有工作表
            for (int i = 0; i < workbook.Worksheets.Count; i++)
            {
                // 获取指定工作表
                Worksheet worksheet = workbook.Worksheets[i];
                // 将图片设置为该工作表的背景
                worksheet.PageSetup.BackgroundImage = bitmapImage;
            }
            // 保存结果文件
            workbook.SaveToFile("AddWatermark.xlsx", ExcelVersion.Version2016);
            // 释放资源
            workbook.Dispose();
        }
    }
}

中文文字水印的生成

实际业务里,水印常常是"机密资料"、"内部文件"等动态文字,没必要每次都由设计师提供 PNG。可以借助 System.Drawing 在内存中绘制一张透明背景的中文水印图片,再交给方案一或方案二复用。

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
public static class ChineseWatermarkHelper
{
    /// <summary>
    /// 生成中文文字水印图片(透明背景,倾斜 -30°)
    /// </summary>
    /// <param name="text">水印文本,如 "机密资料"</param>
    /// <param name="width">画布宽度</param>
    /// <param name="height">画布高度</param>
    /// <returns>带有透明背景的 Bitmap 对象</returns>
    public static Bitmap Create(string text, int width, int height)
    {
        Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
        using (Graphics g = Graphics.FromImage(bmp))
        {
            g.Clear(Color.Transparent);
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            using (Font font = new Font("Microsoft YaHei", 60, FontStyle.Bold))
            using (SolidBrush brush = new SolidBrush(Color.FromArgb(60, Color.Red)))
            {
                // 计算文字尺寸并居中
                SizeF size = g.MeasureString(text, font);
                // 平移到画布中心,再旋转,使绘制出的文字位于中央
                g.TranslateTransform(width / 2f, height / 2f);
                g.RotateTransform(-30);
                g.DrawString(text, font, brush, -size.Width / 2f, -size.Height / 2f);
            }
        }
        return bmp;
    }
}

调用时,只需把生成的 Bitmap 直接传给上面的两种方案即可:

// 生成中文文字水印图片
Bitmap watermarkImage = ChineseWatermarkHelper.Create("机密资料", 800, 600);
// 用作工作表背景水印
workbook.Worksheets[0].PageSetup.BackgroundImage = watermarkImage;

字体一致性建议

System.Drawing 默认按系统已安装的字体渲染中文字符,在不同环境(例如 Linux 服务器、容器化部署)下可能出现字体丢失、文字变成方块的情况。生产环境中建议:

  • 将字体文件(如 msyh.ttc、simhei.ttf)打包到应用中;
  • 通过 PrivateFontCollection 加载私有字体后再传入 Font 构造函数;
  • 或预先把所有可能用到的水印文本渲染成 PNG,作为静态资源随项目分发。

方案选型参考

场景推荐方案
报表需要打印、归档,文档要长期留存方案一:页眉图片水印
仅屏幕查看、内部演示,注重直观可见方案二:背景图片水印

总结

免费 .NET Excel 库本身并不直接提供"水印"对象,而是借助页眉图片或工作表背景图片这两种机制实现。把任意一张 Image/Bitmap 交给 CenterHeaderImage 或 BackgroundImage,就完成了水印的添加;再结合一段简短的中文文字绘图代码,就可以在不依赖外部素材的前提下,灵活生成"机密资料"、"内部文件"等贴合中文业务场景的水印。

实际项目里,建议把"图片生成 + 水印注入"封装成独立的工具方法,对外只暴露文件路径、水印文字、可见性等少量参数,这样在面对多业务线、多模板时复用成本最低。

以上就是C#实现为Excel添加水印的两种方案对比的详细内容,更多关于C# Excel添加水印的资料请关注脚本之家其它相关文章!

相关文章

  • C# 压榨cpu的办法(推荐)

    C# 压榨cpu的办法(推荐)

    这篇文章主要介绍了C# 压榨cpu的办法,通过修改num的值,观察cpu的核数,例如我电脑是8核的,改成8,运行时各个核都能跑满,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • C#实现将Excel工作表拆分为独立文件

    C#实现将Excel工作表拆分为独立文件

    在日常数据处理中,你是否经常遇到需要将一个包含多个工作表的Excel文件,根据每个工作表的内容,分别保存成独立的Excel文件,下面小编就来和大家讲讲如何使用C#实现这一功能吧
    2025-12-12
  • C#中阻止硬件休眠的多种实现方法

    C#中阻止硬件休眠的多种实现方法

    本文介绍了在C#中阻止系统休眠的多种方法,核心方案是通过调用Windows API的SetThreadExecutionState函数,可控制显示器关闭和系统休眠行为,感兴趣的可以了解一下
    2025-07-07
  • 浅谈C# winForm 窗体闪烁的问题

    浅谈C# winForm 窗体闪烁的问题

    下面小编就为大家带来一篇浅谈C# winForm 窗体闪烁的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C# .NET实现将PDF转为PDF/A的示例详解

    C# .NET实现将PDF转为PDF/A的示例详解

    在企业文档归档、文件管理等场景中,PDF 转 PDF/A 已成为保障长期可读性的关键环节,本文将通过 C# 实现PDF转PDF/A,感兴趣的小伙伴可以了解下
    2025-09-09
  • c# 绘制中国象棋棋盘与棋子

    c# 绘制中国象棋棋盘与棋子

    这篇文章主要介绍了c# 绘制中国象棋棋盘与棋子,文中实例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Unity UGUI的LayoutElement布局元素组件介绍使用示例

    Unity UGUI的LayoutElement布局元素组件介绍使用示例

    这篇文章主要为大家介绍了Unity UGUI的LayoutElement布局元素组件介绍使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#生成sitemap站点地图的方法

    C#生成sitemap站点地图的方法

    C#生成sitemap站点地图的方法,需要的朋友可以参考一下
    2013-04-04
  • c#基础学习之多态

    c#基础学习之多态

    多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态
    2013-09-09
  • C#实现winform窗口抖动效果的示例代码

    C#实现winform窗口抖动效果的示例代码

    在WinForms应用程序中,实现窗口抖动效果可以为用户界面增添一些趣味性和互动性,想象一下,当你点击一个按钮时,窗口会轻微地“颤抖”几下,就像它在对你表示不满或提醒你注意某些事情,这个效果可以通过定时改变窗口的位置来实现,需要的朋友可以参考下
    2024-12-12

最新评论