На HSSFWorkbook с пользовательским шрифтом я сделал следующее, чтобы логотип отображался в нужных размерах:
CreationHelper helper = wb.getCreationHelper();
Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = helper.createClientAnchor();
anchor.setDx1(LOGO_MARGIN * XSSFShape.EMU_PER_PIXEL);
anchor.setDx2(LOGO_WIDTH_IN_FUNNY_POI_FORMAT * XSSFShape.EMU_PER_PIXEL);
anchor.setDy1(LOGO_MARGIN * XSSFShape.EMU_PER_PIXEL);
anchor.setDy2(LOGO_HEIGHT_IN_FUNNY_POI_FORMAT * XSSFShape.EMU_PER_PIXEL);
drawing.createPicture(anchor, pictureIndex);
Где я установил LOGO_HEIGHT ... и LOGO_WIDTH .. на требуемый размер изображения в пикселях.
Полученное изображение не было в исходном соотношении и не соответствует ожидаемому размеру пикселя.
Поэтому я использовал ожидаемое соотношение размера и текущего размера и скорректировал значения LOGO_WIDTH .. и LOGO_HEIGHT .. соответственно. Не красиво, но работает: /
И не звоните Picture.resize()
потом.
См. Apache POI Bug 52504 или , обсуждение этой группы новостей о poi Picture.resize()
и Краткое руководство по POI для вставки изображений .
Обновление : текущий код выглядит следующим образом, исходное изображение 2000x450:
LOGO_MARGIN = 2;
int index = getLogoPictureIndex();
CreationHelper helper = this.wb.getCreationHelper();
Drawing drawing = this.sheet.createDrawingPatriarch();
ClientAnchor anchor = helper.createClientAnchor();
anchor.setDx1(LOGO_MARGIN * XSSFShape.EMU_PER_PIXEL);
anchor.setDy1(LOGO_MARGIN * XSSFShape.EMU_PER_PIXEL);
Picture pic = drawing.createPicture(anchor, index);
pic.resize(0.064);