]> source.dussan.org Git - poi.git/commitdiff
common ss interfaces for drawing, clientacnhor and picture, also some refactoring...
authorYegor Kozlov <yegor@apache.org>
Wed, 12 Nov 2008 07:15:37 +0000 (07:15 +0000)
committerYegor Kozlov <yegor@apache.org>
Wed, 12 Nov 2008 07:15:37 +0000 (07:15 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@713279 13f79535-47bb-0310-9956-ffa450edef68

18 files changed:
src/documentation/content/xdocs/spreadsheet/quick-guide.xml
src/java/org/apache/poi/hssf/usermodel/HSSFClientAnchor.java
src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java
src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java
src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java
src/java/org/apache/poi/hssf/util/HSSFColor.java
src/java/org/apache/poi/ss/usermodel/DataFormatter.java
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/ClientAnchor.java [new file with mode: 0755]
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Color.java [deleted file]
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/CreationHelper.java
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Drawing.java [new file with mode: 0755]
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Picture.java [new file with mode: 0755]
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java

index 461a5f207f9d135f179bb481d438c4209327c75c..9b347c75928cc98fb236bf5bae5ac72d5479d4ac 100644 (file)
@@ -1163,63 +1163,45 @@ Examples:
                 It should be noted that any existing drawings may be erased
                 once you add a image to a sheet.
               </p>
-              <p><strong>HSSF:</strong></p>  
             <source>
-    // Create the drawing patriarch.  This is the top level container for
-    // all shapes. This will clear out any existing shapes for that sheet.
-    HSSFPatriarch patriarch = sheet5.createDrawingPatriarch();
-
-    HSSFClientAnchor anchor;
-    anchor = new HSSFClientAnchor(0,0,0,255,(short)2,2,(short)4,7);
-    anchor.setAnchorType( 2 );
-    patriarch.createPicture(anchor, loadPicture( "src/resources/logos/logoKarmokar4.png", wb ));
-  </source>
-  <p>Creating an image and setting its anchor to the actual width and height:</p>
-      <source>
-    HSSFPatriarch patriarch = sheet5.createDrawingPatriarch();
-
-    HSSFPicture picture = patriarch.createPicture(new HSSFClientAnchor(), loadPicture( "src/resources/logos/logoKarmokar4.png", wb ));
-    picture.resize();
-      </source>
-      <p>or</p> 
-      <source>
-    HSSFPatriarch patriarch = sheet5.createDrawingPatriarch();
-
-    HSSFPicture picture = patriarch.createPicture(new HSSFClientAnchor(), loadPicture( "src/resources/logos/logoKarmokar4.png", wb ));
-    HSSFClientAnchor preferredSize = picture.getPreferredSize();
-    picture.setAnchor(preferredSize);
-      </source>
-      <p><strong>XSSF:</strong></p>
-      <source>
     //create a new workbook
-    XSSFWorkbook wb = new XSSFWorkbook(); 
+    Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();
 
-    //add a picture in this workbook.
-    InputStream is = new FileInputStream("lilies.jpg");
-    int pictureIdx = wb.addPicture(is, XSSFWorkbook.PICTURE_TYPE_JPEG);
+    //add picture data to this workbook.
+    InputStream is = new FileInputStream("image1.jpeg");
+    byte[] bytes = IOUtils.toByteArray(is);
+    int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
     is.close();
 
+    CreationHelper helper = wb.getCreationHelper();
+
     //create sheet
-    XSSFSheet sheet = wb.createSheet();
+    Sheet sheet = wb.createSheet();
 
-    //create drawing
-    XSSFDrawing drawing = sheet.createDrawingPatriarch();
+    // Create the drawing patriarch.  This is the top level container for all shapes. 
+    Drawing drawing = sheet.createDrawingPatriarch();
 
     //add a picture shape
-    XSSFPicture pict = drawing.createPicture(new XSSFClientAnchor(), pictureIdx);
-
-    //auto-size picture
+    ClientAnchor anchor = helper.createClientAnchor();
+    //set top-left corner of the picture,
+    //subsequent call of Picture#resize() will operate relative to it
+    anchor.setCol1(3);
+    anchor.setRow1(2);
+    Picture pict = drawing.createPicture(anchor, pictureIdx);
+
+    //auto-size picture relative to its top-left corner
     pict.resize();
 
     //save workbook
-    FileOutputStream fileOut = new FileOutputStream("xssf-picture.xlsx");
+    String file = "picture.xls";
+    if(wb instanceof XSSFWorkbook) file += "x";
+    FileOutputStream fileOut = new FileOutputStream(file);
     wb.write(fileOut);
     fileOut.close();
-      </source>
+        </source>
         <warning>
-          HSSFPicture.resize() and XSSFPicture.resize() work only for JPEG and PNG. Other formats are not yet supported.
+          Picture.resize() works only for JPEG and PNG. Other formats are not yet supported.
         </warning>
-
    <p>Reading images from a workbook:</p>
       <source>
  
index 4d9098d75ae09d8f421ae3f48e9dd40b93a733de..605b5ac3d043b9ec93273a09e01fc254a5614814 100644 (file)
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hssf.usermodel;
 
-
+import org.apache.poi.ss.usermodel.ClientAnchor;
 
 
 /**
@@ -27,7 +27,7 @@ package org.apache.poi.hssf.usermodel;
  * @author Glen Stampoultzis (glens at apache.org)
  */
 public class HSSFClientAnchor
-        extends HSSFAnchor
+        extends HSSFAnchor implements ClientAnchor
 {
     short col1;
     int row1;
@@ -124,6 +124,9 @@ public class HSSFClientAnchor
         checkRange(col1, 0, 255, "col1");
         this.col1 = col1;
     }
+    public void setCol1( int col1 ){
+        setCol1((short)col1);
+    }
 
     public short getCol2()
     {
@@ -136,6 +139,10 @@ public class HSSFClientAnchor
         this.col2 = col2;
     }
 
+    public void setCol2( int col2 ){
+        setCol2((short)col2);
+    }
+
     public int getRow1()
     {
         return row1;
index 0eabcfa70669ed135484fadd466f68b4b6c1ca3f..569ad6ff0eb060f8de7af542a18cf9cc42c778ba 100644 (file)
@@ -54,4 +54,14 @@ public class HSSFCreationHelper implements CreationHelper {
         return new HSSFFormulaEvaluator(workbook);
     }
 
+    /**
+     * Creates a HSSFClientAnchor. Use this object to position drawing object in a sheet
+     *
+     * @return a HSSFClientAnchor instance
+     * @see org.apache.poi.ss.usermodel.Drawing
+     */
+    public HSSFClientAnchor createClientAnchor(){
+        return new HSSFClientAnchor();
+    }
+
 }
index 67291a22f1f255bd6343893cc432f95d63c1f022..4eead2a5b699f4b640a90f0c799edae32ac98009 100644 (file)
@@ -17,6 +17,8 @@
 
 package org.apache.poi.hssf.usermodel;
 
+import org.apache.poi.ss.usermodel.DataFormatter;
+
 import java.text.DecimalFormat;
 import java.text.FieldPosition;
 import java.text.Format;
@@ -73,611 +75,6 @@ import java.util.regex.Pattern;
  * @author James May (james dot may at fmr dot com)
  *
  */
-public final class HSSFDataFormatter {
-
-       /** 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 HSSFDataFormatter() {
-               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(HSSFCell 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")) {
-                       if (HSSFDataFormatter.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(HSSFCell 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(HSSFDateUtil.isADateFormat(formatIndex,formatStr) &&
-                               HSSFDateUtil.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(HSSFCell 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(HSSFCell 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(HSSFCell 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(HSSFCell)
-        */
-       public String formatRawCellContents(double value, int formatIndex, String formatString) {
-               // Is it a date?
-               if(HSSFDateUtil.isADateFormat(formatIndex,formatString) &&
-                               HSSFDateUtil.isValidExcelDate(value)) {
-
-                       Format dateFormat = getFormat(value, formatIndex, formatString);
-                       Date d = HSSFDateUtil.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(HSSFCell 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 HSSFFormulaEvaluator} 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 HSSFFormulaEvaluator (can be null)
-        * @return a string value of the cell
-        */
-       public String formatCellValue(HSSFCell cell,
-                       HSSFFormulaEvaluator evaluator) throws IllegalArgumentException {
-
-               if (cell == null) {
-                       return "";
-               }
-
-               int cellType = cell.getCellType();
-               if (evaluator != null && cellType == HSSFCell.CELL_TYPE_FORMULA) {
-                       try {
-                               cellType = evaluator.evaluateFormulaCell(cell);
-                       } catch (RuntimeException e) {
-                               throw new RuntimeException("Did you forget to set the current" +
-                                               " row on the HSSFFormulaEvaluator?", e);
-                       }
-               }
-               switch (cellType)
-               {
-                       case HSSFCell.CELL_TYPE_FORMULA :
-                               // should only occur if evaluator is null
-                               return cell.getCellFormula();
-
-                       case HSSFCell.CELL_TYPE_NUMERIC :
-
-                               if (HSSFDateUtil.isCellDateFormatted(cell)) {
-                                       return getFormattedDateString(cell);
-                               }
-                               return getFormattedNumberString(cell);
-
-                       case HSSFCell.CELL_TYPE_STRING :
-                               return cell.getRichStringCellValue().getString();
-
-                       case HSSFCell.CELL_TYPE_BOOLEAN :
-                               return String.valueOf(cell.getBooleanCellValue());
-                       case HSSFCell.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 final class HSSFDataFormatter extends DataFormatter {
 
-               public Object parseObject(String source, ParsePosition pos) {
-                       return df.parseObject(source, pos);
-               }
-       }
 }
index 98af6e07dad1a8e2198afd70dc584bbc0bed196d..8b9a2d1766c463cc515927156a68e8ce45defdc8 100644 (file)
@@ -26,6 +26,8 @@ import org.apache.poi.ddf.EscherOptRecord;
 import org.apache.poi.ddf.EscherProperty;
 import org.apache.poi.hssf.record.EscherAggregate;
 import org.apache.poi.util.StringUtil;
+import org.apache.poi.ss.usermodel.Drawing;
+import org.apache.poi.ss.usermodel.ClientAnchor;
 
 /**
  * The patriarch is the toplevel container for shapes in a sheet.  It does
@@ -34,7 +36,7 @@ import org.apache.poi.util.StringUtil;
  * @author Glen Stampoultzis (glens at apache.org)
  */
 public class HSSFPatriarch
-        implements HSSFShapeContainer
+        implements HSSFShapeContainer, Drawing
 {
     List shapes = new ArrayList();
     HSSFSheet sheet;
@@ -108,7 +110,10 @@ public class HSSFPatriarch
         shapes.add(shape);
         return shape;
     }
-
+    public HSSFPicture createPicture(ClientAnchor anchor, int pictureIndex)
+    {
+        return createPicture((HSSFClientAnchor)anchor, pictureIndex);
+    }
 
     /**
      * Creates a polygon
@@ -187,7 +192,7 @@ public class HSSFPatriarch
         this.x2 = x2;
         this.y2 = y2;
     }
-    
+
     /**
      * Does this HSSFPatriarch contain a chart?
      * (Technically a reference to a chart, since they
@@ -197,7 +202,7 @@ public class HSSFPatriarch
      */
     public boolean containsChart() {
         // TODO - support charts properly in usermodel
-        
+
         // We're looking for a EscherOptRecord
         EscherOptRecord optRecord = (EscherOptRecord)
             boundAggregate.findFirstWithId(EscherOptRecord.RECORD_ID);
@@ -205,7 +210,7 @@ public class HSSFPatriarch
             // No opt record, can't have chart
             return false;
         }
-        
+
         for(Iterator it = optRecord.getEscherProperties().iterator(); it.hasNext();) {
             EscherProperty prop = (EscherProperty)it.next();
             if(prop.getPropertyNumber() == 896 && prop.isComplex()) {
index 8d2dd79641bd23879565c5d209f14dcca6790ded..4b7ac45f1495a2681039475c71288a803e10fbbb 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.poi.hssf.usermodel;
 import org.apache.poi.ddf.EscherBSERecord;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
+import org.apache.poi.ss.usermodel.Picture;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
@@ -38,7 +39,7 @@ import java.util.Iterator;
  * @author Yegor Kozlov (yegor at apache.org)
  */
 public class HSSFPicture
-        extends HSSFSimpleShape
+        extends HSSFSimpleShape implements Picture
 {
     public static final int PICTURE_TYPE_EMF = HSSFWorkbook.PICTURE_TYPE_EMF;                // Windows Enhanced Metafile
     public static final int PICTURE_TYPE_WMF = HSSFWorkbook.PICTURE_TYPE_WMF;                // Windows Metafile
index d13baecf80264f9289dfc583305924a784c048ce..d19cc95147d0743716fb4158c78edd490f6fad9c 100644 (file)
@@ -20,7 +20,6 @@ package org.apache.poi.hssf.util;
 import java.lang.reflect.Field;
 import java.util.Hashtable;
 
-import org.apache.poi.ss.usermodel.Color;
 
 /**
  * Intends to provide support for the very evil index to triplet issue and
@@ -35,7 +34,7 @@ import org.apache.poi.ss.usermodel.Color;
  * @author  Andrew C. Oliver (acoliver at apache dot org)
  * @author  Brian Sanders (bsanders at risklabs dot com) - full default color palette
  */
-public class HSSFColor implements Color {
+public class HSSFColor {
     // TODO make subclass instances immutable
 
     /** Creates a new instance of HSSFColor */
index 2d621eea1b7d3219ef467e8a2ff6fca31c29a454..378f3303ca32f7216ddf680616235d5a75a00408 100755 (executable)
@@ -63,7 +63,7 @@ import java.text.*;
  * @author James May (james dot may at fmr dot com)\r
  *\r
  */\r
-public final class DataFormatter {\r
+public class DataFormatter {\r
 \r
     /** Pattern to find a number format: "0" or  "#" */\r
     private static final Pattern numPattern = Pattern.compile("[0#]+");\r
diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/ClientAnchor.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/ClientAnchor.java
new file mode 100755 (executable)
index 0000000..736f5e6
--- /dev/null
@@ -0,0 +1,138 @@
+/* ====================================================================\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.ss.usermodel;\r
+\r
+/**\r
+ * A client anchor is attached to an excel worksheet.  It anchors against a\r
+ * top-left and bottom-right cell.\r
+ *\r
+ * @author Yegor Kozlov\r
+ */\r
+public interface ClientAnchor {\r
+\r
+    /**\r
+     * Returns the column (0 based) of the first cell.\r
+     *\r
+     * @return 0-based column of the first cell.\r
+     */\r
+    public short getCol1();\r
+\r
+    /**\r
+     * Sets the column (0 based) of the first cell.\r
+     *\r
+     * @param col1 0-based column of the first cell.\r
+     */\r
+    public void setCol1(int col1);\r
+\r
+    /**\r
+     * Returns the column (0 based) of the second cell.\r
+     *\r
+     * @return 0-based column of the second cell.\r
+     */\r
+    public short getCol2();\r
+\r
+    /**\r
+     * Returns the column (0 based) of the second cell.\r
+     *\r
+     * @param col2 0-based column of the second cell.\r
+     */\r
+    public void setCol2(int col2);\r
+\r
+    /**\r
+     * Returns the row (0 based) of the first cell.\r
+     *\r
+     * @return 0-based row of the first cell.\r
+     */\r
+    public int getRow1();\r
+\r
+    /**\r
+     * Returns the row (0 based) of the first cell.\r
+     *\r
+     * @param row1 0-based row of the first cell.\r
+     */\r
+    public void setRow1(int row1);\r
+\r
+    /**\r
+     * Returns the row (0 based) of the second cell.\r
+     *\r
+     * @return 0-based row of the second cell.\r
+     */\r
+    public int getRow2();\r
+\r
+    /**\r
+     * Returns the row (0 based) of the first cell.\r
+     *\r
+     * @param row2 0-based row of the first cell.\r
+     */\r
+    public void setRow2(int row2);\r
+\r
+    /**\r
+     * Returns the x coordinate within the first cell\r
+     *\r
+     * @return the x coordinate within the first cell\r
+     */\r
+    public int getDx1();\r
+\r
+    /**\r
+     * Sets the x coordinate within the first cell\r
+     *\r
+     * @param dx1 the x coordinate within the first cell\r
+     */\r
+    public void setDx1(int dx1);\r
+\r
+    /**\r
+     * Returns the y coordinate within the first cell\r
+     *\r
+     * @return the y coordinate within the first cell\r
+     */\r
+    public int getDy1();\r
+\r
+    /**\r
+     * Sets the y coordinate within the first cell\r
+     *\r
+     * @param dy1 the y coordinate within the first cell\r
+     */\r
+    public void setDy1(int dy1);\r
+\r
+    /**\r
+     * Sets the y coordinate within the second cell\r
+     *\r
+     * @return the y coordinate within the second cell\r
+     */\r
+    public int getDy2();\r
+\r
+    /**\r
+     * Sets the y coordinate within the second cell\r
+     *\r
+     * @param dy2 the y coordinate within the second cell\r
+     */\r
+    public void setDy2(int dy2);\r
+\r
+    /**\r
+     * Returns the x coordinate within the second cell\r
+     *\r
+     * @return the x coordinate within the second cell\r
+     */\r
+    public int getDx2();\r
+\r
+    /**\r
+     * Sets the x coordinate within the second cell\r
+     *\r
+     * @param dx2 the x coordinate within the second cell\r
+     */\r
+    public void setDx2(int dx2);\r
+}\r
diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Color.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Color.java
deleted file mode 100644 (file)
index 2bbcaf1..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* ====================================================================
-   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;
-
-public interface Color {
-
-
-}
\ No newline at end of file
index 89dc88e4afc7c7548bed28ebfa7037b7dfd0556e..758990daf1fd3e6f71b97d0ac914392f3fe42c60 100644 (file)
@@ -51,4 +51,6 @@ public interface CreationHelper {
      * @return a FormulaEvaluator instance
      */
     FormulaEvaluator createFormulaEvaluator();
+    
+    ClientAnchor createClientAnchor();
 }
\ No newline at end of file
diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Drawing.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Drawing.java
new file mode 100755 (executable)
index 0000000..c7b8dc0
--- /dev/null
@@ -0,0 +1,24 @@
+/* ====================================================================\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.ss.usermodel;\r
+\r
+/**\r
+ * @author Yegor Kozlov\r
+ */\r
+public interface Drawing {\r
+    Picture createPicture(ClientAnchor anchor, int pictureIndex);\r
+}\r
diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Picture.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Picture.java
new file mode 100755 (executable)
index 0000000..3e2fab6
--- /dev/null
@@ -0,0 +1,30 @@
+/* ====================================================================\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.ss.usermodel;\r
+\r
+/**\r
+ * Repersents a picture in a SpreadsheetML document\r
+ *\r
+ * @author Yegor Kozlov\r
+ */\r
+public interface Picture {\r
+\r
+    /**\r
+     * Reset the image to the original size.\r
+     */\r
+    void resize();\r
+}\r
index 911f232111e7562f257850b4c24b40539f067266..12c6a6a0c118be828ee8d2af97a1b97d3063a449 100644 (file)
@@ -599,4 +599,6 @@ public interface Sheet extends Iterable<Row> {
      */
     Comment getCellComment(int row, int column);
 
+    Drawing createDrawingPatriarch();
+
 }
index 9e6bd262777fce4e24ed93f8f123e63edcf43ad4..468ff8f6c3b5103bbd6d2e7e3f142f9b70e580a1 100755 (executable)
@@ -17,6 +17,7 @@
 package org.apache.poi.xssf.usermodel;\r
 \r
 import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;\r
+import org.apache.poi.ss.usermodel.ClientAnchor;\r
 \r
 /**\r
  * A client anchor is attached to an excel worksheet.  It anchors against\r
@@ -24,7 +25,7 @@ import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
  *\r
  * @author Yegor Kozlov\r
  */\r
-public class XSSFClientAnchor extends XSSFAnchor {\r
+public class XSSFClientAnchor extends XSSFAnchor implements ClientAnchor {\r
 \r
     /**\r
      * Starting anchor point\r
@@ -88,16 +89,16 @@ public class XSSFClientAnchor extends XSSFAnchor {
         this.cell2 = cell2;\r
     }\r
 \r
-    public int getCol1() {\r
-        return cell1.getCol();\r
+    public short getCol1() {\r
+        return (short)cell1.getCol();\r
     }\r
 \r
     public void setCol1(int col1) {\r
         cell1.setCol(col1);\r
     }\r
 \r
-    public int getCol2() {\r
-        return cell2.getCol();\r
+    public short getCol2() {\r
+        return (short)cell2.getCol();\r
     }\r
 \r
     public void setCol2(int col2) {\r
index fa39817bd410c6af089382f9850edb15bc5691b5..88b9d9a87a6c9e7c1bf923dd53aa0d210a18b146 100644 (file)
@@ -53,4 +53,13 @@ public class XSSFCreationHelper implements CreationHelper {
         return new XSSFFormulaEvaluator(workbook);
     }
 
+    /**
+     * Creates a XSSFClientAnchor. Use this object to position drawing object in a sheet
+     *
+     * @return a XSSFClientAnchor instance
+     * @see org.apache.poi.ss.usermodel.Drawing
+     */
+    public XSSFClientAnchor createClientAnchor(){
+        return new XSSFClientAnchor();
+    }
 }
index b444eb5ff0305a6816970058a9c2d6396009cecf..f6e0a6c3259be2762356edf88c942a8542c5c552 100755 (executable)
@@ -17,6 +17,8 @@
 package org.apache.poi.xssf.usermodel;\r
 \r
 import org.apache.poi.POIXMLDocumentPart;\r
+import org.apache.poi.ss.usermodel.Drawing;\r
+import org.apache.poi.ss.usermodel.ClientAnchor;\r
 import org.apache.xmlbeans.XmlException;\r
 import org.apache.xmlbeans.XmlOptions;\r
 import org.openxml4j.opc.*;\r
@@ -34,7 +36,7 @@ import java.util.HashMap;
  *\r
  * @author Yegor Kozlov\r
  */\r
-public class XSSFDrawing extends POIXMLDocumentPart {\r
+public class XSSFDrawing extends POIXMLDocumentPart implements Drawing {\r
     /**\r
      * Root element of the SpreadsheetML Drawing part\r
      */\r
@@ -146,6 +148,10 @@ public class XSSFDrawing extends POIXMLDocumentPart {
         return shape;\r
     }\r
 \r
+    public XSSFPicture createPicture(ClientAnchor anchor, int pictureIndex){\r
+        return createPicture((XSSFClientAnchor)anchor, pictureIndex);\r
+    }\r
+\r
     /**\r
      * Add the indexed picture to this drawing relations\r
      *\r
index f776aafe379d80044992869f89fa8506700be44b..f786ca3ef489cdb252115aaf6b3b76e0a64190af 100755 (executable)
@@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel;
 import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.*;\r
 import org.openxmlformats.schemas.drawingml.x2006.main.*;\r
 import org.apache.poi.ss.usermodel.Workbook;\r
+import org.apache.poi.ss.usermodel.Picture;\r
 import org.apache.poi.util.POILogger;\r
 import org.apache.poi.util.POILogFactory;\r
 import org.apache.poi.POIXMLDocumentPart;\r
@@ -39,7 +40,7 @@ import java.util.Iterator;
  *\r
  * @author Yegor Kozlov\r
  */\r
-public class XSSFPicture extends XSSFShape {\r
+public class XSSFPicture extends XSSFShape implements Picture {\r
     private static final POILogger logger = POILogFactory.getLogger(XSSFPicture.class);\r
 \r
     /**\r
@@ -132,7 +133,7 @@ public class XSSFPicture extends XSSFShape {
         int row2 = anchor.getRow1() + (pref.getRow2() - pref.getRow1());\r
         int col2 = anchor.getCol1() + (pref.getCol2() - pref.getCol1());\r
 \r
-        anchor.setCol2((short)col2);\r
+        anchor.setCol2(col2);\r
         anchor.setDx1(0);\r
         anchor.setDx2(pref.getDx2());\r
 \r