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();// 释放画笔
        }
    }

}
相关推荐
~在杰难逃~3 小时前
关于订单信息的Excel数据分析报告
笔记·数据分析·excel·数据分析报告
生产队队长8 小时前
SpringBoot2:web开发常用功能实现及原理解析-整合EasyExcel实现Excel导入导出功能
spring boot·excel
麋鹿会飞但不飘10 小时前
EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法
java·spring boot·excel
Eiceblue10 小时前
Python 实现Excel XLS和XLSX格式相互转换
vscode·python·pycharm·excel
if时光重来12 小时前
springboot项目实现导出excel动态设置表头
spring boot·后端·excel
我是Superman丶14 小时前
【工具】Java Excel转图片
java·python·excel
說詤榢14 小时前
判断2个excel文件差异的条数
excel
镜花照无眠18 小时前
Excel爬虫使用实例-百度热搜
爬虫·excel
一念之间 一心向阳1 天前
PHP 使用Spreadsheet写excel缓存导致内存不断增加
php·excel
zhang-ge2 天前
python提取pdf表格到excel:拆分、提取、合并
python·pdf·excel