Apache POI - Excel 中的水印 - Excel 和 LibreOffice 中的不同外观

Apache POI - watermark in Excel - different appearence in Excel and LibreOffice

我按照sample添加图片水印如下:

private void addWaterMark4AllSheets() {
    final BufferedImage image = FontImage.createWatermarkImage();
    // Export to byte stream B
    final ByteArrayOutputStream os = new ByteArrayOutputStream();
    try {
        ImageIO.write(image, "png", os);
    } catch (final IOException e) {
        e.printStackTrace();
    }

    final XSSFWorkbook wb = (XSSFWorkbook) workBook;
    final int pictureIdx = wb.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);
    final POIXMLDocumentPart poixmlDocumentPart = wb.getAllPictures().get(pictureIdx);
    // ((XSSFSheet )(schreiben.getSheet()).
    for (int i = 0; i < workBook.getNumberOfSheets(); i++) {// Get each Sheet
        final XSSFSheet sheet = wb.getSheetAt(i);
        final PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
        final String relType = XSSFRelation.IMAGES.getRelation();
        // add relation from sheet to the picture data
        final PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType,
                null);
        // set background picture to sheet
        sheet.getCTWorksheet().addNewPicture().setId(pr.getId());
    }

} 

总的来说,这种方法效果很好。 Excel 中添加了一张图片。但外观不同

  1. 在Excel中:图像在编辑(sheets)期间显示在背景中。但是当我打印 sheet.
  2. 时它没有显示
  3. 在 LibreOffice (7.1) 中:图像在编辑(sheet)期间不显示 - 但打印出来。

是否有机会修复它以在两个 Spreadsheet 中工作?

没有什么 apache poi 可以改变,因为这种行为是在不同的 spreadsheet 软件中设计的。

您的链接代码示例不会创建水印。水印功能在 Microsoft Excel 中不可用。相反,它将背景图片添加到 sheets.

Microsoft 自己声明:You cannot print a background graphic for a Excel worksheet。因此,使用 Microsoft Excel,sheet 的背景图形仅在 Excel GUI 中可见,但在印刷品中不可见。

在 LibreOffice 中,这些背景图形称为水印,但 Libreoffice 在 Defining Graphics or Colors in the Background of Pages (Watermark) 中声明:

In spreadsheets this background appears only in the print behind the cells not formatted elsewhere.

因此,使用 Libreoffice,sheet 的背景图形仅在印刷品中可见。

所以您所观察到的是设计使然。

Add or remove a sheet background Microsoft describes methods to mimic a watermark in Excel. The usage of a picture in a header or footer to mimic a watermark using apache poi is described in 。但这也意味着打印水印。因此水印仅在打印预览和打印中可见。它在 sheet 的 GUI 中不可见。在页眉或页脚中添加图片以模仿水印的选项仅 Excel。 LibreOffice 不提供该功能。

结论:

不可能有类似于在 Excel 和 LibreOffice 中以相同方式工作的水印的功能。