java 导出excel添加水印

pom.xml 引入依赖
<!--水印-->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>ooxml-schemas</artifactId>
   <version>1.4</version>
</dependency>

//获取当前时间年月日
String calculateDate =DateUtil.formatDateTime(new Date());
try {
   //添加水印内容为当前日期
   //调用通用类,设置水印的格式
   BufferedImage bufferImg = WaterMark.createWaterMark("xlgsm"+calculateDate);
   // 导出到字节流B'
   ByteArrayOutputStream os = new ByteArrayOutputStream();
   ImageIO.write(bufferImg, "png", os);

   File path = new File(ResourceUtils.getURL("classpath:").getPath());
   String url = URLDecoder.decode(path.getAbsolutePath(), "utf-8");
//模板路径
   FileInputStream fileInput = new   FileInputStream(url+"/static/dist/download/XXXXXXXX.xlsx");
   XSSFWorkbook wb = new XSSFWorkbook(fileInput);
   fileInput.close();

   int pictureIdx = wb.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);
   POIXMLDocumentPart poixmlDocumentPart = wb.getAllPictures().get(pictureIdx);
   //获取每个Sheet表
   for (int i = 0; i < wb.getNumberOfSheets(); i++) {
      XSSFSheet sheet = wb.getSheetAt(i);
      PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
      String relType = XSSFRelation.IMAGES.getRelation();
      PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);

      sheet.getCTWorksheet().addNewPicture().setId(pr.getId());
      //sheet.protectSheet(pwd);
   }

   //创建输出流
   ServletOutputStream out = response.getOutputStream();
   response.setContentType("application/vnd.ms-excel");
   //导出模板的名称
   String fileName = java.net.URLEncoder.encode("导出模板", "UTF-8");
   String disposition = "attachment; fileName="+fileName+".xlsx";
   response.setHeader("Content-Disposition", disposition);

   wb.write(out);
   out.flush();
   out.close();
   wb.close();
} catch (IOException e) {
   LogUtil.log(e.getMessage(),Level.ERROR,e);
}

/**
 * 创建水印
 */
public class WaterMark {

    //
    public static BufferedImage createWaterMark(String content) {

        Integer width = 450;
        Integer height = 400;
        // 获取bufferedImage对象
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        String fontType = "宋体";
        Integer fontStyle = Font.PLAIN;
        Integer fontSize = 25;
        Font font = new Font(fontType, fontStyle, fontSize);
        // 获取Graphics2d对象
        Graphics2D g2d = image.createGraphics();
        image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
        g2d.dispose();
        g2d = image.createGraphics();
        //设置字体颜色和透明度
        g2d.setColor(Color.lightGray);
        // 设置字体
        g2d.setStroke(new BasicStroke(1));
        // 设置字体类型  加粗 大小
        g2d.setFont(font);
        g2d.shear(0.1,-0.4);
        //设置倾斜度
        FontRenderContext context = g2d.getFontRenderContext();
        Rectangle2D bounds = font.getStringBounds(content, context);
        double x = (width - bounds.getWidth()) / 2;
        double y = (height - bounds.getHeight()) / 2;
        double ascent = -bounds.getY();
        double baseY = y + ascent;
        // 写入水印文字原定高度过小,所以累计写水印,增加高度
        g2d.drawString(content, (int) x, (int) baseY);
        // 设置透明度
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
        // 释放对象
        g2d.dispose();
        return image;
    }
}