Example usage for org.apache.poi.hssf.usermodel HSSFClientAnchor getAnchorType

List of usage examples for org.apache.poi.hssf.usermodel HSSFClientAnchor getAnchorType

Introduction

In this page you can find the example usage for org.apache.poi.hssf.usermodel HSSFClientAnchor getAnchorType.

Prototype

@Override
public AnchorType getAnchorType() 

Source Link

Document

Gets the anchor type Changed from returning an int to an enum in POI 3.14 beta 1.

Usage

From source file:net.sf.jasperreports.engine.export.JRXlsMetadataExporter.java

License:Open Source License

public void exportImage(JRPrintImage element) throws JRException {

    String currentColumnName = element.getPropertiesMap()
            .getProperty(JRXlsAbstractMetadataExporter.PROPERTY_COLUMN_NAME);
    if (currentColumnName != null && currentColumnName.length() > 0) {
        boolean repeatValue = getPropertiesUtil().getBooleanProperty(element,
                JRXlsAbstractMetadataExporter.PROPERTY_REPEAT_VALUE, false);

        setColumnName(currentColumnName);
        adjustColumnWidth(currentColumnName, element.getWidth(),
                ((JRXlsExporterNature) nature).getColumnAutoFit(element));
        adjustRowHeight(element.getHeight(),
                Boolean.TRUE.equals(((JRXlsExporterNature) nature).getRowAutoFit(element)));

        int topPadding = Math.max(element.getLineBox().getTopPadding().intValue(),
                getImageBorderCorrection(element.getLineBox().getTopPen()));
        int leftPadding = Math.max(element.getLineBox().getLeftPadding().intValue(),
                getImageBorderCorrection(element.getLineBox().getLeftPen()));
        int bottomPadding = Math.max(element.getLineBox().getBottomPadding().intValue(),
                getImageBorderCorrection(element.getLineBox().getBottomPen()));
        int rightPadding = Math.max(element.getLineBox().getRightPadding().intValue(),
                getImageBorderCorrection(element.getLineBox().getRightPen()));

        //pngEncoder.setImage( null );

        int availableImageWidth = element.getWidth() - leftPadding - rightPadding;
        availableImageWidth = availableImageWidth < 0 ? 0 : availableImageWidth;

        int availableImageHeight = element.getHeight() - topPadding - bottomPadding;
        availableImageHeight = availableImageHeight < 0 ? 0 : availableImageHeight;

        Renderable renderer = element.getRenderable();

        if (renderer != null && availableImageWidth > 0 && availableImageHeight > 0) {

            if (renderer.getTypeValue() == RenderableTypeEnum.IMAGE) {
                // Image renderers are all asked for their image data and dimension at some point.
                // Better to test and replace the renderer now, in case of lazy load error.
                renderer = RenderableUtil.getInstance(jasperReportsContext)
                        .getOnErrorRendererForImageData(renderer, element.getOnErrorTypeValue());
                if (renderer != null) {
                    renderer = RenderableUtil.getInstance(jasperReportsContext)
                            .getOnErrorRendererForDimension(renderer, element.getOnErrorTypeValue());
                }/*from ww  w  .j  ava  2 s . c  om*/
            } else {
                renderer = new JRWrappingSvgRenderer(renderer,
                        new Dimension(element.getWidth(), element.getHeight()),
                        ModeEnum.OPAQUE == element.getModeValue() ? element.getBackcolor() : null);
            }
        } else {
            renderer = null;
        }

        if (renderer != null) {
            int normalWidth = availableImageWidth;
            int normalHeight = availableImageHeight;

            Dimension2D dimension = renderer.getDimension(jasperReportsContext);
            if (dimension != null) {
                normalWidth = (int) dimension.getWidth();
                normalHeight = (int) dimension.getHeight();
            }

            float xalignFactor = 0f;
            switch (element.getHorizontalAlignmentValue()) {
            case RIGHT: {
                xalignFactor = 1f;
                break;
            }
            case CENTER: {
                xalignFactor = 0.5f;
                break;
            }
            case LEFT:
            default: {
                xalignFactor = 0f;
                break;
            }
            }

            float yalignFactor = 0f;
            switch (element.getVerticalAlignmentValue()) {
            case BOTTOM: {
                yalignFactor = 1f;
                break;
            }
            case MIDDLE: {
                yalignFactor = 0.5f;
                break;
            }
            case TOP:
            default: {
                yalignFactor = 0f;
                break;
            }
            }

            byte[] imageData = null;
            //            int topOffset = 0;
            //            int leftOffset = 0;
            //            int bottomOffset = 0;
            //            int rightOffset = 0;
            //            
            switch (element.getScaleImageValue()) {
            case CLIP: {
                int dpi = getPropertiesUtil().getIntegerProperty(Renderable.PROPERTY_IMAGE_DPI, 72);
                double scale = dpi / 72d;

                BufferedImage bi = new BufferedImage((int) (scale * availableImageWidth),
                        (int) (scale * availableImageHeight), BufferedImage.TYPE_INT_ARGB);

                Graphics2D grx = bi.createGraphics();
                grx.scale(scale, scale);
                grx.clip(new Rectangle(0, 0, availableImageWidth, availableImageHeight));

                renderer.render(jasperReportsContext, grx,
                        new Rectangle((int) (xalignFactor * (availableImageWidth - normalWidth)),
                                (int) (yalignFactor * (availableImageHeight - normalHeight)), normalWidth,
                                normalHeight));

                //                  topOffset = topPadding;
                //                  leftOffset = leftPadding;
                //                  bottomOffset = bottomPadding;
                //                  rightOffset = rightPadding;

                imageData = JRImageLoader.getInstance(jasperReportsContext).loadBytesFromAwtImage(bi,
                        ImageTypeEnum.PNG);

                break;
            }
            case FILL_FRAME: {
                //                  topOffset = topPadding;
                //                  leftOffset = leftPadding;
                //                  bottomOffset = bottomPadding;
                //                  rightOffset = rightPadding;

                imageData = renderer.getImageData(jasperReportsContext);

                break;
            }
            case RETAIN_SHAPE:
            default: {
                if (element.getHeight() > 0) {
                    double ratio = (double) normalWidth / (double) normalHeight;

                    if (ratio > (double) availableImageWidth / (double) availableImageHeight) {
                        normalWidth = availableImageWidth;
                        normalHeight = (int) (availableImageWidth / ratio);
                    } else {
                        normalWidth = (int) (availableImageHeight * ratio);
                        normalHeight = availableImageHeight;
                    }

                    //                     topOffset = topPadding + (int) (yalignFactor * (availableImageHeight - normalHeight));
                    //                     leftOffset = leftPadding + (int) (xalignFactor * (availableImageWidth - normalWidth));
                    //                     bottomOffset = bottomPadding + (int) ((1f - yalignFactor) * (availableImageHeight - normalHeight));
                    //                     rightOffset = rightPadding + (int) ((1f - xalignFactor) * (availableImageWidth - normalWidth));

                    imageData = renderer.getImageData(jasperReportsContext);
                }
                break;
            }
            }

            XlsMetadataReportConfiguration configuration = getCurrentItemConfiguration();

            short mode = backgroundMode;
            short backcolor = whiteIndex;
            if (!configuration.isIgnoreCellBackground() && element.getBackcolor() != null) {
                mode = HSSFCellStyle.SOLID_FOREGROUND;
                backcolor = getWorkbookColor(element.getBackcolor()).getIndex();
            }

            short forecolor = getWorkbookColor(element.getLineBox().getPen().getLineColor()).getIndex();

            if (element.getModeValue() == ModeEnum.OPAQUE) {
                backcolor = getWorkbookColor(element.getBackcolor()).getIndex();
            }

            HSSFCellStyle cellStyle = getLoadedCellStyle(mode, backcolor, HSSFCellStyle.ALIGN_LEFT,
                    HSSFCellStyle.VERTICAL_TOP, (short) 0,
                    getLoadedFont(getDefaultFont(), forecolor, null, getLocale()), new BoxStyle(element),
                    isCellLocked(element), isCellHidden(element));

            addBlankElement(cellStyle, false, currentColumnName);

            int colIndex = columnNamesMap.get(currentColumnName);
            try {
                HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) (colIndex), rowIndex,
                        (short) (colIndex + 1), rowIndex + 1);
                ImageAnchorTypeEnum imageAnchorType = ImageAnchorTypeEnum.getByName(JRPropertiesUtil
                        .getOwnProperty(element, XlsReportConfiguration.PROPERTY_IMAGE_ANCHOR_TYPE));
                if (imageAnchorType == null) {
                    imageAnchorType = configuration.getImageAnchorType();
                    if (imageAnchorType == null) {
                        imageAnchorType = ImageAnchorTypeEnum.MOVE_NO_SIZE;
                    }
                }
                anchor.setAnchorType(imageAnchorType.getValue());
                //pngEncoder.setImage(bi);
                //int imgIndex = workbook.addPicture(pngEncoder.pngEncode(), HSSFWorkbook.PICTURE_TYPE_PNG);
                int imgIndex = workbook.addPicture(imageData, HSSFWorkbook.PICTURE_TYPE_PNG);
                patriarch.createPicture(anchor, imgIndex);

                // set auto fill columns
                if (repeatValue) {
                    CellSettings cellSettings = new CellSettings(cellStyle);
                    cellSettings.setCellValue(new ImageSettings(imgIndex, anchor.getAnchorType()));
                    addCell(cellSettings, repeatedValues, currentColumnName);
                } else {
                    repeatedValues.remove(currentColumnName);
                }

                //               setHyperlinkCell(element);
            } catch (Exception ex) {
                throw new JRException("The cell cannot be added", ex);
            } catch (Error err) {
                throw new JRException("The cell cannot be added", err);
            }
        }
    }
}