org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer.StyleWriterUtility.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer.StyleWriterUtility.java

Source

/*
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * Copyright (c) 2001 - 2017 Object Refinery Ltd, Hitachi Vantara and Contributors..  All rights reserved.
 */

package org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.reporting.engine.classic.core.ElementAlignment;
import org.pentaho.reporting.engine.classic.core.modules.parser.bundle.BundleNamespaces;
import org.pentaho.reporting.engine.classic.core.modules.parser.bundle.BundleStyleRegistry;
import org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer.styles.BundleStyleSetWriteHandler;
import org.pentaho.reporting.engine.classic.core.style.BandStyleKeys;
import org.pentaho.reporting.engine.classic.core.style.BorderStyle;
import org.pentaho.reporting.engine.classic.core.style.BoxSizing;
import org.pentaho.reporting.engine.classic.core.style.ElementStyleKeys;
import org.pentaho.reporting.engine.classic.core.style.ElementStyleSheet;
import org.pentaho.reporting.engine.classic.core.style.TableLayout;
import org.pentaho.reporting.engine.classic.core.style.TextStyleKeys;
import org.pentaho.reporting.engine.classic.core.util.StrokeUtility;
import org.pentaho.reporting.engine.classic.core.util.beans.BeanException;
import org.pentaho.reporting.engine.classic.core.util.beans.ColorValueConverter;
import org.pentaho.reporting.engine.classic.core.util.beans.ConverterRegistry;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.formatting.FastDecimalFormat;
import org.pentaho.reporting.libraries.xmlns.common.AttributeList;
import org.pentaho.reporting.libraries.xmlns.writer.XmlWriter;
import org.pentaho.reporting.libraries.xmlns.writer.XmlWriterSupport;

import java.awt.Color;
import java.awt.Stroke;
import java.io.IOException;
import java.util.Locale;

/**
 * @noinspection HardCodedStringLiteral
 */
public class StyleWriterUtility {
    private static final Log logger = LogFactory.getLog(StyleWriterUtility.class);

    private static FastDecimalFormat getPercentageLengthFormat() {
        return new FastDecimalFormat("0.###'%'", Locale.US);
    }

    private static FastDecimalFormat getAbsoluteLengthFormat() {
        return new FastDecimalFormat("0.###", Locale.US);
    }

    private StyleWriterUtility() {
    }

    public static void writeStyleRule(final String namespace, final String tagName, final XmlWriter writer,
            final ElementStyleSheet style) throws IOException {
        if (namespace == null) {
            throw new NullPointerException();
        }
        if (tagName == null) {
            throw new NullPointerException();
        }
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }

        if (style.getDefinedPropertyNamesArray().length == 0) {
            return;
        }

        final AttributeList attList = new AttributeList();
        writer.writeTag(namespace, tagName, attList, XmlWriterSupport.OPEN);

        final BundleStyleSetWriteHandler[] writeHandlers = BundleStyleRegistry.getInstance().getWriteHandlers();
        for (int i = 0; i < writeHandlers.length; i++) {
            final BundleStyleSetWriteHandler writeHandler = writeHandlers[i];
            writeHandler.writeStyle(writer, style);
        }

        writer.writeCloseTag();
    }

    public static void writeBorderStyles(final XmlWriter writer, final ElementStyleSheet style) throws IOException {
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }

        final AttributeList bandStyleAtts = new AttributeList();

        if (style.isLocalKey(ElementStyleKeys.BACKGROUND_COLOR)) {
            final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BACKGROUND_COLOR);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "background-color",
                    ColorValueConverter.colorToString(value));
        }

        final FastDecimalFormat absoluteLengthFormat = getAbsoluteLengthFormat();
        if (style.isLocalKey(ElementStyleKeys.PADDING_TOP) && style.isLocalKey(ElementStyleKeys.PADDING_LEFT)
                && style.isLocalKey(ElementStyleKeys.PADDING_BOTTOM)
                && style.isLocalKey(ElementStyleKeys.PADDING_RIGHT)) {
            final double paddingTop = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_TOP, 0);
            final double paddingLeft = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_LEFT, 0);
            final double paddingBottom = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_BOTTOM, 0);
            final double paddingRight = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_RIGHT, 0);
            if (paddingTop == paddingLeft && paddingTop == paddingRight && paddingTop == paddingBottom) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding",
                        absoluteLengthFormat.format(paddingTop));
            } else {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-top",
                        absoluteLengthFormat.format(paddingTop));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-left",
                        absoluteLengthFormat.format(paddingLeft));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-bottom",
                        absoluteLengthFormat.format(paddingBottom));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-right",
                        absoluteLengthFormat.format(paddingRight));
            }
        } else {
            if (style.isLocalKey(ElementStyleKeys.PADDING_TOP)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_TOP, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-top",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.PADDING_LEFT)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_LEFT, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-left",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.PADDING_BOTTOM)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_BOTTOM, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-bottom",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.PADDING_RIGHT)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_RIGHT, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-right",
                        absoluteLengthFormat.format(value));
            }
        }

        if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_WIDTH)
                && style.isLocalKey(ElementStyleKeys.BORDER_LEFT_WIDTH)
                && style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_WIDTH)
                && style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_WIDTH)) {
            final double top = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_WIDTH, 0);
            final double left = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_LEFT_WIDTH, 0);
            final double bottom = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_WIDTH, 0);
            final double right = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_RIGHT_WIDTH, 0);
            if (top == left && top == right && top == bottom) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-width",
                        absoluteLengthFormat.format(top));
            } else {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-width",
                        absoluteLengthFormat.format(top));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-width",
                        absoluteLengthFormat.format(left));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-width",
                        absoluteLengthFormat.format(bottom));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-width",
                        absoluteLengthFormat.format(right));
            }
        } else {
            if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_WIDTH)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_WIDTH, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-width",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_LEFT_WIDTH)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_LEFT_WIDTH, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-width",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_WIDTH)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_WIDTH, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-width",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_WIDTH)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_RIGHT_WIDTH, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-width",
                        absoluteLengthFormat.format(value));
            }
        }
        if (style.isLocalKey(ElementStyleKeys.BORDER_BREAK_WIDTH)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BREAK_WIDTH, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-break-width",
                    absoluteLengthFormat.format(value));
        }

        if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_COLOR)
                && style.isLocalKey(ElementStyleKeys.BORDER_LEFT_COLOR)
                && style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_COLOR)
                && style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_COLOR)) {
            final Color top = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_TOP_COLOR);
            final Color left = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_LEFT_COLOR);
            final Color bottom = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_BOTTOM_COLOR);
            final Color right = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_RIGHT_COLOR);
            if (ObjectUtilities.equal(top, left) && ObjectUtilities.equal(top, right)
                    && ObjectUtilities.equal(top, bottom)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-color",
                        ColorValueConverter.colorToString(top));
            } else {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-color",
                        ColorValueConverter.colorToString(top));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-color",
                        ColorValueConverter.colorToString(left));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-color",
                        ColorValueConverter.colorToString(bottom));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-color",
                        ColorValueConverter.colorToString(right));
            }
        } else {
            if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_COLOR)) {
                final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_TOP_COLOR);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-color",
                        ColorValueConverter.colorToString(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_LEFT_COLOR)) {
                final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_LEFT_COLOR);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-color",
                        ColorValueConverter.colorToString(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_COLOR)) {
                final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_BOTTOM_COLOR);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-color",
                        ColorValueConverter.colorToString(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_COLOR)) {
                final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_RIGHT_COLOR);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-color",
                        ColorValueConverter.colorToString(value));
            }
        }
        if (style.isLocalKey(ElementStyleKeys.BORDER_BREAK_COLOR)) {
            final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_BREAK_COLOR);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-break-color",
                    ColorValueConverter.colorToString(value));
        }

        if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_STYLE)
                && style.isLocalKey(ElementStyleKeys.BORDER_LEFT_STYLE)
                && style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_STYLE)
                && style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_STYLE)) {
            final Object top = style.getStyleProperty(ElementStyleKeys.BORDER_TOP_STYLE);
            final Object left = style.getStyleProperty(ElementStyleKeys.BORDER_LEFT_STYLE);
            final Object bottom = style.getStyleProperty(ElementStyleKeys.BORDER_BOTTOM_STYLE);
            final Object right = style.getStyleProperty(ElementStyleKeys.BORDER_RIGHT_STYLE);
            if (ObjectUtilities.equal(top, left) && ObjectUtilities.equal(top, right)
                    && ObjectUtilities.equal(top, bottom)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-style", top.toString());
            } else {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-style", top.toString());
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-style", left.toString());
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-style", bottom.toString());
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-style", right.toString());
            }
        } else {
            if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_STYLE)) {
                final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_TOP_STYLE);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-style", value.toString());
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_LEFT_STYLE)) {
                final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_LEFT_STYLE);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-style", value.toString());
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_STYLE)) {
                final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_BOTTOM_STYLE);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-style", value.toString());
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_STYLE)) {
                final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_RIGHT_STYLE);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-style", value.toString());
            }
        }
        if (style.isLocalKey(ElementStyleKeys.BORDER_BREAK_STYLE)) {
            final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_BREAK_STYLE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-break-style", value.toString());
        }

        if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_WIDTH)
                && style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_WIDTH)
                && style.isLocalKey(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_WIDTH)
                && style.isLocalKey(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_WIDTH)) {
            final double bottomLeft = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_WIDTH,
                    0);
            final double bottomRight = style
                    .getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_WIDTH, 0);
            final double topLeft = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_WIDTH, 0);
            final double topRight = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_WIDTH, 0);
            if (bottomLeft == bottomRight && bottomLeft == topRight && bottomLeft == topLeft) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-radius-width",
                        absoluteLengthFormat.format(bottomLeft));
            } else {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-left-radius-width",
                        absoluteLengthFormat.format(topLeft));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-right-radius-width",
                        absoluteLengthFormat.format(topRight));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-left-radius-width",
                        absoluteLengthFormat.format(bottomLeft));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-right-radius-width",
                        absoluteLengthFormat.format(bottomRight));
            }
        } else {
            if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_WIDTH)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_WIDTH, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-left-radius-width",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_WIDTH)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_WIDTH,
                        0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-right-radius-width",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_WIDTH)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_WIDTH,
                        0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-left-radius-width",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_WIDTH)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_WIDTH,
                        0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-right-radius-width",
                        absoluteLengthFormat.format(value));
            }
        }

        if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_HEIGHT)
                && style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_HEIGHT)
                && style.isLocalKey(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_HEIGHT)
                && style.isLocalKey(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_HEIGHT)) {
            final double bottomLeft = style
                    .getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_HEIGHT, 0);
            final double bottomRight = style
                    .getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_HEIGHT, 0);
            final double topLeft = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_HEIGHT, 0);
            final double topRight = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_HEIGHT,
                    0);
            if (bottomLeft == bottomRight && bottomLeft == topRight && bottomLeft == topLeft) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-radius-height",
                        absoluteLengthFormat.format(bottomLeft));
            } else {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-left-radius-height",
                        absoluteLengthFormat.format(topLeft));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-right-radius-height",
                        absoluteLengthFormat.format(topRight));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-left-radius-height",
                        absoluteLengthFormat.format(bottomLeft));
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-right-radius-height",
                        absoluteLengthFormat.format(bottomRight));
            }
        } else {
            if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_HEIGHT)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_HEIGHT,
                        0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-left-radius-height",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_HEIGHT)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_HEIGHT,
                        0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-right-radius-height",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_HEIGHT)) {
                final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_HEIGHT,
                        0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-left-radius-height",
                        absoluteLengthFormat.format(value));
            }
            if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_HEIGHT)) {
                final double value = style
                        .getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_HEIGHT, 0);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-right-radius-height",
                        absoluteLengthFormat.format(value));
            }
        }

        if (bandStyleAtts.isEmpty() == false) {
            writer.writeTag(BundleNamespaces.STYLE, "border-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
        }
    }

    public static void writeSpatialStyles(final XmlWriter writer, final ElementStyleSheet style)
            throws IOException {
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }

        final AttributeList bandStyleAtts = new AttributeList();
        if (style.isLocalKey(ElementStyleKeys.POS_X)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.POS_X, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "x", formatLength(value));
        }
        if (style.isLocalKey(ElementStyleKeys.POS_Y)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.POS_Y, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "y", formatLength(value));
        }
        if (style.isLocalKey(ElementStyleKeys.MIN_WIDTH)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.MIN_WIDTH, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "min-width", formatLength(value));
        }
        if (style.isLocalKey(ElementStyleKeys.MIN_HEIGHT)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.MIN_HEIGHT, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "min-height", formatLength(value));
        }
        if (style.isLocalKey(ElementStyleKeys.WIDTH)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.WIDTH, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "width", formatLength(value));
        }
        if (style.isLocalKey(ElementStyleKeys.HEIGHT)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.HEIGHT, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "height", formatLength(value));
        }
        if (style.isLocalKey(ElementStyleKeys.MAX_WIDTH)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.MAX_WIDTH, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "max-width", formatLength(value));
        }
        if (style.isLocalKey(ElementStyleKeys.MAX_HEIGHT)) {
            final double value = style.getDoubleStyleProperty(ElementStyleKeys.MAX_HEIGHT, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "max-height", formatLength(value));
        }
        if (bandStyleAtts.isEmpty() == false) {
            writer.writeTag(BundleNamespaces.STYLE, "spatial-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
        }
    }

    public static void writeTextStyles(final XmlWriter writer, final ElementStyleSheet style) throws IOException {
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }

        final AttributeList bandStyleAtts = new AttributeList();
        if (style.isLocalKey(TextStyleKeys.FONT)) {
            final String value = (String) style.getStyleProperty(TextStyleKeys.FONT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "font-face", value);
        }
        if (style.isLocalKey(TextStyleKeys.BOLD)) {
            final boolean value = style.getBooleanStyleProperty(TextStyleKeys.BOLD);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "bold", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.ITALIC)) {
            final boolean value = style.getBooleanStyleProperty(TextStyleKeys.ITALIC);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "italic", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.EMBEDDED_FONT)) {
            final boolean value = style.getBooleanStyleProperty(TextStyleKeys.EMBEDDED_FONT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "embedded", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.UNDERLINED)) {
            final boolean value = style.getBooleanStyleProperty(TextStyleKeys.UNDERLINED);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "underline", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.STRIKETHROUGH)) {
            final boolean value = style.getBooleanStyleProperty(TextStyleKeys.STRIKETHROUGH);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "strikethrough", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.EXCEL_WRAP_TEXT)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.EXCEL_WRAP_TEXT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "excel-text-wrapping", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.EXCEL_INDENTION)) {
            final int value = style.getIntStyleProperty(ElementStyleKeys.EXCEL_INDENTION, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "excel-text-indention", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.TRIM_TEXT_CONTENT)) {
            final boolean value = style.getBooleanStyleProperty(TextStyleKeys.TRIM_TEXT_CONTENT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "trim-text-content", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.FONTENCODING)) {
            final String value = (String) style.getStyleProperty(TextStyleKeys.FONTENCODING);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "encoding", value);
        }
        if (style.isLocalKey(TextStyleKeys.RESERVED_LITERAL)) {
            final String value = (String) style.getStyleProperty(TextStyleKeys.RESERVED_LITERAL);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "ellipsis", value);
        }
        if (style.isLocalKey(TextStyleKeys.FONTSIZE)) {
            final int value = style.getIntStyleProperty(TextStyleKeys.FONTSIZE, 0);
            if (value > 0) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "font-size", String.valueOf(value));
            }
        }
        if (style.isLocalKey(TextStyleKeys.LINEHEIGHT)) {
            final double value = style.getDoubleStyleProperty(TextStyleKeys.LINEHEIGHT, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "line-height", formatLength(value));
        }
        if (style.isLocalKey(TextStyleKeys.WORD_SPACING)) {
            final int value = style.getIntStyleProperty(TextStyleKeys.WORD_SPACING, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "word-spacing", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.X_MIN_LETTER_SPACING)) {
            final int value = style.getIntStyleProperty(TextStyleKeys.X_MIN_LETTER_SPACING, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "min-letter-spacing", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.X_OPTIMUM_LETTER_SPACING)) {
            final int value = style.getIntStyleProperty(TextStyleKeys.X_OPTIMUM_LETTER_SPACING, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "optimum-letter-spacing", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.X_MAX_LETTER_SPACING)) {
            final int value = style.getIntStyleProperty(TextStyleKeys.X_MAX_LETTER_SPACING, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "max-letter-spacing", String.valueOf(value));
        }
        if (style.isLocalKey(TextStyleKeys.FONT_SMOOTH)) {
            final Object value = style.getStyleProperty(TextStyleKeys.FONT_SMOOTH);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "font-smooth", value.toString());
        }
        if (style.isLocalKey(TextStyleKeys.TEXT_WRAP)) {
            final Object value = style.getStyleProperty(TextStyleKeys.TEXT_WRAP);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "text-wrap", value.toString());
        }
        if (style.isLocalKey(TextStyleKeys.WORDBREAK)) {
            final Object value = style.getStyleProperty(TextStyleKeys.WORDBREAK);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "word-break", value.toString());
        }
        if (style.isLocalKey(TextStyleKeys.DIRECTION)) {
            final Object value = style.getStyleProperty(TextStyleKeys.DIRECTION);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "direction", value.toString());
        }
        if (style.isLocalKey(TextStyleKeys.WHITE_SPACE_COLLAPSE)) {
            final Object value = style.getStyleProperty(TextStyleKeys.WHITE_SPACE_COLLAPSE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "whitespace-collapse", value.toString());
        }
        if (style.isLocalKey(TextStyleKeys.VERTICAL_TEXT_ALIGNMENT)) {
            final Object value = style.getStyleProperty(TextStyleKeys.VERTICAL_TEXT_ALIGNMENT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "whitespace-collapse", value.toString());
        }
        if (style.isLocalKey(TextStyleKeys.TEXT_INDENT)) {
            final double value = style.getDoubleStyleProperty(TextStyleKeys.TEXT_INDENT, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "text-indent", formatFloat(value));
        }
        if (style.isLocalKey(TextStyleKeys.FIRST_LINE_INDENT)) {
            final double value = style.getDoubleStyleProperty(TextStyleKeys.FIRST_LINE_INDENT, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "first-line-indent", formatFloat(value));
        }
        if (bandStyleAtts.isEmpty() == false) {
            writer.writeTag(BundleNamespaces.STYLE, "text-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
        }
    }

    public static void writeContentStyles(final XmlWriter writer, final ElementStyleSheet style)
            throws IOException {
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }

        final AttributeList bandStyleAtts = new AttributeList();
        if (style.isLocalKey(ElementStyleKeys.DRAW_SHAPE)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.DRAW_SHAPE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "draw-shape", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.FILL_SHAPE)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.FILL_SHAPE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "fill-shape", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.SCALE)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.SCALE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "scale", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.KEEP_ASPECT_RATIO)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.KEEP_ASPECT_RATIO);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "keep-aspect-ratio", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.DYNAMIC_HEIGHT)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.DYNAMIC_HEIGHT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "dynamic-height", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.PAINT)) {
            final Color value = (Color) style.getStyleProperty(ElementStyleKeys.PAINT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "color", ColorValueConverter.colorToString(value));
        }
        if (style.isLocalKey(ElementStyleKeys.FILL_COLOR)) {
            final Color value = (Color) style.getStyleProperty(ElementStyleKeys.FILL_COLOR);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "fill-color",
                    ColorValueConverter.colorToString(value));
        }
        if (style.isLocalKey(ElementStyleKeys.EXCEL_DATA_FORMAT_STRING)) {
            final String value = (String) style.getStyleProperty(ElementStyleKeys.EXCEL_DATA_FORMAT_STRING);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "excel-cell-format", value);
        }
        if (style.isLocalKey(ElementStyleKeys.ANTI_ALIASING)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.ANTI_ALIASING);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "anti-aliasing", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.STROKE)) {
            final Stroke s = (Stroke) style.getStyleProperty(ElementStyleKeys.STROKE);
            final float strokeWidth = StrokeUtility.getStrokeWidth(s);
            final BorderStyle strokeType = StrokeUtility.translateStrokeStyle(s);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "stroke-weight",
                    getAbsoluteLengthFormat().format(strokeWidth));
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "stroke-style", strokeType.toString());
        }
        if (bandStyleAtts.isEmpty() == false) {
            writer.writeTag(BundleNamespaces.STYLE, "content-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
        }
    }

    public static void writeCommonStyles(final XmlWriter writer, final ElementStyleSheet style) throws IOException {
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }

        final AttributeList bandStyleAtts = new AttributeList();
        if (style.isLocalKey(ElementStyleKeys.ANCHOR_NAME)) {
            final String value = (String) style.getStyleProperty(ElementStyleKeys.ANCHOR_NAME);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "anchor-name", value);
        }
        if (style.isLocalKey(ElementStyleKeys.HREF_TARGET)) {
            final String value = (String) style.getStyleProperty(ElementStyleKeys.HREF_TARGET);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "href-target", value);
        }
        if (style.isLocalKey(ElementStyleKeys.HREF_TITLE)) {
            final String value = (String) style.getStyleProperty(ElementStyleKeys.HREF_TITLE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "href-title", value);
        }
        if (style.isLocalKey(ElementStyleKeys.HREF_WINDOW)) {
            final String value = (String) style.getStyleProperty(ElementStyleKeys.HREF_WINDOW);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "href-window", value);
        }
        if (style.isLocalKey(ElementStyleKeys.BOX_SIZING)) {
            final BoxSizing value = (BoxSizing) style.getStyleProperty(ElementStyleKeys.BOX_SIZING);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "box-sizing", value.toString());
        }
        if (style.isLocalKey(ElementStyleKeys.VISIBLE)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.VISIBLE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "visible", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.INVISIBLE_CONSUMES_SPACE)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.INVISIBLE_CONSUMES_SPACE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "invisible-consumes-space", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.WIDOWS)) {
            final int value = style.getIntStyleProperty(ElementStyleKeys.WIDOWS, -1);
            if (value >= 0) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "widows", String.valueOf(value));
            }
        }
        if (style.isLocalKey(ElementStyleKeys.ORPHANS)) {
            final int value = style.getIntStyleProperty(ElementStyleKeys.ORPHANS, -1);
            if (value >= 0) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "orphans", String.valueOf(value));
            }
        }
        if (style.isLocalKey(ElementStyleKeys.WIDOW_ORPHAN_OPT_OUT)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.WIDOW_ORPHAN_OPT_OUT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, ElementStyleKeys.WIDOW_ORPHAN_OPT_OUT.getName(),
                    String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.OVERFLOW_X)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.OVERFLOW_X);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "overflow-x", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.OVERFLOW_Y)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.OVERFLOW_Y);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "overflow-y", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.AVOID_PAGEBREAK_INSIDE)) {
            final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.AVOID_PAGEBREAK_INSIDE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "avoid-page-break", String.valueOf(value));
        }
        if (style.isLocalKey(ElementStyleKeys.ALIGNMENT)) {
            final ElementAlignment value = (ElementAlignment) style.getStyleProperty(ElementStyleKeys.ALIGNMENT);
            if (ElementAlignment.CENTER.equals(value)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "alignment", "center");
            } else if (ElementAlignment.RIGHT.equals(value)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "alignment", "right");
            } else if (ElementAlignment.JUSTIFY.equals(value)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "alignment", "justify");
            } else if (ElementAlignment.LEFT.equals(value)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "alignment", "left");
            }
        }
        if (style.isLocalKey(ElementStyleKeys.VALIGNMENT)) {
            final ElementAlignment value = (ElementAlignment) style.getStyleProperty(ElementStyleKeys.VALIGNMENT);
            if (ElementAlignment.MIDDLE.equals(value)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "vertical-alignment", "middle");
            } else if (ElementAlignment.BOTTOM.equals(value)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "vertical-alignment", "bottom");
            } else if (ElementAlignment.TOP.equals(value)) {
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "vertical-alignment", "top");
            }
        }
        if (bandStyleAtts.isEmpty() == false) {
            writer.writeTag(BundleNamespaces.STYLE, "common-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
        }
    }

    public static void writePageBandStyles(final XmlWriter writer, final ElementStyleSheet style)
            throws IOException {
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }

        final AttributeList bandStyleAtts = new AttributeList();
        if (style.isLocalKey(BandStyleKeys.REPEAT_HEADER)) {
            final boolean value = style.getBooleanStyleProperty(BandStyleKeys.REPEAT_HEADER);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "repeat", String.valueOf(value));
        }
        if (style.isLocalKey(BandStyleKeys.DISPLAY_ON_FIRSTPAGE)) {
            final boolean value = style.getBooleanStyleProperty(BandStyleKeys.DISPLAY_ON_FIRSTPAGE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "display-on-first-page", String.valueOf(value));
        }
        if (style.isLocalKey(BandStyleKeys.DISPLAY_ON_LASTPAGE)) {
            final boolean value = style.getBooleanStyleProperty(BandStyleKeys.DISPLAY_ON_LASTPAGE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "display-on-last-page", String.valueOf(value));
        }
        if (style.isLocalKey(BandStyleKeys.STICKY)) {
            final boolean value = style.getBooleanStyleProperty(BandStyleKeys.STICKY);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "sticky", String.valueOf(value));
        }
        if (style.isLocalKey(BandStyleKeys.FIXED_POSITION)) {
            final double value = style.getDoubleStyleProperty(BandStyleKeys.FIXED_POSITION, 0);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "fixed-position", formatLength(value));
        }
        if (bandStyleAtts.isEmpty() == false) {
            writer.writeTag(BundleNamespaces.STYLE, "page-band-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
        }
    }

    private static String formatFloat(final double value) {
        return getAbsoluteLengthFormat().format(value);
    }

    private static String formatLength(final double value) {
        if (value >= 0) {
            return getAbsoluteLengthFormat().format(value);
        } else {
            return getPercentageLengthFormat().format(-value);
        }
    }

    public static void writeBandStyles(final XmlWriter writer, final ElementStyleSheet style) throws IOException {
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }

        final AttributeList bandStyleAtts = new AttributeList();
        if (style.isLocalKey(BandStyleKeys.COMPUTED_SHEETNAME)) {
            final String value = (String) style.getStyleProperty(BandStyleKeys.COMPUTED_SHEETNAME);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "computed-sheetname", value);
        }
        if (style.isLocalKey(BandStyleKeys.BOOKMARK)) {
            final String value = (String) style.getStyleProperty(BandStyleKeys.BOOKMARK);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "bookmark", value);
        }
        if (style.isLocalKey(BandStyleKeys.PAGEBREAK_BEFORE)) {
            final boolean value = style.getBooleanStyleProperty(BandStyleKeys.PAGEBREAK_BEFORE);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "pagebreak-before", String.valueOf(value));
        }
        if (style.isLocalKey(BandStyleKeys.PAGEBREAK_AFTER)) {
            final boolean value = style.getBooleanStyleProperty(BandStyleKeys.PAGEBREAK_AFTER);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "pagebreak-after", String.valueOf(value));
        }
        if (style.isLocalKey(BandStyleKeys.LAYOUT)) {
            final String value = (String) style.getStyleProperty(BandStyleKeys.LAYOUT);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "layout", String.valueOf(value));
        }
        if (style.isLocalKey(BandStyleKeys.TABLE_LAYOUT)) {
            try {
                final TableLayout value = (TableLayout) style.getStyleProperty(BandStyleKeys.TABLE_LAYOUT);
                final String valueAsString = ConverterRegistry.toAttributeValue(value);
                bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "table-layout", valueAsString);
            } catch (BeanException e) {
                throw new IOException("Style 'table-layout' could not be written.");
            }
        }
        if (bandStyleAtts.isEmpty() == false) {
            writer.writeTag(BundleNamespaces.STYLE, "band-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
        }
    }

    public static void writeRotationStyles(final XmlWriter writer, final ElementStyleSheet style)
            throws IOException {
        if (writer == null) {
            throw new NullPointerException();
        }
        if (style == null) {
            throw new NullPointerException();
        }
        final AttributeList bandStyleAtts = new AttributeList();
        if (style.isLocalKey(TextStyleKeys.TEXT_ROTATION)) {
            final Object value = style.getStyleProperty(TextStyleKeys.TEXT_ROTATION);
            bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "rotation", value.toString());
        }
        if (bandStyleAtts.isEmpty() == false) {
            writer.writeTag(BundleNamespaces.STYLE, "rotation-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
        }
    }
}