Apache POI 是一个用于处理 Microsoft Office 文件的 Java 库。它可以用来创建、读取和修改 Excel 文件。在 Excel 文件中添加水印是一种常见的需求,但在 Excel 和 LibreOffice 中生成的外观有时会不同。以下是一个示例代码,演示如何在 Apache POI 中添加水印并处理不同的外观。
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.IOUtils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class WatermarkExample {
public static void main(String[] args) throws Exception {
// 从文件读取模板
InputStream inputStream = new FileInputStream("template.xls");
Workbook workbook = new HSSFWorkbook(inputStream);
// 创建样式
Font font = workbook.createFont();
font.setColor(IndexedColors.GREY_50_PERCENT.getIndex());
font.setFontHeightInPoints((short) 100);
font.setBold(true);
CellStyle style = workbook.createCellStyle();
style.setFont(font);
style.setRotation((short) -45);
// 创建水印
Drawing drawing = workbook.getSheetAt(0).createDrawingPatriarch();
CreationHelper helper = workbook.getCreationHelper();
ClientAnchor anchor = helper.createClientAnchor();
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
anchor.setCol1(5);
anchor.setRow1(5);
anchor.setCol2(10);
anchor.setRow2(10);
Picture pic = helper.createPicture(anchor, loadWatermarkImage(workbook));
pic.resize();
pic.setLineStyle((short) 0);
pic.setLineWidth(0);
pic.setPictureFormat(PictureFormat.JPEG);
// 设置水印样式
for (Sheet sheet : workbook) {
Header header = sheet.getHeader();
header.setCenter("&" + Drawing.SHAPE + "0");
for (int i = 0; i < 100; i++) {
Row row = sheet.createRow(i);
Cell cell = row.createCell