poi excel 添加水印

此种方式是通过文字写入图片,然后插入图片,形成水印的方式。由于excel分为07版(xlsx)与03版(xls),所以解析方式也分为两种。

  1. 生成水印图片:
// 获取bufferedImage对象
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取Graphics2d对象
Graphics2D g2d = image.createGraphics();
// 写入水印文字原定高度过小,所以累计写水印,增加高度
g2d.drawString(content, (int) x, (int) y);
// 释放对象
g2d.dispose();

  1. xlsx获取列宽与行高方式,由于底层是xml文件,可解析xml文件获取对应属性
    在这里插入图片描述
//获取xml对象
 CTWorksheet worksheet = sheet.getCTWorksheet();
 CTSheetFormatPr pr = worksheet.getSheetFormatPr();
 //获取默认宽度
 double dcw = pr.getDefaultColWidth();
 //获取默认高度
 double drh = pr.getDefaultRowHeight();
 //获取列宽
 CTCols ctCols = worksheet.getColsArray(0);
  for (CTCol ctCol : ctCols.getColList()) {
     int min = (int)ctCol.getMin();
      int max = (int)ctCol.getMax();
      for (int t = min; t <= max; t++) {
          OGGER.info(ctCol.getWidth());
      }
  }
 //获取行高
 CTSheetData ctSheetData = worksheet.getSheetData();
 List<CTRow> ctRowList = ctSheetData.getRowList();
 int row = 0;//存储行数
 int cell = 0;//存储列数
 for (int w = 0; w < ctRowList.size(); w++) {
 	CTRow ctRow = ctRowList.get(w);
 	CTRow ctRow = ctRowList.get(w);
    if (w == ctRowList.size() - 1) {
        row = (int)ctRow.getR();
    }
    String span = ctRow.getSpans().get(0).toString();
    if (span.contains(":")) {
        cell = Math.max(cell, Integer.parseInt(span.split(":")[1]));
    }
 	OGGER.info(ctRow.getHt());
 }
 
  1. xls获取列宽与行高,精确到像素值,请参考:POI获取单元格的宽和高
//行数
int row = sheet.getLastRowNum() + 1;
//列数
 int cell = 0;
 for (int j = fNum; j < row; j++) {// 获取最大列数
     if (Objects.nonNull(sheet.getRow(j))) {
         cell = Math.max(cell,sheet.getRow(j).getLastCellNum());
     }
 }
//获取列宽
sheet.getColumnWidthInPixels(k);//k, 列的下标
//获取行高
sheet.getRow(r).getHeightInPoints();//r, 行的下标

  1. 将水印图片加入excel
 XSSFClientAnchor anchor = drawing.createAnchor(
        0,//x轴的开始坐标
        0,//y轴的开始坐标
        Short.MAX_VALUE,//x轴的结束坐标
        Integer.MAX_VALUE,//y轴的结束坐标
        c0,//开始插入x坐标
        r0,//开始插入y坐标
        c,//结束插入x坐标
        r);//结束插入y坐标
XSSFPicture pic = drawing.createPicture(anchor,
        workbook.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG));
pic.resize();//做调整

狐小E, 企业数字化建设的全景攻略 https://www.hixiaoe.com

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值