引入jar包
由于easyexcel沒有引入ooxml-schemas包,所以需要額外添加,
<!-- easyexcel依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
<!-- poi 添加水印 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.4</version>
</dependency>
<!-- 使用了hutool的工具類 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
新增水印配置類和WriteHandler
新增水印配置類
@Data
public class Watermark {
/**
* 水印內容
*/
private String content = "";
/**
* 畫筆顏色. eg:#C5CBCF
*/
private String color = "#C5CBCF";
/**
* 字體顏色
*/
private Font font = new Font("microsoft-yahei", Font.PLAIN, 20);
/**
* 水印寬、高
*/
private int width = 300;
private int height = 100;
/**
* 傾斜度
*/
private double shear1 = 0.1;
private double shear2 = -0.26;
/**
* 字體的y軸位置
*/
private int yAxis = 50;
}
新增WriteHandler
注意:此方法只適用于XSSFWorkbook類,easyexcel默認使用的是SXSSFWorkbook類,在使用easyexcel匯出時需要設定為inMemory模式,否則會拋出型別轉換例外,
public class CustomWaterMarkHandler implements SheetWriteHandler {
private final Watermark watermark;
public CustomWaterMarkHandler(Watermark watermark) {
this.watermark = watermark;
}
@Override
public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
}
@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
try {
BufferedImage bufferedImage = createWatermarkImage();
setWaterMarkToExcel((XSSFWorkbook) writeWorkbookHolder.getWorkbook(), bufferedImage);
} catch (Exception e) {
throw new RuntimeException("添加水印出錯");
}
}
private BufferedImage createWatermarkImage() {
final Font font = watermark.getFont();
final int width = watermark.getWidth();
final int height = watermark.getHeight();
String[] textArray = watermark.getContent().split(",");
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 背景透明 開始
Graphics2D g = image.createGraphics();
image = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g.dispose();
// 背景透明 結束
g = image.createGraphics();
// 設定畫筆顏色
g.setColor(new Color(Integer.parseInt(watermark.getColor().substring(1), 16)));
// 設定畫筆字體
g.setFont(font);
// 設定傾斜度
g.shear(watermark.getShear1(), watermark.getShear2());
// 設定字體平滑
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int y = watermark.getYAxis();
for (String s : textArray) {
// 從畫框的y軸開始畫字串.假設電腦螢屏中心為0,y軸為正數則在下方
g.drawString(s, 0, y);
y = y + font.getSize();
}
// 釋放畫筆
g.dispose();
return image;
}
private void setWaterMarkToExcel(XSSFWorkbook workbook, BufferedImage bfi) {
//將圖片添加到作業簿
int pictureIdx = workbook.addPicture(ImgUtil.toBytes(bfi, ImgUtil.IMAGE_TYPE_PNG), Workbook.PICTURE_TYPE_PNG);
//建立 sheet 和 圖片 的關聯關系
XSSFPictureData xssfPictureData = https://www.cnblogs.com/yywf/p/workbook.getAllPictures().get(pictureIdx);
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
XSSFSheet xssfSheet = workbook.getSheetAt(i);
PackagePartName packagePartName = xssfPictureData.getPackagePart().getPartName();
PackageRelationship packageRelationship = xssfSheet.getPackagePart()
.addRelationship(packagePartName, TargetMode.INTERNAL, XSSFRelation.IMAGES.getRelation(), null);
//添加水印到作業表
xssfSheet.getCTWorksheet().addNewPicture().setId(packageRelationship.getId());
}
}
}
測驗
//水印配置
Watermark watermark = new Watermark();
watermark.setContent("測驗文字水印");
watermark.setWidth(500);
watermark.setHeight(200);
watermark.setYAxis(200);
//匯出
EasyExcel.write(outputStream, Test.class)
.inMemory(true)
.sheet("sheet1")
.registerWriteHandler(new CustomWaterMarkHandler(watermark))
.doWrite(Collections.singletonList(new Test()));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548690.html
標籤:Java
