前言
在之前的文章当中有提到过,如何将Excel汇出为PDF,且不使用 Microsoft Office的套件,经过好多曲折离奇的尝试之后,终于达成需求,不过这回客户又有新的需求了,那就是要在Excel以及PDF上加入浮水印,但是因为Excel毕竟不是真正的报表软体,它是其实是试算表(但很多客户喜欢把它当报表来用,我也不知道为什么),所以并没有真正意义上的浮水印功能,所以我把方向稍稍改变,变成是在Excel背景加入淡化的图片
,同样能达成浮水印的目标,以下是我所尝试的解决方法,开始啰。
正解(?):在页首页尾插入图片
由于是Excel,加上原本电脑就有安装 Microsoft Office,已经用习惯了,所以很理所当然地先用Microsoft Excel打开xlsx档案,先看要怎么从MS Excel加入浮水印。
同样,有问题就先找Google大师,在搜寻了Excel 浮水印
这个简单的关键字后,发现官方有提供解法,但官方也讲得很明白,Excel并没有提供浮水印的功能,不过可以用在页首页尾
加入图片来实现浮水印的功能,看来官方也了解到会有这种(特异的)需求,还开了一页做说明:D
官方文章:在 Excel 中新增浮水印
按照步骤设定完之后,在编辑画面上,并不会出现图片,如下。
这是因为,页首页尾只会在列印的时候被列印出来,所以如果改成预览列印,就会出现所设定的图片。
实验成功后,接下来就是把这个步骤设定页首→中间插入图片
,转换成程式码,EPPLUS套件要插入页首图片的程式码也相当简单。
//偶数页设定页首图片sheet.HeaderFooter.EvenHeader.InsertPicture(new FileInfo(HttpContext.Current.Server.MapPath("~/Content/images/excelbk.png")), PictureAlignment.Centered);//奇数页设定页首图片sheet.HeaderFooter.OddHeader.InsertPicture(new FileInfo(HttpContext.Current.Server.MapPath("~/Content/images/excelbk.png")), PictureAlignment.Centered);
打完收工,一切是这么的顺利且完美。
事情没有这么顺利
正当我兴高采烈的执行测试,产生Excel之后,打开却赫然发现图片不见了,这是发生甚么事了??
其实线索十分明确,聪明(?)的我,也不会忘记,产生Excel档案用的并不是MS Excel的套件,而是使用LibreOffice的sdk,所以就朝这方向去找问题,马上将有图片的那个Excel档案用LibreOffice打开看看,也不会出现图片,那就不是C#程式码的问题了。
下图,一样的档案,左边用MS Excel打开会有图片,右边用LibreOffice打开就没有图片。
于是乎,试着用LibreOffice来插入页首的图片看看,结果发现,LibreOffice并没有可以在页首插入图片的功能,页首页尾设定的项目,由左至右分别是:
文字特性标题、档案名称、路径/档案名称工作表名称页码总页数日期时间并没有一个选项可以选择插入图片,也因为这样,所以在页首页尾插入图片当作浮水印,结论是
GG
。替代方案:背景图片
正规(?)的方法不行,那就只好想替代方案了,那就是一开始所想到的,给它一个背景图就好,没有採用是因为,背景图只会出现一遍,不能适用于有分页的报表,而页首页尾可以自动在每页都加上图片,比较方便,所以就先试页首页尾,现在既然页首页尾不行,那就变回插入背景图,然后在计算它每一页大约的资料量,就可以在每一页都出现这个背景图,也就达成浮水印的功能了。
//6是表头的资料行数//30是每页会出现的资料行数//这两个数字请自行判断for (var i = 6; i <= data.Data.Count; i += 30){ //图片路径 var img = sheet.Drawings.AddPicture($"bkImage{i}", new FileInfo(HttpContext.Current.Server.MapPath("~/Content/images/excelbk.png"))); //图片位置依序为:行、RowOffsetPixel、列、ColumnOffsetPixel //RowOffsetPixel与ColumnOffsetPixel可以不用设定 img.SetPosition(i, 0, 2, 0);}
修改后结果显示如下,左边是MS Excel编辑画面,右边是LibreOffice编辑画面,使用这种方法,在编辑画面也看得到图片,当然列印也可以。
总结
用插入图片这种替代方案,固然是可以解决需求,不过缺点是,编辑画面可以随意拖拉图片,不过这也是无可奈何的解法,毕竟Excel本来就没有浮水印的功能,如果也有伙伴们遇到需要在Excel上加入浮水印的需求的话,然后又有买MS Office授权,就直接用MS Excel插入页首页尾吧!但如果只能用免费的OpenOffice来做的话,这边提供一个替代的解决方案,以上谢谢各位收看。