此种方式是通过文字写入图片,然后插入图片,形成水印的方式。由于excel分为07版(xlsx)与03版(xls),所以解析方式也分为两种。
- 生成水印图片:
// 获取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();
- 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());
}
- 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, 行的下标
- 将水印图片加入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