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;
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,我们可以使用Apache POI库来操作Excel文件并添加水印。以下是一个简单的步骤概述: 1. **添加依赖**: 首先,需要将Apache POI及其衍生库(如XSSF,代表Excel 2007及更高版本)添加到你的项目中。如果你使用Maven,可以在pom.xml文件中入以下依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.0.0</version> </dependency> ``` 2. **创建Watermark对象**: 使用`XSSFRenderingHint`来设置水印样式。例如,你可以创建一个`XSSFRichTextString`对象作为水印内容,并设置透明度: ```java XSSFRichTextString watermark = new XSSFRichTextString("水印文字"); XSSFRenderingHint hint = new XSSFRenderingHint(); hint.setWatermark(watermark); hint.setFillPattern(WatermarkFillPattern.BACKGROUND); ``` 3. **添加水印到工作表**: 在`XSSFWorkbook`对象上创建一个新的`XSSFSheet`,然后在适当的单元格位置设置水印: ```java XSSFSheet sheet = workbook.createSheet("Sheet1"); CellRangeAddress range = new CellRangeAddress(0, 0, 0, 0); // 设置水印范围 sheet.addNewDrawingCellRange(range); Drawing<?> drawing = sheet.getDrawingPatriarch(); ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 0, 0); Picture pic = drawing.createPicture(anchor, ImageDataFactory.createFromStream(new FileInputStream("watermark.png"))); pic.setRenderHint(hint); ``` 这里假设你有一个名为"watermark.png"的图片文件作为水印。 4. **保存Excel文件**: 最后,通过`Workbook.write()`方法将含有水印的工作簿写入到磁盘上的Excel文件。 ```java workbook.write(outputFile); workbook.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值