C#/VB.NET 在Excel中添加水印
在工作中,为了防止文件被随意复制和传播,通常我们会选择在文档中添加水印来对文件进行有效保护。文字水印是比较常见的一种保护手段,它可以有效防止文件被任意复制和随意打印传播。不过,Excel默认并没有水印功能。此时,我们可以把插入的艺术字作为水印,将水印和工作表融合在一起,以防止文档被复制传播。那么如何轻松实现在Excel中添加水印呢?别着急,我给大家整理了一个高效便捷的方法,通过编程方式达到此目的。下面是我整理的具体步骤,并附上C#/VB.NET代码供大家参考。
程序环境:
本次测试时,在程序中引入 Spire.XLS.dll 文件。
方法1:
将Free Spire.XLS for .NET 下载到本地,解压,找到 BIN 文件夹下的 Spire.XLS.dll。然后在 Visual Studio 中打开“解决方案资源管理器”,鼠标右键点击“引用”,“添加引用”,将本地路径 BIN 文件夹下的 dll 文件添加引用至程序。
方法2::
通过NuGet安装。可通过以下 2 种方法安装:
1. 可以在 Visual Studio 中打开“解决方案资源管理器”,鼠标右键点击“引用”,“管理 NuGet 包”,然后搜索“Free Spire.XLS”,点击“安装”。等待程序安装完成。
2. 将以下内容复制到 PM 控制台安装。
Install-Package FreeSpire.XLS -Version 12.7
在Excel中添加水印
以下是详细步骤:
- 创建Workbook类的实例。
- 使用 Workbook.LoadFromFile() 方法加载 Excel 文件。
- 创建字体并定义文本。
- 遍历 Excel 文件中的所有工作表。
- 使用 DrawWatermarkImage() 方法创建基于文本的水印图像。
- 通过Worksheet.PageSetup.LeftHeaderImage 属性将图片设置为每个工作表左页眉的图像源。
- 将 Worksheet.PageSetup.LeftHeader 属性设置为“&G”,在左侧标题部分显示图像。
- 将工作表的查看模式更改为页面布局,以便查看水印。
- 使用 Workbook.SaveToFile() 方法保存结果文件。
完整代码
C#
using Spire.Xls;
using System.Drawing; namespace AddWatermark
{
class Program
{
static void Main(string[] args)
{
//初始化 Workbook 类的实例并加载 Excel 文件
Workbook workbook = new Workbook();
workbook.LoadFromFile("示例文档.xlsx"); //创建字体
Font font = new Font("宋体", 40);
//定义文本
string watermark = "内部使用"; //遍历文件中的所有工作表
foreach (Worksheet sheet in workbook.Worksheets)
{
//调用 DrawWatermarkImage() 方法根据文本创建图像
Image imgWtrmrk = DrawWatermarkImage(watermark, font, Color.LightCoral, Color.White, sheet.PageSetup.PageHeight, sheet.PageSetup.PageWidth); //将图像添加到每个工作表的左侧标题部分
sheet.PageSetup.LeftHeaderImage = imgWtrmrk;
sheet.PageSetup.LeftHeader = "&G"; //将工作表的查看模式更改为页面布局以查看水印
sheet.ViewMode = ViewMode.Layout;
} //保存结果文件
workbook.SaveToFile("添加水印.xlsx", ExcelVersion.Version2013);
} private static Image DrawWatermarkImage(string text, Font font, Color textColor, Color backColor, double height, double width)
{
//创建具有指定宽度和高度的图像
Image img = new Bitmap((int)width, (int)height);
//从图像创建一个 Graphics 对象
Graphics drawing = Graphics.FromImage(img); //获取文字的大小
SizeF textSize = drawing.MeasureString(text, font); //通过将指定的转换前置到图形的变换矩阵来更改坐标系统的原点
drawing.TranslateTransform(((int)width - textSize.Width) / 2, ((int)height - textSize.Height) / 2); //应用旋转
drawing.RotateTransform(-45); //通过将指定的转换前置到图形的变换矩阵来更改坐标系统的原点
drawing.TranslateTransform(-((int)width - textSize.Width) / 2, -((int)height - textSize.Height) / 2); //绘制背景
drawing.Clear(backColor); //为文本创建画笔
Brush textBrush = new SolidBrush(textColor); //将文本绘制到图形的中心位置
drawing.DrawString(text, font, textBrush, ((int)width - textSize.Width) / 2, ((int)height - textSize.Height) / 2);
drawing.Save();
return img;
}
}
}
VB.NET
Imports Spire.Xls
Imports System.Drawing Namespace AddWatermark
Friend Class Program
Private Shared Sub Main(ByVal args As String())
'初始化 Workbook 类的新实例并加载 Excel 文件
Dim workbook As Workbook = New Workbook()
workbook.LoadFromFile("示例文档.xlsx") '创建字体
Dim font As Font = New Font("宋体", 40)
'定义文本
Dim watermark = "内部使用" '遍历文件中的所有工作表
For Each sheet As Worksheet In workbook.Worksheets
'调用 DrawWatermarkImage() 方法根据文本创建图像
Dim imgWtrmrk As Image = DrawWatermarkImage(watermark, font, Color.LightCoral, Color.White, sheet.PageSetup.PageHeight, sheet.PageSetup.PageWidth) '将图像添加到每个工作表的左侧标题部分
sheet.PageSetup.LeftHeaderImage = imgWtrmrk
sheet.PageSetup.LeftHeader = "&G" '将工作表的查看模式更改为页面布局以查看水印
sheet.ViewMode = ViewMode.Layout
Next '保存结果文件
workbook.SaveToFile("添加水印.xlsx", ExcelVersion.Version2013)
End Sub Private Shared Function DrawWatermarkImage(ByVal text As String, ByVal font As Font, ByVal textColor As Color, ByVal backColor As Color, ByVal height As Double, ByVal width As Double) As Image
'创建具有指定宽度和高度的图像
Dim img As Image = New Bitmap(width, height)
'从图像创建一个 Graphics 对象
Dim drawing As Graphics = Graphics.FromImage(img) '获取文字的大小
Dim textSize As SizeF = drawing.MeasureString(text, font) '通过将指定的转换前置到图形的变换矩阵来更改坐标系统的原点
drawing.TranslateTransform((CInt(width) - textSize.Width) / 2, (CInt(height) - textSize.Height) / 2) '应用旋转
drawing.RotateTransform(-45) '通过将指定的转换前置到图形的变换矩阵来更改坐标系统的原点
drawing.TranslateTransform(-(CInt(width) - textSize.Width) / 2, -(CInt(height) - textSize.Height) / 2) '绘制背景
drawing.Clear(backColor) '为文本创建画笔
Dim textBrush As Brush = New SolidBrush(textColor) '将文本绘制到图形的中心位置
drawing.DrawString(text, font, textBrush, (CInt(width) - textSize.Width) / 2, (CInt(height) - textSize.Height) / 2)
drawing.Save()
Return img
End Function
End Class
End Namespace
效果图
—本文完—
C#/VB.NET 在Excel中添加水印的更多相关文章
- vb.net向Excel中写入值
根据网上例子结合自己的工具环境修改后测试可以通过 我使用的工具:Microsoft Visual Studio 2010,Excel 2007 一.在D盘新建一个temp文件夹用于存放Excel启动时 ...
- Java 在Excel中添加水印(单一水印、平铺水印)
在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...
- C#/VB.NET 获取Excel中图片所在的行、列坐标位置
本文以C#和vb.net代码示例展示如何来获取Excel工作表中图片的坐标位置.这里的坐标位置是指图片左上角顶点所在的单元格行和列位置,横坐标即顶点所在的第几列.纵坐标即顶点所在的第几行.下面是获取图 ...
- C#/VB.NET 在Excel单元格中应用多种字体格式
在Excel中,可对单元格中的字符串设置多种不同样式,通常只需要获取到单元格直接设置样式即可,该方法设置的样式会应用于该单元格中的所有字符.如果需要对单元格中某些字符设置样式,则可以参考本文中的方法. ...
- C#/VB.NET 如何在Excel中使用条件格式设置交替行颜色
说起高亮数据行,不让人想起了交替颜色行,有的人把交替颜色行也都设置成高亮,不仅不美观,而且对阅读还是个干扰.隔行交替的颜色是为了阅读不串行,这些行只是环境,数据才是主体.那么如何通过C#/VB.NET ...
- Excel中的宏--VBA的简单例子
第一步:点击录制宏 第二步:填写宏的方法名 第三步:进行一系列的操作之后,关闭宏 第四步:根据自己的需要查看,修改宏 第六步:保存,一般是另存为,后缀名为.xlsm,否则宏语言不能保存. 到此为止恭喜 ...
- VBA在Excel中的应用(一):改变符合条件单元格的背景颜色
在使用excel处理数据的时候,为了能更清晰的标示出满足特定条件的单元格,对单元格添加背景色是不错的选择.手工处理的方式简单快捷,但是当遇到大批量数据,就会特别的费时费力,而且不讨好(容易出错).通过 ...
- [VBA]用一个简单例子说明如何在Excel中自定义函数
Excel中的函数无疑是强大的,但是再强大的战士也有他脆弱的脚后跟[1].这两天在使用Excel的时候遇到了一个需求,要在某一个单元格里面自动计算今天是星期几(如显示 Today is Tuesday ...
- VB.Net出口Excel原则
在VB机房的版本中,我们已经暴露导出Excel特征,此功能已重新接触到不同的理解 一.原理 要实现导出Excel的功能,首先要引用命名空间,目的是能够使用该命名空间下的方法和类 Imports ...
- C#/VB.NET对EXCEL图片添加超链接
在日常工作中,在编辑文档时,为了方便自己或者Boss能够实时查看到需要的网页或者文档是,需要对在Excel中输入的相关文字进行超链接,那么对于一些在Excel中插入的图片我们该怎么实现超链接呢,下面给 ...
随机推荐
- 为了讲明白继承和super、this关键字,群主发了20块钱群红包
摘要:以群主发红包为例,带你深入了解继承和super.this关键字. 本文分享自华为云社区<群主发红包带你深入了解继承和super.this关键字>,作者:共饮一杯无 . 需求 群主发随 ...
- 齐博x1标签之异步加载标签数据
为什么要异步加载标签?他有什么好处 如果一个页面的标签太多,又或者是页面中某一个标签调用数据太慢的话,就会拖慢整个页面的打开,非常影响用户体验.这个时候,用异步加载的话,就可以一块一块的显示,用户体验 ...
- 齐博x1.1用户登录接口
用户的登录主要涉及到小程序登录.APP的帐号密码登录.APP的微信开发平台帐号登录.相应的地址是:http://qb.net/index.php/index/wxapp.login/index.htm ...
- Codeforces Round #829 (Div. 1/Div. 2) 1753 A B C D 题解
Div1A / 2C. Make Nonzero Sum 令最后每个\(a_i\)的系数为\(c_i\)(\(c_i=1/-1\)),发现只要满足\(c_1=1\)(下标从1开始),且c中没有两个-1 ...
- SpringBoot自动配置(装配)流程
源码分析 SpringBoot自动配置流程 首先,我们要了解在@SpringBootApplication注解的内部,还具有@EnableAutoConfiguration,@SpringBo ...
- HTML躬行记(3)——WebRTC视频通话
WebRTC 在创建点对点(P2P)的连接之前,会先通过信令服务器交换两端的 SDP 和 ICE Candidate,取两者的交集,决定最终的音视频参数.传输协议.NAT 打洞方式等信息. 在完成媒体 ...
- 虚拟机VMware运行Ubuntu时无法和主机之间复制粘贴的问题
解决虚拟机VMware运行Ubuntu时无法和主机之间复制粘贴的问题 执行以下命令并重启即可解决 sudo apt-get autoremove open-vm-tools sudo apt-get ...
- zk系列三:zookeeper实战之分布式锁实现
一.分布式锁的通用实现思路 分布式锁的概念以及常规解决方案可以参考之前的博客:聊聊分布式锁的解决方案:今天我们先分析下分布式锁的实现思路: 首先,需要保证唯一性,即某一时点只能有一个线程访问某一资源: ...
- K8S节点选择器案例
#给节点打上标签 [root@lecode-k8s-master deployment]# kubectl label no lecode-dev-001 hostname=lecode-dev-00 ...
- Go语言核心36讲06
我已经为你打开了Go语言编程之门,并向你展示了"程序从初建到拆分,再到模块化"的基本演化路径. 一个编程老手让程序完成基本演化,可能也就需要几十分钟甚至十几分钟,因为他们一开始就会 ...