easyPOI生成的excel添加水印

项目场景:

需求要求生成的excel添加水印,这个还是第一次听到,于是研究了一下。


引入依赖

代码如下:

复制代码
implementation ('cn.afterturn:easypoi-base:4.5.0') {
        exclude  group: 'com.google.guava', module: 'guava'
        exclude  group: 'org.apache.commons', module: 'commons-compress'
    }

    implementation ('org.apache.poi:ooxml-schemas:1.4')

排除的两个因为对代码没有影响,主要是因为有代码漏洞,排除掉就OK了,但是easy POI引入的apache POI并不全,导致无法添加水印,所以必须要引入org.apache.poi:ooxml-schemas:1.4


代码:

直接上代码了。

java 复制代码
@Slf4j
public class ExcelWaterMarkUtil {
    private ExcelWaterMarkUtil() {}

    public static void excelWaterMark(Workbook workbook, String append, String username){
        ByteArrayOutputStream os = null;
        try {
            //生成水印图片并导出字节流
            BufferedImage image = createWatermarkImage(append,username);
            os = new ByteArrayOutputStream();
            ImageIO.write(image, "png", os);
            int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);
            POIXMLDocumentPart poixmlDocumentPart = (POIXMLDocumentPart) workbook.getAllPictures().get(pictureIdx);
            //获取每个Sheet表并插入水印
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                XSSFSheet sheet1 = (XSSFSheet) workbook.getSheetAt(i);
                PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
                String relType = XSSFRelation.IMAGES.getRelation();
                //add relation from sheet to the picture data
                PackageRelationship pr = sheet1.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
                //set background picture to sheet
                sheet1.getCTWorksheet().addNewPicture().setId(pr.getId());
            }

        } catch (Exception e) {
            log.error("excel文件添加水印异常",e);
        }finally {
            if (os != null){
                try {
                    os.close();
                }catch (Exception e){
                    log.error("水印图片字节流关闭异常",e);
                }
            }
        }
    }

    private static BufferedImage createWatermarkImage(String append, String username) {

        Graphics2D g = null;
        try {
            Font font = new Font("microsoft-yahei", Font.PLAIN, 20);
            int width = 300, height = 170;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            g = image.createGraphics();

            // 背景透明 结束
            g.setColor(Color.white);
            g.fillRect(0, 0, width , height);

            g.setColor(new Color(Integer.parseInt("C5CBCF", 16)));// 设定画笔颜色
            g.setFont(font);// 设置画笔字体
            g.shear(0.1, -0.20);// 设定倾斜度

            //        设置字体平滑
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            String[] textArray = new String[]{ "FRP - " + append, username };

            int y = 50;
            for (int i = 0; i < textArray.length; i++) {
                g.drawString(textArray[i], 0, y);// 画出字符串
                y = y + font.getSize();
            }

            g.drawString(LocalDateTime.now(ZoneId.of(CommonConstant.CHINA_ZONE)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), 0, y);// 画出字符串
            return image;
        }finally {
            g.dispose();// 释放画笔
        }
    }

}
相关推荐
醉卧考场君莫笑16 小时前
EXCEL数据分析基础(没有数据统计和数据可视化)
信息可视化·数据分析·excel
yesyesyoucan21 小时前
智能文件格式转换平台:文本/Excel与CSV的无缝互转解决方案
excel
hqyjzsb1 天前
2026年AI证书选择攻略:当“平台绑定”与“能力通用”冲突,如何破局?
大数据·c语言·人工智能·信息可视化·职场和发展·excel·学习方法
牛奔1 天前
Linux 的日志分析命令
linux·运维·服务器·python·excel
不吃葱的胖虎1 天前
根据Excel模板,指定单元格坐标填充数据
java·excel
罗政1 天前
【Excel批处理】一键批量AI提取身份证信息到excel表格,数据安全,支持断网使用
人工智能·excel
晨晨渝奇1 天前
pandas 中将两个 DataFrame 分别导出到同一个 Excel 同一个工作表(sheet1)的 A1 单元格和 D1 单元格
excel·pandas
木辰風1 天前
EasyExcel根据动态字段,进行导出excel文件
java·前端·excel
辣机小司1 天前
【踩坑记录:EasyExcel 生产级实战:策略模式重构与防御性导入导出校验指南(实用工具类分享)】
java·spring boot·后端·重构·excel·策略模式·easyexcel
傻啦嘿哟2 天前
Python实现Excel数据自动化处理:从繁琐操作到智能流程的蜕变
python·自动化·excel