Изображение растягивается в Excel с использованием POI - PullRequest
3 голосов
/ 18 ноября 2011

В моем приложении я создаю файл Excel, используя API POI.В одной из верхних левых ячеек документа находится изображение.Проблема, которую я получаю, состоит в том, что изображение растягивается, чтобы заполнить ячейку, в которой оно содержится.

В зависимости от того, какие методы изменения размера я использую для объекта Picture, изображение появляется в различных размерах, но оно всегда имеетГоризонтально-вертикальное соотношение, которое имеет ячейка, в которой оно находится, другими словами, оно не будет сохранять свое собственное соотношение.

Это мой код:

titleRow = sheet.createRow(0);
            titleRow.setHeightInPoints(25f);

            titleRow.createCell(0);

            sheet.getRow(0).getCell(0).setCellStyle(defaultTitleStyle(wb));

            WebApplicationContext webCtx = ((WebApplicationContext)AtlasApplicationUtils.getCurrentApplication().getContext());
            ServletContext sc = webCtx.getHttpSession().getServletContext();
            String contextPath = sc.getContextPath();
//          sc.getResourceAsStream(contextPath + "/VAADIN/themes/m2m/../m2m/img/gnd_logo_white.png")
            String f = new File("").getAbsolutePath();  
            InputStream is = new FileInputStream(System.getProperty("user.dir") + "/src/main/webapp/VAADIN/themes/m2m/img/gnd_logo_white.png");
            byte[] bytes = IOUtils.toByteArray(is);
            int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
            is.close();

            CreationHelper helper = wb.getCreationHelper();
            Drawing drawing = sheet.createDrawingPatriarch();
            ClientAnchor anchor = helper.createClientAnchor();

            anchor.setCol1(0);
            anchor.setRow1(0);
            sheet.autoSizeColumn(0);
            Picture pict = drawing.createPicture(anchor, pictureIdx);
            pict.getPreferredSize();
            pict.resize(0.25);

Метод стилевого оформления:

protected CellStyle defaultTitleStyle(final HSSFWorkbook wb) {

        CellStyle style;
        final Font titleFont = wb.createFont();


        titleFont.setFontHeightInPoints((short) 18);
        titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
        titleFont.setColor(IndexedColors.GREY_80_PERCENT.getIndex());

        style = wb.createCellStyle();
        style.setAlignment(CellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
        style.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex());
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);
//        style.setFillBackgroundColor(IndexedColors.BLUE_GREY.getIndex());
        style.setFont(titleFont);

        HSSFPalette palette = wb.getCustomPalette();
        palette.setColorAtIndex(HSSFColor.BLUE_GREY.index, 
                (byte) 7, 
                (byte) 64, 
                (byte) 127);

        palette.setColorAtIndex(HSSFColor.GREY_80_PERCENT.index, 
                (byte) 228, 
                (byte) 228, 
                (byte) 228);


        return style;

Кто-нибудь знает способ избежать этой проблемы, и пусть изображение остается оригинальнымсоотношение?

Ответы [ 2 ]

5 голосов
/ 18 ноября 2011

В документации есть небольшое предупреждение .

void resize ()

Сброс изображения до исходного размера.

Обратите внимание, что этот метод работает правильно только для книг с размер шрифта по умолчанию (Arial 10pt для .xls и Calibri 11pt для .xlsx). Если изменен шрифт по умолчанию, измененное изображение может быть растянуто вертикально или горизонтально.

0 голосов
/ 07 февраля 2018

Я думаю, вы можете попробовать добавить

anchor.setAnchorType(ClientAnchor.DONT_MOVE_AND_RESIZE);
...