如何使用xlsxwriter引擎为Excel文件正确设置水印
问题根因
两种尝试的方案未达预期的核心原因如下:
set_header()方法插入的是页眉区域的图片,仅在打印预览、实际打印输出时可见,Excel默认的工作表编辑视图不会渲染页眉/页脚内容,因此打开文件看不到效果属于正常现象。参数写法上,接口调用时正确的图片占位符为&G,即注释行的'&C&G'才是符合xlsxwriter语法的写法,&[Picture]是Excel客户端手动操作时显示的占位符,不适合接口传参。set_background()方法的设计目标是设置工作表平铺背景,默认会将图片重复铺满整个工作表,且该背景默认不会随文件打印输出,本身就不是为水印场景设计的功能。
可行实现方案
xlsxwriter没有提供原生的水印接口,根据不同的显示需求可以选择对应实现方式:
方案1:仅需打印时显示水印
直接使用修正参数后的set_header()方法即可,代码如下:
# 页眉居中插入水印图片,可通过scale参数调整图片大小 worksheet.set_header( '&C&G', { 'image_center': 'logo.png', 'image_center_scale': 0.6 } )
该方案实现的水印不会在编辑视图显示,打印/导出PDF时会自动出现在页面页眉位置。
方案2:编辑视图可见的非平铺水印
提前准备好半透明、背景透明的水印素材(避免遮挡单元格内容),通过插入浮层图片的方式实现水印效果,代码如下:
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter') data.to_excel(writer, sheet_name='Download Sheet', startrow=2, startcol=0 , header=None, index = False) worksheet = writer.sheets['Download Sheet'] # 插入水印图片 worksheet.insert_image( 'B3', # 水印放置的起始单元格,可根据表格实际范围调整 'logo.png', { 'x_offset': 120, # 水平位置微调 'y_offset': 80, # 垂直位置微调 'x_scale': 0.7, # 水平缩放调整水印大小 'y_scale': 0.7, # 垂直缩放调整水印大小 'transparency': 75, # 水印透明度,0为完全不透明,100为完全透明,建议设置为60-80 'positioning': 1 # 图片随单元格移动但不随单元格大小拉伸,不影响正常单元格编辑 } ) writer.close()
如果需要全页多位置分散的水印效果,可以提前将多个水印排版生成一张透明底的大图,单次插入后调整大小覆盖整个表格区域即可,不需要逐张插入小图,性能更好。
内容的提问来源于stack exchange,提问作者Himanshu Joshi
相关产品推荐
相关产品推荐

