You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by jo...@apache.org on 2009/05/19 18:29:53 UTC

svn commit: r776377 [5/6] - in /poi/trunk/src/java/org/apache/poi: ddf/ hssf/model/ hssf/record/ hssf/record/aggregates/ hssf/record/cont/ hssf/record/formula/ hssf/record/formula/eval/ hssf/usermodel/ hssf/util/ poifs/dev/ ss/ ss/formula/ ss/formula/e...

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/ClientAnchor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/ClientAnchor.java?rev=776377&r1=776376&r2=776377&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/ClientAnchor.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/ClientAnchor.java Tue May 19 16:29:51 2009
@@ -1,202 +1,202 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.ss.usermodel;
-
-/**
- * A client anchor is attached to an excel worksheet.  It anchors against a
- * top-left and bottom-right cell.
- *
- * @author Yegor Kozlov
- */
-public interface ClientAnchor {
-    /**
-     * Move and Resize With Anchor Cells
-     * <p>
-     * Specifies that the current drawing shall move and
-     * resize to maintain its row and column anchors (i.e. the
-     * object is anchored to the actual from and to row and column)
-     * </p>
-     */
-    public static final int MOVE_AND_RESIZE = 0;
-
-    /**
-     * Move With Cells but Do Not Resize
-     * <p>
-     * Specifies that the current drawing shall move with its
-     * row and column (i.e. the object is anchored to the
-     * actual from row and column), but that the size shall remain absolute.
-     * </p>
-     * <p>
-     * If additional rows/columns are added between the from and to locations of the drawing,
-     * the drawing shall move its to anchors as needed to maintain this same absolute size.
-     * </p>
-     */
-    public static final int MOVE_DONT_RESIZE = 2;
-
-    /**
-     * Do Not Move or Resize With Underlying Rows/Columns
-     * <p>
-     * Specifies that the current start and end positions shall
-     * be maintained with respect to the distances from the
-     * absolute start point of the worksheet.
-     * </p>
-     * <p>
-     * If additional rows/columns are added before the
-     * drawing, the drawing shall move its anchors as needed
-     * to maintain this same absolute position.
-     * </p>
-     */
-    public static final int DONT_MOVE_AND_RESIZE = 3;
-
-    /**
-     * Returns the column (0 based) of the first cell.
-     *
-     * @return 0-based column of the first cell.
-     */
-    public short getCol1();
-
-    /**
-     * Sets the column (0 based) of the first cell.
-     *
-     * @param col1 0-based column of the first cell.
-     */
-    public void setCol1(int col1);
-
-    /**
-     * Returns the column (0 based) of the second cell.
-     *
-     * @return 0-based column of the second cell.
-     */
-    public short getCol2();
-
-    /**
-     * Returns the column (0 based) of the second cell.
-     *
-     * @param col2 0-based column of the second cell.
-     */
-    public void setCol2(int col2);
-
-    /**
-     * Returns the row (0 based) of the first cell.
-     *
-     * @return 0-based row of the first cell.
-     */
-    public int getRow1();
-
-    /**
-     * Returns the row (0 based) of the first cell.
-     *
-     * @param row1 0-based row of the first cell.
-     */
-    public void setRow1(int row1);
-
-    /**
-     * Returns the row (0 based) of the second cell.
-     *
-     * @return 0-based row of the second cell.
-     */
-    public int getRow2();
-
-    /**
-     * Returns the row (0 based) of the first cell.
-     *
-     * @param row2 0-based row of the first cell.
-     */
-    public void setRow2(int row2);
-
-    /**
-     * Returns the x coordinate within the first cell
-     *
-     * @return the x coordinate within the first cell
-     */
-    public int getDx1();
-
-    /**
-     * Sets the x coordinate within the first cell
-     *
-     * @param dx1 the x coordinate within the first cell
-     */
-    public void setDx1(int dx1);
-
-    /**
-     * Returns the y coordinate within the first cell
-     *
-     * @return the y coordinate within the first cell
-     */
-    public int getDy1();
-
-    /**
-     * Sets the y coordinate within the first cell
-     *
-     * @param dy1 the y coordinate within the first cell
-     */
-    public void setDy1(int dy1);
-
-    /**
-     * Sets the y coordinate within the second cell
-     *
-     * @return the y coordinate within the second cell
-     */
-    public int getDy2();
-
-    /**
-     * Sets the y coordinate within the second cell
-     *
-     * @param dy2 the y coordinate within the second cell
-     */
-    public void setDy2(int dy2);
-
-    /**
-     * Returns the x coordinate within the second cell
-     *
-     * @return the x coordinate within the second cell
-     */
-    public int getDx2();
-
-    /**
-     * Sets the x coordinate within the second cell
-     *
-     * @param dx2 the x coordinate within the second cell
-     */
-    public void setDx2(int dx2);
-
-
-    /**
-     * Sets the anchor type
-     * <p>
-     * 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
-     * </p>
-     * @param anchorType the anchor type
-     * @see #MOVE_AND_RESIZE
-     * @see #MOVE_DONT_RESIZE
-     * @see #DONT_MOVE_AND_RESIZE
-     */
-    public void setAnchorType( int anchorType );
-
-    /**
-     * Gets the anchor type
-     * <p>
-     * 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
-     * </p>
-     * @return the anchor type
-     * @see #MOVE_AND_RESIZE
-     * @see #MOVE_DONT_RESIZE
-     * @see #DONT_MOVE_AND_RESIZE
-     */
-    public int getAnchorType();
-
-}
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.ss.usermodel;
+
+/**
+ * A client anchor is attached to an excel worksheet.  It anchors against a
+ * top-left and bottom-right cell.
+ *
+ * @author Yegor Kozlov
+ */
+public interface ClientAnchor {
+    /**
+     * Move and Resize With Anchor Cells
+     * <p>
+     * Specifies that the current drawing shall move and
+     * resize to maintain its row and column anchors (i.e. the
+     * object is anchored to the actual from and to row and column)
+     * </p>
+     */
+    public static final int MOVE_AND_RESIZE = 0;
+
+    /**
+     * Move With Cells but Do Not Resize
+     * <p>
+     * Specifies that the current drawing shall move with its
+     * row and column (i.e. the object is anchored to the
+     * actual from row and column), but that the size shall remain absolute.
+     * </p>
+     * <p>
+     * If additional rows/columns are added between the from and to locations of the drawing,
+     * the drawing shall move its to anchors as needed to maintain this same absolute size.
+     * </p>
+     */
+    public static final int MOVE_DONT_RESIZE = 2;
+
+    /**
+     * Do Not Move or Resize With Underlying Rows/Columns
+     * <p>
+     * Specifies that the current start and end positions shall
+     * be maintained with respect to the distances from the
+     * absolute start point of the worksheet.
+     * </p>
+     * <p>
+     * If additional rows/columns are added before the
+     * drawing, the drawing shall move its anchors as needed
+     * to maintain this same absolute position.
+     * </p>
+     */
+    public static final int DONT_MOVE_AND_RESIZE = 3;
+
+    /**
+     * Returns the column (0 based) of the first cell.
+     *
+     * @return 0-based column of the first cell.
+     */
+    public short getCol1();
+
+    /**
+     * Sets the column (0 based) of the first cell.
+     *
+     * @param col1 0-based column of the first cell.
+     */
+    public void setCol1(int col1);
+
+    /**
+     * Returns the column (0 based) of the second cell.
+     *
+     * @return 0-based column of the second cell.
+     */
+    public short getCol2();
+
+    /**
+     * Returns the column (0 based) of the second cell.
+     *
+     * @param col2 0-based column of the second cell.
+     */
+    public void setCol2(int col2);
+
+    /**
+     * Returns the row (0 based) of the first cell.
+     *
+     * @return 0-based row of the first cell.
+     */
+    public int getRow1();
+
+    /**
+     * Returns the row (0 based) of the first cell.
+     *
+     * @param row1 0-based row of the first cell.
+     */
+    public void setRow1(int row1);
+
+    /**
+     * Returns the row (0 based) of the second cell.
+     *
+     * @return 0-based row of the second cell.
+     */
+    public int getRow2();
+
+    /**
+     * Returns the row (0 based) of the first cell.
+     *
+     * @param row2 0-based row of the first cell.
+     */
+    public void setRow2(int row2);
+
+    /**
+     * Returns the x coordinate within the first cell
+     *
+     * @return the x coordinate within the first cell
+     */
+    public int getDx1();
+
+    /**
+     * Sets the x coordinate within the first cell
+     *
+     * @param dx1 the x coordinate within the first cell
+     */
+    public void setDx1(int dx1);
+
+    /**
+     * Returns the y coordinate within the first cell
+     *
+     * @return the y coordinate within the first cell
+     */
+    public int getDy1();
+
+    /**
+     * Sets the y coordinate within the first cell
+     *
+     * @param dy1 the y coordinate within the first cell
+     */
+    public void setDy1(int dy1);
+
+    /**
+     * Sets the y coordinate within the second cell
+     *
+     * @return the y coordinate within the second cell
+     */
+    public int getDy2();
+
+    /**
+     * Sets the y coordinate within the second cell
+     *
+     * @param dy2 the y coordinate within the second cell
+     */
+    public void setDy2(int dy2);
+
+    /**
+     * Returns the x coordinate within the second cell
+     *
+     * @return the x coordinate within the second cell
+     */
+    public int getDx2();
+
+    /**
+     * Sets the x coordinate within the second cell
+     *
+     * @param dx2 the x coordinate within the second cell
+     */
+    public void setDx2(int dx2);
+
+
+    /**
+     * Sets the anchor type
+     * <p>
+     * 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
+     * </p>
+     * @param anchorType the anchor type
+     * @see #MOVE_AND_RESIZE
+     * @see #MOVE_DONT_RESIZE
+     * @see #DONT_MOVE_AND_RESIZE
+     */
+    public void setAnchorType( int anchorType );
+
+    /**
+     * Gets the anchor type
+     * <p>
+     * 0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
+     * </p>
+     * @return the anchor type
+     * @see #MOVE_AND_RESIZE
+     * @see #MOVE_DONT_RESIZE
+     * @see #DONT_MOVE_AND_RESIZE
+     */
+    public int getAnchorType();
+
+}

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java?rev=776377&r1=776376&r2=776377&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/DataFormatter.java Tue May 19 16:29:51 2009
@@ -1,665 +1,665 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.ss.usermodel;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-import java.util.*;
-import java.text.*;
-
-/**
- * DataFormatter contains methods for formatting the value stored in an
- * Cell. This can be useful for reports and GUI presentations when you
- * need to display data exactly as it appears in Excel. Supported formats
- * include currency, SSN, percentages, decimals, dates, phone numbers, zip
- * codes, etc.
- * <p>
- * Internally, formats will be implemented using subclasses of {@link Format}
- * such as {@link DecimalFormat} and {@link SimpleDateFormat}. Therefore the
- * formats used by this class must obey the same pattern rules as these Format
- * subclasses. This means that only legal number pattern characters ("0", "#",
- * ".", "," etc.) may appear in number formats. Other characters can be
- * inserted <em>before</em> or <em> after</em> the number pattern to form a
- * prefix or suffix.
- * </p>
- * <p>
- * For example the Excel pattern <code>"$#,##0.00 "USD"_);($#,##0.00 "USD")"
- * </code> will be correctly formatted as "$1,000.00 USD" or "($1,000.00 USD)".
- * However the pattern <code>"00-00-00"</code> is incorrectly formatted by
- * DecimalFormat as "000000--". For Excel formats that are not compatible with
- * DecimalFormat, you can provide your own custom {@link Format} implementation
- * via <code>DataFormatter.addFormat(String,Format)</code>. The following
- * custom formats are already provided by this class:
- * </p>
- * <pre>
- * <ul><li>SSN "000-00-0000"</li>
- *     <li>Phone Number "(###) ###-####"</li>
- *     <li>Zip plus 4 "00000-0000"</li>
- * </ul>
- * </pre>
- * <p>
- * If the Excel format pattern cannot be parsed successfully, then a default
- * format will be used. The default number format will mimic the Excel General
- * format: "#" for whole numbers and "#.##########" for decimal numbers. You
- * can override the default format pattern with <code>
- * DataFormatter.setDefaultNumberFormat(Format)</code>. <b>Note:</b> the
- * default format will only be used when a Format cannot be created from the
- * cell's data format string.
- *
- * @author James May (james dot may at fmr dot com)
- *
- */
-public class DataFormatter {
-
-    /** Pattern to find a number format: "0" or  "#" */
-    private static final Pattern numPattern = Pattern.compile("[0#]+");
-
-    /** Pattern to find days of week as text "ddd...." */
-    private static final Pattern daysAsText = Pattern.compile("([d]{3,})", Pattern.CASE_INSENSITIVE);
-
-    /** Pattern to find "AM/PM" marker */
-    private static final Pattern amPmPattern = Pattern.compile("((A|P)[M/P]*)", Pattern.CASE_INSENSITIVE);
-
-    /** A regex to find patterns like [$$-1009] and [$?-452]. */
-    private static final Pattern specialPatternGroup = Pattern.compile("(\\[\\$[^-\\]]*-[0-9A-Z]+\\])");
-
-    /** <em>General</em> format for whole numbers. */
-    private static final Format generalWholeNumFormat = new DecimalFormat("#");
-
-    /** <em>General</em> format for decimal numbers. */
-    private static final Format generalDecimalNumFormat = new DecimalFormat("#.##########");
-
-    /** A default format to use when a number pattern cannot be parsed. */
-    private Format defaultNumFormat;
-
-    /**
-     * A map to cache formats.
-     *  Map<String,Format> formats
-     */
-    private final Map formats;
-
-    /**
-     * Constructor
-     */
-    public DataFormatter() {
-        formats = new HashMap();
-
-        // init built-in formats
-
-        Format zipFormat = ZipPlusFourFormat.instance;
-        addFormat("00000\\-0000", zipFormat);
-        addFormat("00000-0000", zipFormat);
-
-        Format phoneFormat = PhoneFormat.instance;
-        // allow for format string variations
-        addFormat("[<=9999999]###\\-####;\\(###\\)\\ ###\\-####", phoneFormat);
-        addFormat("[<=9999999]###-####;(###) ###-####", phoneFormat);
-        addFormat("###\\-####;\\(###\\)\\ ###\\-####", phoneFormat);
-        addFormat("###-####;(###) ###-####", phoneFormat);
-
-        Format ssnFormat = SSNFormat.instance;
-        addFormat("000\\-00\\-0000", ssnFormat);
-        addFormat("000-00-0000", ssnFormat);
-    }
-
-    /**
-     * Return a Format for the given cell if one exists, otherwise try to
-     * create one. This method will return <code>null</code> if the any of the
-     * following is true:
-     * <ul>
-     * <li>the cell's style is null</li>
-     * <li>the style's data format string is null or empty</li>
-     * <li>the format string cannot be recognized as either a number or date</li>
-     * </ul>
-     *
-     * @param cell The cell to retrieve a Format for
-     * @return A Format for the format String
-     */
-    private Format getFormat(Cell cell) {
-        if ( cell.getCellStyle() == null) {
-            return null;
-        }
-
-        int formatIndex = cell.getCellStyle().getDataFormat();
-        String formatStr = cell.getCellStyle().getDataFormatString();
-        if(formatStr == null || formatStr.trim().length() == 0) {
-            return null;
-        }
-        return getFormat(cell.getNumericCellValue(), formatIndex, formatStr);
-    }
-
-    private Format getFormat(double cellValue, int formatIndex, String formatStr) {
-        Format format = (Format)formats.get(formatStr);
-        if (format != null) {
-            return format;
-        }
-        if (formatStr.equals("General") || formatStr.equals("@")) {
-            if (DataFormatter.isWholeNumber(cellValue)) {
-                return generalWholeNumFormat;
-            }
-            return generalDecimalNumFormat;
-        }
-        format = createFormat(cellValue, formatIndex, formatStr);
-        formats.put(formatStr, format);
-        return format;
-    }
-
-    /**
-     * Create and return a Format based on the format string from a  cell's
-     * style. If the pattern cannot be parsed, return a default pattern.
-     *
-     * @param cell The Excel cell
-     * @return A Format representing the excel format. May return null.
-     */
-    public Format createFormat(Cell cell) {
-
-        int formatIndex = cell.getCellStyle().getDataFormat();
-        String formatStr = cell.getCellStyle().getDataFormatString();
-        return createFormat(cell.getNumericCellValue(), formatIndex, formatStr);
-    }
-
-    private Format createFormat(double cellValue, int formatIndex, String sFormat) {
-        // remove color formatting if present
-        String formatStr = sFormat.replaceAll("\\[[a-zA-Z]*\\]", "");
-
-        // try to extract special characters like currency
-        Matcher m = specialPatternGroup.matcher(formatStr);
-        while(m.find()) {
-            String match = m.group();
-            String symbol = match.substring(match.indexOf('$') + 1, match.indexOf('-'));
-            if (symbol.indexOf('$') > -1) {
-                StringBuffer sb = new StringBuffer();
-                sb.append(symbol.substring(0, symbol.indexOf('$')));
-                sb.append('\\');
-                sb.append(symbol.substring(symbol.indexOf('$'), symbol.length()));
-                symbol = sb.toString();
-            }
-            formatStr = m.replaceAll(symbol);
-            m = specialPatternGroup.matcher(formatStr);
-        }
-
-        if(formatStr == null || formatStr.trim().length() == 0) {
-            return getDefaultFormat(cellValue);
-        }
-
-
-        if(DateUtil.isADateFormat(formatIndex,formatStr) &&
-                DateUtil.isValidExcelDate(cellValue)) {
-            return createDateFormat(formatStr, cellValue);
-        }
-        if (numPattern.matcher(formatStr).find()) {
-            return createNumberFormat(formatStr, cellValue);
-        }
-        // TODO - when does this occur?
-        return null;
-    }
-
-    private Format createDateFormat(String pFormatStr, double cellValue) {
-        String formatStr = pFormatStr;
-        formatStr = formatStr.replaceAll("\\\\-","-");
-        formatStr = formatStr.replaceAll("\\\\,",",");
-        formatStr = formatStr.replaceAll("\\\\ "," ");
-        formatStr = formatStr.replaceAll(";@", "");
-        boolean hasAmPm = false;
-        Matcher amPmMatcher = amPmPattern.matcher(formatStr);
-        while (amPmMatcher.find()) {
-            formatStr = amPmMatcher.replaceAll("@");
-            hasAmPm = true;
-            amPmMatcher = amPmPattern.matcher(formatStr);
-        }
-        formatStr = formatStr.replaceAll("@", "a");
-
-
-        Matcher dateMatcher = daysAsText.matcher(formatStr);
-        if (dateMatcher.find()) {
-            String match = dateMatcher.group(0);
-            formatStr = dateMatcher.replaceAll(match.toUpperCase().replaceAll("D", "E"));
-        }
-
-        // Convert excel date format to SimpleDateFormat.
-        // Excel uses lower case 'm' for both minutes and months.
-        // From Excel help:
-        /*
-            The "m" or "mm" code must appear immediately after the "h" or"hh"
-            code or immediately before the "ss" code; otherwise, Microsoft
-            Excel displays the month instead of minutes."
-          */
-
-        StringBuffer sb = new StringBuffer();
-        char[] chars = formatStr.toCharArray();
-        boolean mIsMonth = true;
-        List ms = new ArrayList();
-        for(int j=0; j<chars.length; j++) {
-            char c = chars[j];
-            if (c == 'h' || c == 'H') {
-                mIsMonth = false;
-                if (hasAmPm) {
-                    sb.append('h');
-                } else {
-                    sb.append('H');
-                }
-            }
-            else if (c == 'm') {
-                if(mIsMonth) {
-                    sb.append('M');
-                    ms.add(
-                            new Integer(sb.length() -1)
-                    );
-                } else {
-                    sb.append('m');
-                }
-            }
-            else if (c == 's' || c == 'S') {
-                sb.append('s');
-                // if 'M' precedes 's' it should be minutes ('m')
-                for (int i = 0; i < ms.size(); i++) {
-                    int index = ((Integer)ms.get(i)).intValue();
-                    if (sb.charAt(index) == 'M') {
-                        sb.replace(index, index+1, "m");
-                    }
-                }
-                mIsMonth = true;
-                ms.clear();
-            }
-            else if (Character.isLetter(c)) {
-                mIsMonth = true;
-                ms.clear();
-                if (c == 'y' || c == 'Y') {
-                    sb.append('y');
-                }
-                else if (c == 'd' || c == 'D') {
-                    sb.append('d');
-                }
-                else {
-                    sb.append(c);
-                }
-            }
-            else {
-                sb.append(c);
-            }
-        }
-        formatStr = sb.toString();
-
-        try {
-            return new SimpleDateFormat(formatStr);
-        } catch(IllegalArgumentException iae) {
-
-            // the pattern could not be parsed correctly,
-            // so fall back to the default number format
-            return getDefaultFormat(cellValue);
-        }
-
-    }
-
-    private Format createNumberFormat(String formatStr, double cellValue) {
-        StringBuffer sb = new StringBuffer(formatStr);
-        for (int i = 0; i < sb.length(); i++) {
-            char c = sb.charAt(i);
-            //handle (#,##0_);
-            if (c == '(') {
-                int idx = sb.indexOf(")", i);
-                if (idx > -1 && sb.charAt(idx -1) == '_') {
-                    sb.deleteCharAt(idx);
-                    sb.deleteCharAt(idx - 1);
-                    sb.deleteCharAt(i);
-                    i--;
-                }
-            } else if (c == ')' && i > 0 && sb.charAt(i - 1) == '_') {
-                sb.deleteCharAt(i);
-                sb.deleteCharAt(i - 1);
-                i--;
-            // remove quotes and back slashes
-            } else if (c == '\\' || c == '"') {
-                sb.deleteCharAt(i);
-                i--;
-
-            // for scientific/engineering notation
-            } else if (c == '+' && i > 0 && sb.charAt(i - 1) == 'E') {
-                sb.deleteCharAt(i);
-                i--;
-            }
-        }
-
-        try {
-            return new DecimalFormat(sb.toString());
-        } catch(IllegalArgumentException iae) {
-
-            // the pattern could not be parsed correctly,
-            // so fall back to the default number format
-            return getDefaultFormat(cellValue);
-        }
-    }
-
-    /**
-     * Return true if the double value represents a whole number
-     * @param d the double value to check
-     * @return <code>true</code> if d is a whole number
-     */
-    private static boolean isWholeNumber(double d) {
-        return d == Math.floor(d);
-    }
-
-    /**
-     * Returns a default format for a cell.
-     * @param cell The cell
-     * @return a default format
-     */
-    public Format getDefaultFormat(Cell cell) {
-        return getDefaultFormat(cell.getNumericCellValue());
-    }
-    private Format getDefaultFormat(double cellValue) {
-        // for numeric cells try user supplied default
-        if (defaultNumFormat != null) {
-            return defaultNumFormat;
-
-          // otherwise use general format
-        }
-        if (isWholeNumber(cellValue)){
-            return generalWholeNumFormat;
-        }
-        return generalDecimalNumFormat;
-    }
-
-    /**
-     * Returns the formatted value of an Excel date as a <tt>String</tt> based
-     * on the cell's <code>DataFormat</code>. i.e. "Thursday, January 02, 2003"
-     * , "01/02/2003" , "02-Jan" , etc.
-     *
-     * @param cell The cell
-     * @return a formatted date string
-     */
-    private String getFormattedDateString(Cell cell) {
-        Format dateFormat = getFormat(cell);
-        Date d = cell.getDateCellValue();
-        if (dateFormat != null) {
-            return dateFormat.format(d);
-        }
-        return d.toString();
-    }
-
-    /**
-     * Returns the formatted value of an Excel number as a <tt>String</tt>
-     * based on the cell's <code>DataFormat</code>. Supported formats include
-     * currency, percents, decimals, phone number, SSN, etc.:
-     * "61.54%", "$100.00", "(800) 555-1234".
-     *
-     * @param cell The cell
-     * @return a formatted number string
-     */
-    private String getFormattedNumberString(Cell cell) {
-
-        Format numberFormat = getFormat(cell);
-        double d = cell.getNumericCellValue();
-        if (numberFormat == null) {
-            return String.valueOf(d);
-        }
-        return numberFormat.format(new Double(d));
-    }
-
-    /**
-     * Formats the given raw cell value, based on the supplied
-     *  format index and string, according to excel style rules.
-     * @see #formatCellValue(Cell)
-     */
-    public String formatRawCellContents(double value, int formatIndex, String formatString) {
-        // Is it a date?
-        if(DateUtil.isADateFormat(formatIndex,formatString) &&
-                DateUtil.isValidExcelDate(value)) {
-
-            Format dateFormat = getFormat(value, formatIndex, formatString);
-            Date d = DateUtil.getJavaDate(value);
-            if (dateFormat == null) {
-                return d.toString();
-            }
-            return dateFormat.format(d);
-        }
-        // else Number
-        Format numberFormat = getFormat(value, formatIndex, formatString);
-        if (numberFormat == null) {
-            return String.valueOf(value);
-        }
-        return numberFormat.format(new Double(value));
-    }
-
-    /**
-     * <p>
-     * Returns the formatted value of a cell as a <tt>String</tt> regardless
-     * of the cell type. If the Excel format pattern cannot be parsed then the
-     * cell value will be formatted using a default format.
-     * </p>
-     * <p>When passed a null or blank cell, this method will return an empty
-     * String (""). Formulas in formula type cells will not be evaluated.
-     * </p>
-     *
-     * @param cell The cell
-     * @return the formatted cell value as a String
-     */
-    public String formatCellValue(Cell cell) {
-        return formatCellValue(cell, null);
-    }
-
-    /**
-     * <p>
-     * Returns the formatted value of a cell as a <tt>String</tt> regardless
-     * of the cell type. If the Excel format pattern cannot be parsed then the
-     * cell value will be formatted using a default format.
-     * </p>
-     * <p>When passed a null or blank cell, this method will return an empty
-     * String (""). Formula cells will be evaluated using the given
-     * {@link FormulaEvaluator} if the evaluator is non-null. If the
-     * evaluator is null, then the formula String will be returned. The caller
-     * is responsible for setting the currentRow on the evaluator
-     *</p>
-     *
-     * @param cell The cell (can be null)
-     * @param evaluator The FormulaEvaluator (can be null)
-     * @return a string value of the cell
-     */
-    public String formatCellValue(Cell cell, FormulaEvaluator evaluator) {
-
-        if (cell == null) {
-            return "";
-        }
-
-        int cellType = cell.getCellType();
-        if (cellType == Cell.CELL_TYPE_FORMULA) {
-            if (evaluator == null) {
-                return cell.getCellFormula();
-            }
-            cellType = evaluator.evaluateFormulaCell(cell);
-        }
-        switch (cellType) {
-            case Cell.CELL_TYPE_NUMERIC :
-
-                if (DateUtil.isCellDateFormatted(cell)) {
-                    return getFormattedDateString(cell);
-                }
-                return getFormattedNumberString(cell);
-
-            case Cell.CELL_TYPE_STRING :
-                return cell.getRichStringCellValue().getString();
-
-            case Cell.CELL_TYPE_BOOLEAN :
-                return String.valueOf(cell.getBooleanCellValue());
-            case Cell.CELL_TYPE_BLANK :
-                return "";
-        }
-        throw new RuntimeException("Unexpected celltype (" + cellType + ")");
-    }
-
-
-    /**
-     * <p>
-     * Sets a default number format to be used when the Excel format cannot be
-     * parsed successfully. <b>Note:</b> This is a fall back for when an error
-     * occurs while parsing an Excel number format pattern. This will not
-     * affect cells with the <em>General</em> format.
-     * </p>
-     * <p>
-     * The value that will be passed to the Format's format method (specified
-     * by <code>java.text.Format#format</code>) will be a double value from a
-     * numeric cell. Therefore the code in the format method should expect a
-     * <code>Number</code> value.
-     * </p>
-     *
-     * @param format A Format instance to be used as a default
-     * @see java.text.Format#format
-     */
-    public void setDefaultNumberFormat(Format format) {
-        Iterator itr = formats.entrySet().iterator();
-        while(itr.hasNext()) {
-            Map.Entry entry = (Map.Entry)itr.next();
-            if (entry.getValue() == generalDecimalNumFormat
-                    || entry.getValue() == generalWholeNumFormat) {
-                entry.setValue(format);
-            }
-        }
-        defaultNumFormat = format;
-    }
-
-    /**
-     * Adds a new format to the available formats.
-     * <p>
-     * The value that will be passed to the Format's format method (specified
-     * by <code>java.text.Format#format</code>) will be a double value from a
-     * numeric cell. Therefore the code in the format method should expect a
-     * <code>Number</code> value.
-     * </p>
-     * @param excelFormatStr The data format string
-     * @param format A Format instance
-     */
-    public void addFormat(String excelFormatStr, Format format) {
-        formats.put(excelFormatStr, format);
-    }
-
-    // Some custom formats
-
-    /**
-     * @return a <tt>DecimalFormat</tt> with parseIntegerOnly set <code>true</code>
-     */
-    /* package */ static DecimalFormat createIntegerOnlyFormat(String fmt) {
-        DecimalFormat result = new DecimalFormat(fmt);
-        result.setParseIntegerOnly(true);
-        return result;
-    }
-    /**
-     * Format class for Excel's SSN format. This class mimics Excel's built-in
-     * SSN formatting.
-     *
-     * @author James May
-     */
-    private static final class SSNFormat extends Format {
-        public static final Format instance = new SSNFormat();
-        private static final DecimalFormat df = createIntegerOnlyFormat("000000000");
-        private SSNFormat() {
-            // enforce singleton
-        }
-
-        /** Format a number as an SSN */
-        public static String format(Number num) {
-            String result = df.format(num);
-            StringBuffer sb = new StringBuffer();
-            sb.append(result.substring(0, 3)).append('-');
-            sb.append(result.substring(3, 5)).append('-');
-            sb.append(result.substring(5, 9));
-            return sb.toString();
-        }
-
-        public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
-            return toAppendTo.append(format((Number)obj));
-        }
-
-        public Object parseObject(String source, ParsePosition pos) {
-            return df.parseObject(source, pos);
-        }
-    }
-
-    /**
-     * Format class for Excel Zip + 4 format. This class mimics Excel's
-     * built-in formatting for Zip + 4.
-     * @author James May
-     */
-    private static final class ZipPlusFourFormat extends Format {
-        public static final Format instance = new ZipPlusFourFormat();
-        private static final DecimalFormat df = createIntegerOnlyFormat("000000000");
-        private ZipPlusFourFormat() {
-            // enforce singleton
-        }
-
-        /** Format a number as Zip + 4 */
-        public static String format(Number num) {
-            String result = df.format(num);
-            StringBuffer sb = new StringBuffer();
-            sb.append(result.substring(0, 5)).append('-');
-            sb.append(result.substring(5, 9));
-            return sb.toString();
-        }
-
-        public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
-            return toAppendTo.append(format((Number)obj));
-        }
-
-        public Object parseObject(String source, ParsePosition pos) {
-            return df.parseObject(source, pos);
-        }
-    }
-
-    /**
-     * Format class for Excel phone number format. This class mimics Excel's
-     * built-in phone number formatting.
-     * @author James May
-     */
-    private static final class PhoneFormat extends Format {
-        public static final Format instance = new PhoneFormat();
-        private static final DecimalFormat df = createIntegerOnlyFormat("##########");
-        private PhoneFormat() {
-            // enforce singleton
-        }
-
-        /** Format a number as a phone number */
-        public static String format(Number num) {
-            String result = df.format(num);
-            StringBuffer sb = new StringBuffer();
-            String seg1, seg2, seg3;
-            int len = result.length();
-            if (len <= 4) {
-                return result;
-            }
-
-            seg3 = result.substring(len - 4, len);
-            seg2 = result.substring(Math.max(0, len - 7), len - 4);
-            seg1 = result.substring(Math.max(0, len - 10), Math.max(0, len - 7));
-
-            if(seg1 != null && seg1.trim().length() > 0) {
-                sb.append('(').append(seg1).append(") ");
-            }
-            if(seg2 != null && seg2.trim().length() > 0) {
-                sb.append(seg2).append('-');
-            }
-            sb.append(seg3);
-            return sb.toString();
-        }
-
-        public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
-            return toAppendTo.append(format((Number)obj));
-        }
-
-        public Object parseObject(String source, ParsePosition pos) {
-            return df.parseObject(source, pos);
-        }
-    }
-}
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.ss.usermodel;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+import java.util.*;
+import java.text.*;
+
+/**
+ * DataFormatter contains methods for formatting the value stored in an
+ * Cell. This can be useful for reports and GUI presentations when you
+ * need to display data exactly as it appears in Excel. Supported formats
+ * include currency, SSN, percentages, decimals, dates, phone numbers, zip
+ * codes, etc.
+ * <p>
+ * Internally, formats will be implemented using subclasses of {@link Format}
+ * such as {@link DecimalFormat} and {@link SimpleDateFormat}. Therefore the
+ * formats used by this class must obey the same pattern rules as these Format
+ * subclasses. This means that only legal number pattern characters ("0", "#",
+ * ".", "," etc.) may appear in number formats. Other characters can be
+ * inserted <em>before</em> or <em> after</em> the number pattern to form a
+ * prefix or suffix.
+ * </p>
+ * <p>
+ * For example the Excel pattern <code>"$#,##0.00 "USD"_);($#,##0.00 "USD")"
+ * </code> will be correctly formatted as "$1,000.00 USD" or "($1,000.00 USD)".
+ * However the pattern <code>"00-00-00"</code> is incorrectly formatted by
+ * DecimalFormat as "000000--". For Excel formats that are not compatible with
+ * DecimalFormat, you can provide your own custom {@link Format} implementation
+ * via <code>DataFormatter.addFormat(String,Format)</code>. The following
+ * custom formats are already provided by this class:
+ * </p>
+ * <pre>
+ * <ul><li>SSN "000-00-0000"</li>
+ *     <li>Phone Number "(###) ###-####"</li>
+ *     <li>Zip plus 4 "00000-0000"</li>
+ * </ul>
+ * </pre>
+ * <p>
+ * If the Excel format pattern cannot be parsed successfully, then a default
+ * format will be used. The default number format will mimic the Excel General
+ * format: "#" for whole numbers and "#.##########" for decimal numbers. You
+ * can override the default format pattern with <code>
+ * DataFormatter.setDefaultNumberFormat(Format)</code>. <b>Note:</b> the
+ * default format will only be used when a Format cannot be created from the
+ * cell's data format string.
+ *
+ * @author James May (james dot may at fmr dot com)
+ *
+ */
+public class DataFormatter {
+
+    /** Pattern to find a number format: "0" or  "#" */
+    private static final Pattern numPattern = Pattern.compile("[0#]+");
+
+    /** Pattern to find days of week as text "ddd...." */
+    private static final Pattern daysAsText = Pattern.compile("([d]{3,})", Pattern.CASE_INSENSITIVE);
+
+    /** Pattern to find "AM/PM" marker */
+    private static final Pattern amPmPattern = Pattern.compile("((A|P)[M/P]*)", Pattern.CASE_INSENSITIVE);
+
+    /** A regex to find patterns like [$$-1009] and [$?-452]. */
+    private static final Pattern specialPatternGroup = Pattern.compile("(\\[\\$[^-\\]]*-[0-9A-Z]+\\])");
+
+    /** <em>General</em> format for whole numbers. */
+    private static final Format generalWholeNumFormat = new DecimalFormat("#");
+
+    /** <em>General</em> format for decimal numbers. */
+    private static final Format generalDecimalNumFormat = new DecimalFormat("#.##########");
+
+    /** A default format to use when a number pattern cannot be parsed. */
+    private Format defaultNumFormat;
+
+    /**
+     * A map to cache formats.
+     *  Map<String,Format> formats
+     */
+    private final Map formats;
+
+    /**
+     * Constructor
+     */
+    public DataFormatter() {
+        formats = new HashMap();
+
+        // init built-in formats
+
+        Format zipFormat = ZipPlusFourFormat.instance;
+        addFormat("00000\\-0000", zipFormat);
+        addFormat("00000-0000", zipFormat);
+
+        Format phoneFormat = PhoneFormat.instance;
+        // allow for format string variations
+        addFormat("[<=9999999]###\\-####;\\(###\\)\\ ###\\-####", phoneFormat);
+        addFormat("[<=9999999]###-####;(###) ###-####", phoneFormat);
+        addFormat("###\\-####;\\(###\\)\\ ###\\-####", phoneFormat);
+        addFormat("###-####;(###) ###-####", phoneFormat);
+
+        Format ssnFormat = SSNFormat.instance;
+        addFormat("000\\-00\\-0000", ssnFormat);
+        addFormat("000-00-0000", ssnFormat);
+    }
+
+    /**
+     * Return a Format for the given cell if one exists, otherwise try to
+     * create one. This method will return <code>null</code> if the any of the
+     * following is true:
+     * <ul>
+     * <li>the cell's style is null</li>
+     * <li>the style's data format string is null or empty</li>
+     * <li>the format string cannot be recognized as either a number or date</li>
+     * </ul>
+     *
+     * @param cell The cell to retrieve a Format for
+     * @return A Format for the format String
+     */
+    private Format getFormat(Cell cell) {
+        if ( cell.getCellStyle() == null) {
+            return null;
+        }
+
+        int formatIndex = cell.getCellStyle().getDataFormat();
+        String formatStr = cell.getCellStyle().getDataFormatString();
+        if(formatStr == null || formatStr.trim().length() == 0) {
+            return null;
+        }
+        return getFormat(cell.getNumericCellValue(), formatIndex, formatStr);
+    }
+
+    private Format getFormat(double cellValue, int formatIndex, String formatStr) {
+        Format format = (Format)formats.get(formatStr);
+        if (format != null) {
+            return format;
+        }
+        if (formatStr.equals("General") || formatStr.equals("@")) {
+            if (DataFormatter.isWholeNumber(cellValue)) {
+                return generalWholeNumFormat;
+            }
+            return generalDecimalNumFormat;
+        }
+        format = createFormat(cellValue, formatIndex, formatStr);
+        formats.put(formatStr, format);
+        return format;
+    }
+
+    /**
+     * Create and return a Format based on the format string from a  cell's
+     * style. If the pattern cannot be parsed, return a default pattern.
+     *
+     * @param cell The Excel cell
+     * @return A Format representing the excel format. May return null.
+     */
+    public Format createFormat(Cell cell) {
+
+        int formatIndex = cell.getCellStyle().getDataFormat();
+        String formatStr = cell.getCellStyle().getDataFormatString();
+        return createFormat(cell.getNumericCellValue(), formatIndex, formatStr);
+    }
+
+    private Format createFormat(double cellValue, int formatIndex, String sFormat) {
+        // remove color formatting if present
+        String formatStr = sFormat.replaceAll("\\[[a-zA-Z]*\\]", "");
+
+        // try to extract special characters like currency
+        Matcher m = specialPatternGroup.matcher(formatStr);
+        while(m.find()) {
+            String match = m.group();
+            String symbol = match.substring(match.indexOf('$') + 1, match.indexOf('-'));
+            if (symbol.indexOf('$') > -1) {
+                StringBuffer sb = new StringBuffer();
+                sb.append(symbol.substring(0, symbol.indexOf('$')));
+                sb.append('\\');
+                sb.append(symbol.substring(symbol.indexOf('$'), symbol.length()));
+                symbol = sb.toString();
+            }
+            formatStr = m.replaceAll(symbol);
+            m = specialPatternGroup.matcher(formatStr);
+        }
+
+        if(formatStr == null || formatStr.trim().length() == 0) {
+            return getDefaultFormat(cellValue);
+        }
+
+
+        if(DateUtil.isADateFormat(formatIndex,formatStr) &&
+                DateUtil.isValidExcelDate(cellValue)) {
+            return createDateFormat(formatStr, cellValue);
+        }
+        if (numPattern.matcher(formatStr).find()) {
+            return createNumberFormat(formatStr, cellValue);
+        }
+        // TODO - when does this occur?
+        return null;
+    }
+
+    private Format createDateFormat(String pFormatStr, double cellValue) {
+        String formatStr = pFormatStr;
+        formatStr = formatStr.replaceAll("\\\\-","-");
+        formatStr = formatStr.replaceAll("\\\\,",",");
+        formatStr = formatStr.replaceAll("\\\\ "," ");
+        formatStr = formatStr.replaceAll(";@", "");
+        boolean hasAmPm = false;
+        Matcher amPmMatcher = amPmPattern.matcher(formatStr);
+        while (amPmMatcher.find()) {
+            formatStr = amPmMatcher.replaceAll("@");
+            hasAmPm = true;
+            amPmMatcher = amPmPattern.matcher(formatStr);
+        }
+        formatStr = formatStr.replaceAll("@", "a");
+
+
+        Matcher dateMatcher = daysAsText.matcher(formatStr);
+        if (dateMatcher.find()) {
+            String match = dateMatcher.group(0);
+            formatStr = dateMatcher.replaceAll(match.toUpperCase().replaceAll("D", "E"));
+        }
+
+        // Convert excel date format to SimpleDateFormat.
+        // Excel uses lower case 'm' for both minutes and months.
+        // From Excel help:
+        /*
+            The "m" or "mm" code must appear immediately after the "h" or"hh"
+            code or immediately before the "ss" code; otherwise, Microsoft
+            Excel displays the month instead of minutes."
+          */
+
+        StringBuffer sb = new StringBuffer();
+        char[] chars = formatStr.toCharArray();
+        boolean mIsMonth = true;
+        List ms = new ArrayList();
+        for(int j=0; j<chars.length; j++) {
+            char c = chars[j];
+            if (c == 'h' || c == 'H') {
+                mIsMonth = false;
+                if (hasAmPm) {
+                    sb.append('h');
+                } else {
+                    sb.append('H');
+                }
+            }
+            else if (c == 'm') {
+                if(mIsMonth) {
+                    sb.append('M');
+                    ms.add(
+                            new Integer(sb.length() -1)
+                    );
+                } else {
+                    sb.append('m');
+                }
+            }
+            else if (c == 's' || c == 'S') {
+                sb.append('s');
+                // if 'M' precedes 's' it should be minutes ('m')
+                for (int i = 0; i < ms.size(); i++) {
+                    int index = ((Integer)ms.get(i)).intValue();
+                    if (sb.charAt(index) == 'M') {
+                        sb.replace(index, index+1, "m");
+                    }
+                }
+                mIsMonth = true;
+                ms.clear();
+            }
+            else if (Character.isLetter(c)) {
+                mIsMonth = true;
+                ms.clear();
+                if (c == 'y' || c == 'Y') {
+                    sb.append('y');
+                }
+                else if (c == 'd' || c == 'D') {
+                    sb.append('d');
+                }
+                else {
+                    sb.append(c);
+                }
+            }
+            else {
+                sb.append(c);
+            }
+        }
+        formatStr = sb.toString();
+
+        try {
+            return new SimpleDateFormat(formatStr);
+        } catch(IllegalArgumentException iae) {
+
+            // the pattern could not be parsed correctly,
+            // so fall back to the default number format
+            return getDefaultFormat(cellValue);
+        }
+
+    }
+
+    private Format createNumberFormat(String formatStr, double cellValue) {
+        StringBuffer sb = new StringBuffer(formatStr);
+        for (int i = 0; i < sb.length(); i++) {
+            char c = sb.charAt(i);
+            //handle (#,##0_);
+            if (c == '(') {
+                int idx = sb.indexOf(")", i);
+                if (idx > -1 && sb.charAt(idx -1) == '_') {
+                    sb.deleteCharAt(idx);
+                    sb.deleteCharAt(idx - 1);
+                    sb.deleteCharAt(i);
+                    i--;
+                }
+            } else if (c == ')' && i > 0 && sb.charAt(i - 1) == '_') {
+                sb.deleteCharAt(i);
+                sb.deleteCharAt(i - 1);
+                i--;
+            // remove quotes and back slashes
+            } else if (c == '\\' || c == '"') {
+                sb.deleteCharAt(i);
+                i--;
+
+            // for scientific/engineering notation
+            } else if (c == '+' && i > 0 && sb.charAt(i - 1) == 'E') {
+                sb.deleteCharAt(i);
+                i--;
+            }
+        }
+
+        try {
+            return new DecimalFormat(sb.toString());
+        } catch(IllegalArgumentException iae) {
+
+            // the pattern could not be parsed correctly,
+            // so fall back to the default number format
+            return getDefaultFormat(cellValue);
+        }
+    }
+
+    /**
+     * Return true if the double value represents a whole number
+     * @param d the double value to check
+     * @return <code>true</code> if d is a whole number
+     */
+    private static boolean isWholeNumber(double d) {
+        return d == Math.floor(d);
+    }
+
+    /**
+     * Returns a default format for a cell.
+     * @param cell The cell
+     * @return a default format
+     */
+    public Format getDefaultFormat(Cell cell) {
+        return getDefaultFormat(cell.getNumericCellValue());
+    }
+    private Format getDefaultFormat(double cellValue) {
+        // for numeric cells try user supplied default
+        if (defaultNumFormat != null) {
+            return defaultNumFormat;
+
+          // otherwise use general format
+        }
+        if (isWholeNumber(cellValue)){
+            return generalWholeNumFormat;
+        }
+        return generalDecimalNumFormat;
+    }
+
+    /**
+     * Returns the formatted value of an Excel date as a <tt>String</tt> based
+     * on the cell's <code>DataFormat</code>. i.e. "Thursday, January 02, 2003"
+     * , "01/02/2003" , "02-Jan" , etc.
+     *
+     * @param cell The cell
+     * @return a formatted date string
+     */
+    private String getFormattedDateString(Cell cell) {
+        Format dateFormat = getFormat(cell);
+        Date d = cell.getDateCellValue();
+        if (dateFormat != null) {
+            return dateFormat.format(d);
+        }
+        return d.toString();
+    }
+
+    /**
+     * Returns the formatted value of an Excel number as a <tt>String</tt>
+     * based on the cell's <code>DataFormat</code>. Supported formats include
+     * currency, percents, decimals, phone number, SSN, etc.:
+     * "61.54%", "$100.00", "(800) 555-1234".
+     *
+     * @param cell The cell
+     * @return a formatted number string
+     */
+    private String getFormattedNumberString(Cell cell) {
+
+        Format numberFormat = getFormat(cell);
+        double d = cell.getNumericCellValue();
+        if (numberFormat == null) {
+            return String.valueOf(d);
+        }
+        return numberFormat.format(new Double(d));
+    }
+
+    /**
+     * Formats the given raw cell value, based on the supplied
+     *  format index and string, according to excel style rules.
+     * @see #formatCellValue(Cell)
+     */
+    public String formatRawCellContents(double value, int formatIndex, String formatString) {
+        // Is it a date?
+        if(DateUtil.isADateFormat(formatIndex,formatString) &&
+                DateUtil.isValidExcelDate(value)) {
+
+            Format dateFormat = getFormat(value, formatIndex, formatString);
+            Date d = DateUtil.getJavaDate(value);
+            if (dateFormat == null) {
+                return d.toString();
+            }
+            return dateFormat.format(d);
+        }
+        // else Number
+        Format numberFormat = getFormat(value, formatIndex, formatString);
+        if (numberFormat == null) {
+            return String.valueOf(value);
+        }
+        return numberFormat.format(new Double(value));
+    }
+
+    /**
+     * <p>
+     * Returns the formatted value of a cell as a <tt>String</tt> regardless
+     * of the cell type. If the Excel format pattern cannot be parsed then the
+     * cell value will be formatted using a default format.
+     * </p>
+     * <p>When passed a null or blank cell, this method will return an empty
+     * String (""). Formulas in formula type cells will not be evaluated.
+     * </p>
+     *
+     * @param cell The cell
+     * @return the formatted cell value as a String
+     */
+    public String formatCellValue(Cell cell) {
+        return formatCellValue(cell, null);
+    }
+
+    /**
+     * <p>
+     * Returns the formatted value of a cell as a <tt>String</tt> regardless
+     * of the cell type. If the Excel format pattern cannot be parsed then the
+     * cell value will be formatted using a default format.
+     * </p>
+     * <p>When passed a null or blank cell, this method will return an empty
+     * String (""). Formula cells will be evaluated using the given
+     * {@link FormulaEvaluator} if the evaluator is non-null. If the
+     * evaluator is null, then the formula String will be returned. The caller
+     * is responsible for setting the currentRow on the evaluator
+     *</p>
+     *
+     * @param cell The cell (can be null)
+     * @param evaluator The FormulaEvaluator (can be null)
+     * @return a string value of the cell
+     */
+    public String formatCellValue(Cell cell, FormulaEvaluator evaluator) {
+
+        if (cell == null) {
+            return "";
+        }
+
+        int cellType = cell.getCellType();
+        if (cellType == Cell.CELL_TYPE_FORMULA) {
+            if (evaluator == null) {
+                return cell.getCellFormula();
+            }
+            cellType = evaluator.evaluateFormulaCell(cell);
+        }
+        switch (cellType) {
+            case Cell.CELL_TYPE_NUMERIC :
+
+                if (DateUtil.isCellDateFormatted(cell)) {
+                    return getFormattedDateString(cell);
+                }
+                return getFormattedNumberString(cell);
+
+            case Cell.CELL_TYPE_STRING :
+                return cell.getRichStringCellValue().getString();
+
+            case Cell.CELL_TYPE_BOOLEAN :
+                return String.valueOf(cell.getBooleanCellValue());
+            case Cell.CELL_TYPE_BLANK :
+                return "";
+        }
+        throw new RuntimeException("Unexpected celltype (" + cellType + ")");
+    }
+
+
+    /**
+     * <p>
+     * Sets a default number format to be used when the Excel format cannot be
+     * parsed successfully. <b>Note:</b> This is a fall back for when an error
+     * occurs while parsing an Excel number format pattern. This will not
+     * affect cells with the <em>General</em> format.
+     * </p>
+     * <p>
+     * The value that will be passed to the Format's format method (specified
+     * by <code>java.text.Format#format</code>) will be a double value from a
+     * numeric cell. Therefore the code in the format method should expect a
+     * <code>Number</code> value.
+     * </p>
+     *
+     * @param format A Format instance to be used as a default
+     * @see java.text.Format#format
+     */
+    public void setDefaultNumberFormat(Format format) {
+        Iterator itr = formats.entrySet().iterator();
+        while(itr.hasNext()) {
+            Map.Entry entry = (Map.Entry)itr.next();
+            if (entry.getValue() == generalDecimalNumFormat
+                    || entry.getValue() == generalWholeNumFormat) {
+                entry.setValue(format);
+            }
+        }
+        defaultNumFormat = format;
+    }
+
+    /**
+     * Adds a new format to the available formats.
+     * <p>
+     * The value that will be passed to the Format's format method (specified
+     * by <code>java.text.Format#format</code>) will be a double value from a
+     * numeric cell. Therefore the code in the format method should expect a
+     * <code>Number</code> value.
+     * </p>
+     * @param excelFormatStr The data format string
+     * @param format A Format instance
+     */
+    public void addFormat(String excelFormatStr, Format format) {
+        formats.put(excelFormatStr, format);
+    }
+
+    // Some custom formats
+
+    /**
+     * @return a <tt>DecimalFormat</tt> with parseIntegerOnly set <code>true</code>
+     */
+    /* package */ static DecimalFormat createIntegerOnlyFormat(String fmt) {
+        DecimalFormat result = new DecimalFormat(fmt);
+        result.setParseIntegerOnly(true);
+        return result;
+    }
+    /**
+     * Format class for Excel's SSN format. This class mimics Excel's built-in
+     * SSN formatting.
+     *
+     * @author James May
+     */
+    private static final class SSNFormat extends Format {
+        public static final Format instance = new SSNFormat();
+        private static final DecimalFormat df = createIntegerOnlyFormat("000000000");
+        private SSNFormat() {
+            // enforce singleton
+        }
+
+        /** Format a number as an SSN */
+        public static String format(Number num) {
+            String result = df.format(num);
+            StringBuffer sb = new StringBuffer();
+            sb.append(result.substring(0, 3)).append('-');
+            sb.append(result.substring(3, 5)).append('-');
+            sb.append(result.substring(5, 9));
+            return sb.toString();
+        }
+
+        public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
+            return toAppendTo.append(format((Number)obj));
+        }
+
+        public Object parseObject(String source, ParsePosition pos) {
+            return df.parseObject(source, pos);
+        }
+    }
+
+    /**
+     * Format class for Excel Zip + 4 format. This class mimics Excel's
+     * built-in formatting for Zip + 4.
+     * @author James May
+     */
+    private static final class ZipPlusFourFormat extends Format {
+        public static final Format instance = new ZipPlusFourFormat();
+        private static final DecimalFormat df = createIntegerOnlyFormat("000000000");
+        private ZipPlusFourFormat() {
+            // enforce singleton
+        }
+
+        /** Format a number as Zip + 4 */
+        public static String format(Number num) {
+            String result = df.format(num);
+            StringBuffer sb = new StringBuffer();
+            sb.append(result.substring(0, 5)).append('-');
+            sb.append(result.substring(5, 9));
+            return sb.toString();
+        }
+
+        public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
+            return toAppendTo.append(format((Number)obj));
+        }
+
+        public Object parseObject(String source, ParsePosition pos) {
+            return df.parseObject(source, pos);
+        }
+    }
+
+    /**
+     * Format class for Excel phone number format. This class mimics Excel's
+     * built-in phone number formatting.
+     * @author James May
+     */
+    private static final class PhoneFormat extends Format {
+        public static final Format instance = new PhoneFormat();
+        private static final DecimalFormat df = createIntegerOnlyFormat("##########");
+        private PhoneFormat() {
+            // enforce singleton
+        }
+
+        /** Format a number as a phone number */
+        public static String format(Number num) {
+            String result = df.format(num);
+            StringBuffer sb = new StringBuffer();
+            String seg1, seg2, seg3;
+            int len = result.length();
+            if (len <= 4) {
+                return result;
+            }
+
+            seg3 = result.substring(len - 4, len);
+            seg2 = result.substring(Math.max(0, len - 7), len - 4);
+            seg1 = result.substring(Math.max(0, len - 10), Math.max(0, len - 7));
+
+            if(seg1 != null && seg1.trim().length() > 0) {
+                sb.append('(').append(seg1).append(") ");
+            }
+            if(seg2 != null && seg2.trim().length() > 0) {
+                sb.append(seg2).append('-');
+            }
+            sb.append(seg3);
+            return sb.toString();
+        }
+
+        public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
+            return toAppendTo.append(format((Number)obj));
+        }
+
+        public Object parseObject(String source, ParsePosition pos) {
+            return df.parseObject(source, pos);
+        }
+    }
+}

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java?rev=776377&r1=776376&r2=776377&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java Tue May 19 16:29:51 2009
@@ -1,24 +1,24 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.ss.usermodel;
-
-/**
- * @author Yegor Kozlov
- */
-public interface Drawing {
-    Picture createPicture(ClientAnchor anchor, int pictureIndex);
-}
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.ss.usermodel;
+
+/**
+ * @author Yegor Kozlov
+ */
+public interface Drawing {
+    Picture createPicture(ClientAnchor anchor, int pictureIndex);
+}

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java?rev=776377&r1=776376&r2=776377&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaError.java Tue May 19 16:29:51 2009
@@ -1,140 +1,140 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.ss.usermodel;
-
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- * Enumerates error values in SpreadsheetML formula calculations.
- *
- * @author Yegor Kozlov
- */
-public enum FormulaError {
-    /**
-     * Intended to indicate when two areas are required to intersect, but do not.
-     * <p>Example:
-     * In the case of SUM(B1 C1), the space between B1 and C1 is treated as the binary
-     * intersection operator, when a comma was intended. end example]
-     * </p>
-     */
-    NULL(0x00, "#NULL!"),
-
-    /**
-     * Intended to indicate when any number, including zero, is divided by zero.
-     * Note: However, any error code divided by zero results in that error code.
-     */
-    DIV0(0x07, "#DIV/0!"),
-
-    /**
-     * Intended to indicate when an incompatible type argument is passed to a function, or
-     * an incompatible type operand is used with an operator.
-     * <p>Example:
-     * In the case of a function argument, text was expected, but a number was provided
-     * </p>
-     */
-    VALUE(0x0F, "#VALUE!"),
-
-    /**
-     * Intended to indicate when a cell reference is invalid.
-     * <p>Example:
-     * If a formula contains a reference to a cell, and then the row or column containing that cell is deleted,
-     * a #REF! error results. If a worksheet does not support 20,001 columns,
-     * OFFSET(A1,0,20000) will result in a #REF! error.
-     * </p>
-     */
-    REF(0x1D, "#REF!"),
-
-    /**
-     * Intended to indicate when what looks like a name is used, but no such name has been defined.
-     * <p>Example:
-     * XYZ/3, where XYZ is not a defined name. Total is & A10,
-     * where neither Total nor is is a defined name. Presumably, "Total is " & A10
-     * was intended. SUM(A1C10), where the range A1:C10 was intended.
-     * </p>
-     */
-    NAME(0x1D, "#NAME?"),
-
-    /**
-     * Intended to indicate when an argument to a function has a compatible type, but has a
-     * value that is outside the domain over which that function is defined. (This is known as
-     * a domain error.)
-     * <p>Example:
-     * Certain calls to ASIN, ATANH, FACT, and SQRT might result in domain errors.
-     * </p>
-     * Intended to indicate that the result of a function cannot be represented in a value of
-     * the specified type, typically due to extreme magnitude. (This is known as a range
-     * error.)
-     * <p>Example: FACT(1000) might result in a range error. </p>
-     */
-    NUM(0x24, "#NUM!"),
-
-    /**
-     * Intended to indicate when a designated value is not available.
-     * <p>Example:
-     * Some functions, such as SUMX2MY2, perform a series of operations on corresponding
-     * elements in two arrays. If those arrays do not have the same number of elements, then
-     * for some elements in the longer array, there are no corresponding elements in the
-     * shorter one; that is, one or more values in the shorter array are not available.
-     * </p>
-     * This error value can be produced by calling the function NA
-     */
-    NA(0x2A, "#N/A");
-
-    private byte type;
-    private String repr;
-
-    private FormulaError(int type, String repr) {
-        this.type = (byte) type;
-        this.repr = repr;
-    }
-
-    /**
-     * @return numeric code of the error
-     */
-    public byte getCode() {
-        return type;
-    }
-
-    /**
-     * @return string representation of the error
-     */
-    public String getString() {
-        return repr;
-    }
-
-    private static Map<String, FormulaError> smap = new HashMap<String, FormulaError>();
-    private static Map<Byte, FormulaError> imap = new HashMap<Byte, FormulaError>();
-    static{
-        for (FormulaError error : values()) {
-            imap.put(error.getCode(), error);
-            smap.put(error.getString(), error);
-        }
-    }
-
-    public static FormulaError forInt(byte type){
-        FormulaError err = imap.get(type);
-        if(err == null) throw new IllegalArgumentException("Unknown error type: " + type);
-        return err;
-    }
-
-    public static FormulaError forString(String code){
-        FormulaError err = smap.get(code);
-        if(err == null) throw new IllegalArgumentException("Unknown error code: " + code);
-        return err;
-    }
-}
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.ss.usermodel;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * Enumerates error values in SpreadsheetML formula calculations.
+ *
+ * @author Yegor Kozlov
+ */
+public enum FormulaError {
+    /**
+     * Intended to indicate when two areas are required to intersect, but do not.
+     * <p>Example:
+     * In the case of SUM(B1 C1), the space between B1 and C1 is treated as the binary
+     * intersection operator, when a comma was intended. end example]
+     * </p>
+     */
+    NULL(0x00, "#NULL!"),
+
+    /**
+     * Intended to indicate when any number, including zero, is divided by zero.
+     * Note: However, any error code divided by zero results in that error code.
+     */
+    DIV0(0x07, "#DIV/0!"),
+
+    /**
+     * Intended to indicate when an incompatible type argument is passed to a function, or
+     * an incompatible type operand is used with an operator.
+     * <p>Example:
+     * In the case of a function argument, text was expected, but a number was provided
+     * </p>
+     */
+    VALUE(0x0F, "#VALUE!"),
+
+    /**
+     * Intended to indicate when a cell reference is invalid.
+     * <p>Example:
+     * If a formula contains a reference to a cell, and then the row or column containing that cell is deleted,
+     * a #REF! error results. If a worksheet does not support 20,001 columns,
+     * OFFSET(A1,0,20000) will result in a #REF! error.
+     * </p>
+     */
+    REF(0x1D, "#REF!"),
+
+    /**
+     * Intended to indicate when what looks like a name is used, but no such name has been defined.
+     * <p>Example:
+     * XYZ/3, where XYZ is not a defined name. Total is & A10,
+     * where neither Total nor is is a defined name. Presumably, "Total is " & A10
+     * was intended. SUM(A1C10), where the range A1:C10 was intended.
+     * </p>
+     */
+    NAME(0x1D, "#NAME?"),
+
+    /**
+     * Intended to indicate when an argument to a function has a compatible type, but has a
+     * value that is outside the domain over which that function is defined. (This is known as
+     * a domain error.)
+     * <p>Example:
+     * Certain calls to ASIN, ATANH, FACT, and SQRT might result in domain errors.
+     * </p>
+     * Intended to indicate that the result of a function cannot be represented in a value of
+     * the specified type, typically due to extreme magnitude. (This is known as a range
+     * error.)
+     * <p>Example: FACT(1000) might result in a range error. </p>
+     */
+    NUM(0x24, "#NUM!"),
+
+    /**
+     * Intended to indicate when a designated value is not available.
+     * <p>Example:
+     * Some functions, such as SUMX2MY2, perform a series of operations on corresponding
+     * elements in two arrays. If those arrays do not have the same number of elements, then
+     * for some elements in the longer array, there are no corresponding elements in the
+     * shorter one; that is, one or more values in the shorter array are not available.
+     * </p>
+     * This error value can be produced by calling the function NA
+     */
+    NA(0x2A, "#N/A");
+
+    private byte type;
+    private String repr;
+
+    private FormulaError(int type, String repr) {
+        this.type = (byte) type;
+        this.repr = repr;
+    }
+
+    /**
+     * @return numeric code of the error
+     */
+    public byte getCode() {
+        return type;
+    }
+
+    /**
+     * @return string representation of the error
+     */
+    public String getString() {
+        return repr;
+    }
+
+    private static Map<String, FormulaError> smap = new HashMap<String, FormulaError>();
+    private static Map<Byte, FormulaError> imap = new HashMap<Byte, FormulaError>();
+    static{
+        for (FormulaError error : values()) {
+            imap.put(error.getCode(), error);
+            smap.put(error.getString(), error);
+        }
+    }
+
+    public static FormulaError forInt(byte type){
+        FormulaError err = imap.get(type);
+        if(err == null) throw new IllegalArgumentException("Unknown error type: " + type);
+        return err;
+    }
+
+    public static FormulaError forString(String code){
+        FormulaError err = smap.get(code);
+        if(err == null) throw new IllegalArgumentException("Unknown error code: " + code);
+        return err;
+    }
+}

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/HorizontalAlignment.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/HorizontalAlignment.java?rev=776377&r1=776376&r2=776377&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/HorizontalAlignment.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/HorizontalAlignment.java Tue May 19 16:29:51 2009
@@ -1,95 +1,95 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.ss.usermodel;
-
-/**
- * The enumeration value indicating horizontal alignment of a cell,
- * i.e., whether it is aligned general, left, right, horizontally centered, filled (replicated),
- * justified, centered across multiple cells, or distributed.
- */
-public enum HorizontalAlignment {
-    /**
-     * The horizontal alignment is general-aligned. Text data is left-aligned.
-     * Numbers, dates, and times are rightaligned. Boolean types are centered.
-     * Changing the alignment does not change the type of data.
-     */
-    GENERAL,
-
-    /**
-     * The horizontal alignment is left-aligned, even in Rightto-Left mode.
-     * Aligns contents at the left edge of the cell. If an indent amount is specified, the contents of
-     * the cell is indented from the left by the specified number of character spaces. The character spaces are
-     * based on the default font and font size for the workbook.
-     */
-    LEFT,
-
-    /**
-     * The horizontal alignment is centered, meaning the text is centered across the cell.
-     */
-    CENTER,
-
-    /**
-     * The horizontal alignment is right-aligned, meaning that cell contents are aligned at the right edge of the cell,
-     * even in Right-to-Left mode.
-     */
-    RIGHT,
-
-    /**
-     * Indicates that the value of the cell should be filled
-     * across the entire width of the cell. If blank cells to the right also have the fill alignment,
-     * they are also filled with the value, using a convention similar to centerContinuous.
-     * <p>
-     * Additional rules:
-     * <ol>
-     * <li>Only whole values can be appended, not partial values.</li>
-     * <li>The column will not be widened to 'best fit' the filled value</li>
-     * <li>If appending an additional occurrence of the value exceeds the boundary of the cell
-     * left/right edge, don't append the additional occurrence of the value.</li>
-     * <li>The display value of the cell is filled, not the underlying raw number.</li>
-     * </ol>
-     * </p>
-     */
-    FILL,
-
-    /**
-     * The horizontal alignment is justified (flush left and right).
-     * For each line of text, aligns each line of the wrapped text in a cell to the right and left
-     * (except the last line). If no single line of text wraps in the cell, then the text is not justified.
-     */
-    JUSTIFY,
-
-    /**
-     * The horizontal alignment is centered across multiple cells.
-     * The information about how many cells to span is expressed in the Sheet Part,
-     * in the row of the cell in question. For each cell that is spanned in the alignment,
-     * a cell element needs to be written out, with the same style Id which references the centerContinuous alignment.
-     */
-    CENTER_SELECTION,
-
-    /**
-     * Indicates that each 'word' in each line of text inside the cell is evenly distributed
-     * across the width of the cell, with flush right and left margins.
-     * <p>
-     * When there is also an indent value to apply, both the left and right side of the cell
-     * are padded by the indent value.
-     * </p>
-     * <p> A 'word' is a set of characters with no space character in them. </p>
-     * <p> Two lines inside a cell are separated by a carriage return. </p>
-     */
-    DISTRIBUTED
-}
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.usermodel;
+
+/**
+ * The enumeration value indicating horizontal alignment of a cell,
+ * i.e., whether it is aligned general, left, right, horizontally centered, filled (replicated),
+ * justified, centered across multiple cells, or distributed.
+ */
+public enum HorizontalAlignment {
+    /**
+     * The horizontal alignment is general-aligned. Text data is left-aligned.
+     * Numbers, dates, and times are rightaligned. Boolean types are centered.
+     * Changing the alignment does not change the type of data.
+     */
+    GENERAL,
+
+    /**
+     * The horizontal alignment is left-aligned, even in Rightto-Left mode.
+     * Aligns contents at the left edge of the cell. If an indent amount is specified, the contents of
+     * the cell is indented from the left by the specified number of character spaces. The character spaces are
+     * based on the default font and font size for the workbook.
+     */
+    LEFT,
+
+    /**
+     * The horizontal alignment is centered, meaning the text is centered across the cell.
+     */
+    CENTER,
+
+    /**
+     * The horizontal alignment is right-aligned, meaning that cell contents are aligned at the right edge of the cell,
+     * even in Right-to-Left mode.
+     */
+    RIGHT,
+
+    /**
+     * Indicates that the value of the cell should be filled
+     * across the entire width of the cell. If blank cells to the right also have the fill alignment,
+     * they are also filled with the value, using a convention similar to centerContinuous.
+     * <p>
+     * Additional rules:
+     * <ol>
+     * <li>Only whole values can be appended, not partial values.</li>
+     * <li>The column will not be widened to 'best fit' the filled value</li>
+     * <li>If appending an additional occurrence of the value exceeds the boundary of the cell
+     * left/right edge, don't append the additional occurrence of the value.</li>
+     * <li>The display value of the cell is filled, not the underlying raw number.</li>
+     * </ol>
+     * </p>
+     */
+    FILL,
+
+    /**
+     * The horizontal alignment is justified (flush left and right).
+     * For each line of text, aligns each line of the wrapped text in a cell to the right and left
+     * (except the last line). If no single line of text wraps in the cell, then the text is not justified.
+     */
+    JUSTIFY,
+
+    /**
+     * The horizontal alignment is centered across multiple cells.
+     * The information about how many cells to span is expressed in the Sheet Part,
+     * in the row of the cell in question. For each cell that is spanned in the alignment,
+     * a cell element needs to be written out, with the same style Id which references the centerContinuous alignment.
+     */
+    CENTER_SELECTION,
+
+    /**
+     * Indicates that each 'word' in each line of text inside the cell is evenly distributed
+     * across the width of the cell, with flush right and left margins.
+     * <p>
+     * When there is also an indent value to apply, both the left and right side of the cell
+     * are padded by the indent value.
+     * </p>
+     * <p> A 'word' is a set of characters with no space character in them. </p>
+     * <p> Two lines inside a cell are separated by a carriage return. </p>
+     */
+    DISTRIBUTED
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org