java导出带有水印的excel
起因
实现思路
代码实现
思考
起因
最近接到了一个比较恶心的需求,要求在导出的excel中增加水印,并且要求必须是要excel,因为他们要对excel中的数据做操作(既然要操作那水印同样可以删掉,完全是没有用的需求,但是无奈技术做不了主,只能硬着头皮干了)
实现思路
完全没有思路,根本没有相关api,于是百度、谷歌、github查个遍,最有定了方案。
方案有两种:
先弄好有水印的空excel,然后再往这个excel中写入数据。但是业务要求每个人的水印不同,所以此方案不合适。
动态生成水印图片在画到生成的excel中。可以满足业务要求,最终决定用此方式。
代码实现
实现很简单,就是先通过createWaterMark方法生成水印图片,在将图片画到所有的sheet中,具体实现如下:
public class ExcelWaterRemarkUtil {
public static void painWaterMark(Workbook wb,String content) throws IOException {
String imgFileName = "waterMark_photo_"+content+".png";
createWaterMark(content,imgFileName);
int sheetSize = wb.getNumberOfSheets();
for(int i=0;i
思考
这个方法每次都会生成新的水印图片,其实每个人的水印图片是不会变的,所有可以将水印图片放到某个目录下,每次生成前看看以后没有对应人员的水印图片,有就拿来用,没有就重新生成(也可是其他维度不一定是人员维度,主要是找到不变的元素)。和我们的缓存的想法很像。