起因
最近接到了一个比较恶心的需求,要求在导出的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<sheetSize;i++){
Sheet sheet = wb.getSheetAt(i);
//获取excel实际所占行
int row = sheet.getFirstRowNum() + sheet.getLastRowNum();
//获取excel实际所占列
int cell = sheet.getRow(sheet.getFirstRowNum()).getLastCellNum() + 1;
//根据行与列计算实际所需多少水印
putWaterRemarkToExcelNew(wb, sheet, imgFileName, 0, 0, 5, 5, cell / 5 + 1, row / 5 + 1, 0, 0);
}
}
/**
* 创建水印图片
* @param content
* @param file