aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/documentation/content/xdocs/spreadsheet/quick-guide.xml64
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFClientAnchor.java11
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java10
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java609
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java15
-rw-r--r--src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java3
-rw-r--r--src/java/org/apache/poi/hssf/util/HSSFColor.java3
-rwxr-xr-xsrc/java/org/apache/poi/ss/usermodel/DataFormatter.java2
-rwxr-xr-xsrc/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/ClientAnchor.java138
-rw-r--r--src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/CreationHelper.java2
-rwxr-xr-x[-rw-r--r--]src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Drawing.java (renamed from src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Color.java)47
-rwxr-xr-xsrc/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Picture.java30
-rw-r--r--src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java2
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java11
-rw-r--r--src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java9
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java8
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java5
17 files changed, 280 insertions, 689 deletions
diff --git a/src/documentation/content/xdocs/spreadsheet/quick-guide.xml b/src/documentation/content/xdocs/spreadsheet/quick-guide.xml
index 461a5f207f..9b347c7592 100644
--- a/src/documentation/content/xdocs/spreadsheet/quick-guide.xml
+++ b/src/documentation/content/xdocs/spreadsheet/quick-guide.xml
@@ -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>
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFClientAnchor.java b/src/java/org/apache/poi/hssf/usermodel/HSSFClientAnchor.java
index 4d9098d75a..605b5ac3d0 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFClientAnchor.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFClientAnchor.java
@@ -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;
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java
index 0eabcfa706..569ad6ff0e 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java
@@ -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();
+ }
+
}
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java b/src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java
index 67291a22f1..4eead2a5b6 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java
@@ -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);
- }
- }
}
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java b/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
index 98af6e07da..8b9a2d1766 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
@@ -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()) {
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java b/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java
index 8d2dd79641..4b7ac45f14 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java
@@ -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
diff --git a/src/java/org/apache/poi/hssf/util/HSSFColor.java b/src/java/org/apache/poi/hssf/util/HSSFColor.java
index d13baecf80..d19cc95147 100644
--- a/src/java/org/apache/poi/hssf/util/HSSFColor.java
+++ b/src/java/org/apache/poi/hssf/util/HSSFColor.java
@@ -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 */
diff --git a/src/java/org/apache/poi/ss/usermodel/DataFormatter.java b/src/java/org/apache/poi/ss/usermodel/DataFormatter.java
index 2d621eea1b..378f3303ca 100755
--- a/src/java/org/apache/poi/ss/usermodel/DataFormatter.java
+++ b/src/java/org/apache/poi/ss/usermodel/DataFormatter.java
@@ -63,7 +63,7 @@ import java.text.*;
* @author James May (james dot may at fmr dot com)
*
*/
-public final class DataFormatter {
+public class DataFormatter {
/** Pattern to find a number format: "0" or "#" */
private static final Pattern numPattern = Pattern.compile("[0#]+");
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
index 0000000000..736f5e6ff5
--- /dev/null
+++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/ClientAnchor.java
@@ -0,0 +1,138 @@
+/* ====================================================================
+ 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 {
+
+ /**
+ * 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);
+}
diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/CreationHelper.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/CreationHelper.java
index 89dc88e4af..758990daf1 100644
--- a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/CreationHelper.java
+++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/CreationHelper.java
@@ -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/Color.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Drawing.java
index 2bbcaf16e3..c7b8dc0e84 100644..100755
--- a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Color.java
+++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Drawing.java
@@ -1,23 +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;
-
-public interface Color {
-
-
-} \ No newline at end of file
+/* ====================================================================
+ 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);
+}
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
index 0000000000..3e2fab6ac4
--- /dev/null
+++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Picture.java
@@ -0,0 +1,30 @@
+/* ====================================================================
+ 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;
+
+/**
+ * Repersents a picture in a SpreadsheetML document
+ *
+ * @author Yegor Kozlov
+ */
+public interface Picture {
+
+ /**
+ * Reset the image to the original size.
+ */
+ void resize();
+}
diff --git a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
index 911f232111..12c6a6a0c1 100644
--- a/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
+++ b/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
@@ -599,4 +599,6 @@ public interface Sheet extends Iterable<Row> {
*/
Comment getCellComment(int row, int column);
+ Drawing createDrawingPatriarch();
+
}
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
index 9e6bd26277..468ff8f6c3 100755
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
@@ -17,6 +17,7 @@
package org.apache.poi.xssf.usermodel;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
+import org.apache.poi.ss.usermodel.ClientAnchor;
/**
* A client anchor is attached to an excel worksheet. It anchors against
@@ -24,7 +25,7 @@ import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
*
* @author Yegor Kozlov
*/
-public class XSSFClientAnchor extends XSSFAnchor {
+public class XSSFClientAnchor extends XSSFAnchor implements ClientAnchor {
/**
* Starting anchor point
@@ -88,16 +89,16 @@ public class XSSFClientAnchor extends XSSFAnchor {
this.cell2 = cell2;
}
- public int getCol1() {
- return cell1.getCol();
+ public short getCol1() {
+ return (short)cell1.getCol();
}
public void setCol1(int col1) {
cell1.setCol(col1);
}
- public int getCol2() {
- return cell2.getCol();
+ public short getCol2() {
+ return (short)cell2.getCol();
}
public void setCol2(int col2) {
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java
index fa39817bd4..88b9d9a87a 100644
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCreationHelper.java
@@ -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();
+ }
}
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
index b444eb5ff0..f6e0a6c325 100755
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
@@ -17,6 +17,8 @@
package org.apache.poi.xssf.usermodel;
import org.apache.poi.POIXMLDocumentPart;
+import org.apache.poi.ss.usermodel.Drawing;
+import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlOptions;
import org.openxml4j.opc.*;
@@ -34,7 +36,7 @@ import java.util.HashMap;
*
* @author Yegor Kozlov
*/
-public class XSSFDrawing extends POIXMLDocumentPart {
+public class XSSFDrawing extends POIXMLDocumentPart implements Drawing {
/**
* Root element of the SpreadsheetML Drawing part
*/
@@ -146,6 +148,10 @@ public class XSSFDrawing extends POIXMLDocumentPart {
return shape;
}
+ public XSSFPicture createPicture(ClientAnchor anchor, int pictureIndex){
+ return createPicture((XSSFClientAnchor)anchor, pictureIndex);
+ }
+
/**
* Add the indexed picture to this drawing relations
*
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java
index f776aafe37..f786ca3ef4 100755
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java
@@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.*;
import org.openxmlformats.schemas.drawingml.x2006.main.*;
import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.util.POILogger;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.POIXMLDocumentPart;
@@ -39,7 +40,7 @@ import java.util.Iterator;
*
* @author Yegor Kozlov
*/
-public class XSSFPicture extends XSSFShape {
+public class XSSFPicture extends XSSFShape implements Picture {
private static final POILogger logger = POILogFactory.getLogger(XSSFPicture.class);
/**
@@ -132,7 +133,7 @@ public class XSSFPicture extends XSSFShape {
int row2 = anchor.getRow1() + (pref.getRow2() - pref.getRow1());
int col2 = anchor.getCol1() + (pref.getCol2() - pref.getCol1());
- anchor.setCol2((short)col2);
+ anchor.setCol2(col2);
anchor.setDx1(0);
anchor.setDx2(pref.getDx2());