Return-Path: Delivered-To: apmail-poi-commits-archive@locus.apache.org Received: (qmail 98170 invoked from network); 23 May 2008 09:48:59 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 23 May 2008 09:48:59 -0000 Received: (qmail 71551 invoked by uid 500); 23 May 2008 09:49:01 -0000 Delivered-To: apmail-poi-commits-archive@poi.apache.org Received: (qmail 71508 invoked by uid 500); 23 May 2008 09:49:01 -0000 Mailing-List: contact commits-help@poi.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@poi.apache.org Delivered-To: mailing list commits@poi.apache.org Received: (qmail 71499 invoked by uid 99); 23 May 2008 09:49:01 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 23 May 2008 02:49:01 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 23 May 2008 09:48:11 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 500962388A0A; Fri, 23 May 2008 02:48:32 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r659485 [1/3] - in /poi/branches/ooxml: ./ src/documentation/content/xdocs/ src/examples/src/org/apache/poi/hslf/ src/examples/src/org/apache/poi/hslf/usermodel/ src/examples/src/org/apache/poi/hslf/usermodel/examples/ src/java/org/apache/p... Date: Fri, 23 May 2008 09:48:28 -0000 To: commits@poi.apache.org From: nick@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080523094832.500962388A0A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: nick Date: Fri May 23 02:48:23 2008 New Revision: 659485 URL: http://svn.apache.org/viewvc?rev=659485&view=rev Log: Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556, 649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-659484 via svnmerge from https://svn.apache.org:443/repos/asf/poi/trunk ........ r658322 | nick | 2008-05-20 17:37:15 +0100 (Tue, 20 May 2008) | 1 line Fix bug #44977 - Support for AM/PM in excel date formats ........ r658336 | nick | 2008-05-20 17:51:49 +0100 (Tue, 20 May 2008) | 1 line Test which seems to show that bug #44996 is invalid, but not completely sure ........ r658349 | nick | 2008-05-20 17:57:20 +0100 (Tue, 20 May 2008) | 1 line Patch from bug #45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters ........ r658350 | nick | 2008-05-20 18:12:08 +0100 (Tue, 20 May 2008) | 1 line Put abstract write(OutputStream) method on POIDocument ........ r658352 | nick | 2008-05-20 18:17:16 +0100 (Tue, 20 May 2008) | 1 line Patch from bug #45003 - Support embeded HDGF visio documents ........ r658833 | josh | 2008-05-21 20:57:40 +0100 (Wed, 21 May 2008) | 1 line improved toString and refactored toFormulaString on Area(3D)Ptg ........ r658984 | josh | 2008-05-22 04:00:29 +0100 (Thu, 22 May 2008) | 1 line Fixed compiler errors. Other improvements for type safety and immutability. ........ r658986 | josh | 2008-05-22 04:26:25 +0100 (Thu, 22 May 2008) | 1 line Follow on from bug 44675 - regenerated functionMetadata.txt from new ooo excelfileformat.odt ........ r659067 | nick | 2008-05-22 10:51:44 +0100 (Thu, 22 May 2008) | 1 line Example for finding hslf sounds from Yegor ........ r659403 | josh | 2008-05-23 04:56:31 +0100 (Fri, 23 May 2008) | 1 line Fix for 45066 - sheet encoding size mismatch problems ........ r659429 | josh | 2008-05-23 06:28:54 +0100 (Fri, 23 May 2008) | 1 line Fix for bug 45046 - allowed DEFINEDNAME records without EXTERNALBOOK records ........ r659452 | josh | 2008-05-23 07:43:51 +0100 (Fri, 23 May 2008) | 1 line Bug 45041 - improved FormulaParser parse error messages ........ r659455 | josh | 2008-05-23 07:54:46 +0100 (Fri, 23 May 2008) | 1 line Bug 45025 - improved FormulaParser parse error messages (r659452 had wrong bug number) ........ r659462 | josh | 2008-05-23 08:42:14 +0100 (Fri, 23 May 2008) | 1 line Marked out test failure which was fixed by patch for bug 39903 ........ r659478 | josh | 2008-05-23 09:55:48 +0100 (Fri, 23 May 2008) | 1 line Fix for bug 35925 - Missing HSSFColor.TAN from HashTables returned by getIndexHash() and getTripletHash() ........ Added: poi/branches/ooxml/src/examples/src/org/apache/poi/hslf/ - copied from r659478, poi/trunk/src/examples/src/org/apache/poi/hslf/ poi/branches/ooxml/src/examples/src/org/apache/poi/hslf/usermodel/ - copied from r659478, poi/trunk/src/examples/src/org/apache/poi/hslf/usermodel/ poi/branches/ooxml/src/examples/src/org/apache/poi/hslf/usermodel/examples/ - copied from r659478, poi/trunk/src/examples/src/org/apache/poi/hslf/usermodel/examples/ poi/branches/ooxml/src/examples/src/org/apache/poi/hslf/usermodel/examples/SoundFinder.java - copied unchanged from r659478, poi/trunk/src/examples/src/org/apache/poi/hslf/usermodel/examples/SoundFinder.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/data/ex45046-21984.xls - copied unchanged from r659478, poi/trunk/src/testcases/org/apache/poi/hssf/data/ex45046-21984.xls poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java - copied unchanged from r659478, poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestLinkTable.java Modified: poi/branches/ooxml/ (props changed) poi/branches/ooxml/build.xml poi/branches/ooxml/src/documentation/content/xdocs/changes.xml poi/branches/ooxml/src/documentation/content/xdocs/status.xml poi/branches/ooxml/src/java/org/apache/poi/POIDocument.java poi/branches/ooxml/src/java/org/apache/poi/hssf/model/FormulaParser.java poi/branches/ooxml/src/java/org/apache/poi/hssf/model/LinkTable.java poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Workbook.java poi/branches/ooxml/src/java/org/apache/poi/hssf/record/DBCellRecord.java poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java poi/branches/ooxml/src/java/org/apache/poi/hssf/util/AreaReference.java poi/branches/ooxml/src/java/org/apache/poi/hssf/util/HSSFColor.java poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata-asGenerated.txt poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hdgf/HDGFDiagram.java poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hwpf/model/FSPATable.java poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hwpf/model/FileInformationBlock.java poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestSheet.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/function/ExcelFileFormatDocFunctionExtractor.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/function/TestParseMissingBuiltInFuncs.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/function/TestReadMissingBuiltInFuncs.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/AllUserModelTests.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestSheetHiding.java Propchange: poi/branches/ooxml/ ------------------------------------------------------------------------------ --- svnmerge-integrated (original) +++ svnmerge-integrated Fri May 23 02:48:23 2008 @@ -1 +1 @@ -/poi/trunk:1-638784,638786-639486,639488-639601,639603-640056,640058-642562,642564-642566,642568-642574,642576-642736,642739-650914,650916-658312 +/poi/trunk:1-638784,638786-639486,639488-639601,639603-640056,640058-642562,642564-642566,642568-642574,642576-642736,642739-650914,650916-659484 Modified: poi/branches/ooxml/build.xml URL: http://svn.apache.org/viewvc/poi/branches/ooxml/build.xml?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/build.xml (original) +++ poi/branches/ooxml/build.xml Fri May 23 02:48:23 2008 @@ -245,6 +245,7 @@ + Modified: poi/branches/ooxml/src/documentation/content/xdocs/changes.xml URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/documentation/content/xdocs/changes.xml?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/documentation/content/xdocs/changes.xml (original) +++ poi/branches/ooxml/src/documentation/content/xdocs/changes.xml Fri May 23 02:48:23 2008 @@ -44,6 +44,12 @@ Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx + 45025 - improved FormulaParser parse error messages + 45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable + 45066 - fixed sheet encoding size mismatch problems + 45003 - Support embeded HDGF visio documents + 45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters + 44977 - Support for AM/PM in excel date formats Support for specifying a policy to HSSF on missing / blank cells when fetching 44937 - Partial support for extracting Escher images from HWPF files 44824 - Avoid an infinite loop when reading some HWPF pictures Modified: poi/branches/ooxml/src/documentation/content/xdocs/status.xml URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/documentation/content/xdocs/status.xml?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/documentation/content/xdocs/status.xml (original) +++ poi/branches/ooxml/src/documentation/content/xdocs/status.xml Fri May 23 02:48:23 2008 @@ -41,6 +41,12 @@ Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx + 45025 - improved FormulaParser parse error messages + 45046 - allowed EXTERNALBOOK(0x01AE) to be optional in the LinkTable + 45066 - fixed sheet encoding size mismatch problems + 45003 - Support embeded HDGF visio documents + 45001 - Partial fix for HWPF Range.insertBefore() and Range.delete() with unicode characters + 44977 - Support for AM/PM in excel date formats Support for specifying a policy to HSSF on missing / blank cells when fetching 44937 - Partial support for extracting Escher images from HWPF files 44824 - Avoid an infinite loop when reading some HWPF pictures Modified: poi/branches/ooxml/src/java/org/apache/poi/POIDocument.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/POIDocument.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/POIDocument.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/POIDocument.java Fri May 23 02:48:23 2008 @@ -20,6 +20,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.util.Iterator; import java.util.List; @@ -191,6 +192,11 @@ System.err.println("Couldn't write property set with name " + name + " as not supported by HPSF yet"); } } + + /** + * Writes the document out to the specified output stream + */ + public abstract void write(OutputStream out) throws IOException; /** * Copies nodes from one POIFS to the other minus the excepts Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/model/FormulaParser.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/model/FormulaParser.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/model/FormulaParser.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/model/FormulaParser.java Fri May 23 02:48:23 2008 @@ -55,7 +55,7 @@ */ static final class FormulaParseException extends RuntimeException { // This class was given package scope until it would become clear that it is useful to - // general client code. + // general client code. public FormulaParseException(String msg) { super(msg); } @@ -127,42 +127,34 @@ // Just return if so and reset 'look' to something to keep // SkipWhitespace from spinning look = (char)0; - } + } pointer++; //System.out.println("Got char: "+ look); } /** Report What Was Expected */ private RuntimeException expected(String s) { - String msg = "Parse error near char " + (pointer-1) + "'" + look + "'" + String msg = "Parse error near char " + (pointer-1) + " '" + look + "'" + " in specified formula '" + formulaString + "'. Expected " + s; return new FormulaParseException(msg); } - - /** Recognize an Alpha Character */ private boolean IsAlpha(char c) { return Character.isLetter(c) || c == '$' || c=='_'; } - - /** Recognize a Decimal Digit */ private boolean IsDigit(char c) { - //System.out.println("Checking digit for"+c); return Character.isDigit(c); } - - /** Recognize an Alphanumeric */ private boolean IsAlNum(char c) { return (IsAlpha(c) || IsDigit(c)); } - /** Recognize White Space */ private boolean IsWhite( char c) { return (c ==' ' || c== TAB); @@ -178,7 +170,7 @@ /** * Consumes the next input character if it is equal to the one specified otherwise throws an * unchecked exception. This method does not consume whitespace (before or after the - * matched character). + * matched character). */ private void Match(char x) { if (look != x) { @@ -218,7 +210,6 @@ return Token.toString(); } - /** Get a Number */ private String GetNum() { StringBuffer value = new StringBuffer(); @@ -281,18 +272,18 @@ // This can be either a cell ref or a named range // Try to spot which it is boolean cellRef = CELL_REFERENCE_PATTERN.matcher(name).matches(); - + if (cellRef) { return new ReferencePtg(name); } for(int i = 0; i < book.getNumberOfNames(); i++) { // named range name matching is case insensitive - if(book.getNameAt(i).getNameName().equalsIgnoreCase(name)) { + if(book.getNameAt(i).getNameName().equalsIgnoreCase(name)) { return new NamePtg(name, book); } } - throw new FormulaParseException("Found reference to named range \"" + throw new FormulaParseException("Found reference to named range \"" + name + "\", but that named range wasn't defined!"); } @@ -307,19 +298,19 @@ /** * Note - Excel function names are 'case aware but not case sensitive'. This method may end * up creating a defined name record in the workbook if the specified name is not an internal - * Excel function, and has not been encountered before. - * - * @param name case preserved function name (as it was entered/appeared in the formula). + * Excel function, and has not been encountered before. + * + * @param name case preserved function name (as it was entered/appeared in the formula). */ private Ptg function(String name) { int numArgs =0 ; - // Note regarding parameter - + // Note regarding parameter - if(!AbstractFunctionPtg.isInternalFunctionName(name)) { // external functions get a Name token which points to a defined name record NamePtg nameToken = new NamePtg(name, this.book); - + // in the token tree, the name is more or less the first argument - numArgs++; + numArgs++; tokens.add(nameToken); } //average 2 args per function @@ -477,26 +468,25 @@ private static boolean isArgumentDelimiter(char ch) { return ch == ',' || ch == ')'; } - + /** get arguments to a function */ private int Arguments(List argumentPointers) { SkipWhite(); if(look == ')') { return 0; } - + boolean missedPrevArg = true; - int numArgs = 0; - while(true) { + while (true) { SkipWhite(); - if(isArgumentDelimiter(look)) { - if(missedPrevArg) { + if (isArgumentDelimiter(look)) { + if (missedPrevArg) { tokens.add(new MissingArgPtg()); addArgumentPointer(argumentPointers); numArgs++; } - if(look == ')') { + if (look == ')') { break; } Match(','); @@ -507,6 +497,10 @@ addArgumentPointer(argumentPointers); numArgs++; missedPrevArg = false; + SkipWhite(); + if (!isArgumentDelimiter(look)) { + throw expected("',' or ')'"); + } } return numArgs; } @@ -524,7 +518,7 @@ tokens.add(new PowerPtg()); } } - + private void percentFactor() { tokens.add(parseSimpleFactor()); while(true) { @@ -536,8 +530,8 @@ tokens.add(new PercentPtg()); } } - - + + /** * factors (without ^ or % ) */ @@ -561,9 +555,6 @@ return new ParenthesisPtg(); case '"': return parseStringLiteral(); - case ',': - case ')': - return new MissingArgPtg(); // TODO - not quite the right place to recognise a missing arg } if (IsAlpha(look) || look == '\''){ return parseIdent(); @@ -707,10 +698,9 @@ } - private StringPtg parseStringLiteral() - { + private StringPtg parseStringLiteral() { Match('"'); - + StringBuffer token = new StringBuffer(); while (true) { if (look == '"') { @@ -745,7 +735,7 @@ return; // finished with Term } } - + private void comparisonExpression() { concatExpression(); while (true) { @@ -787,7 +777,7 @@ } return new LessThanPtg(); } - + private void concatExpression() { additiveExpression(); @@ -801,7 +791,7 @@ tokens.add(new ConcatPtg()); } } - + /** Parse and Translate an Expression */ private void additiveExpression() { @@ -838,8 +828,9 @@ **/ - /** API call to execute the parsing of the formula - * + /** + * API call to execute the parsing of the formula + * @deprecated use Ptg[] FormulaParser.parse(String, HSSFWorkbook) directly */ public void parse() { pointer=0; @@ -847,8 +838,8 @@ comparisonExpression(); if(pointer <= formulaLength) { - String msg = "Unused input [" + formulaString.substring(pointer-1) - + "] after attempting to parse the formula [" + formulaString + "]"; + String msg = "Unused input [" + formulaString.substring(pointer-1) + + "] after attempting to parse the formula [" + formulaString + "]"; throw new FormulaParseException(msg); } } @@ -863,11 +854,12 @@ * a result of the parsing */ public Ptg[] getRPNPtg() { - return getRPNPtg(FORMULA_TYPE_CELL); + return getRPNPtg(FORMULA_TYPE_CELL); } public Ptg[] getRPNPtg(int formulaType) { Node node = createTree(); + // RVA is for 'operand class': 'reference', 'value', 'array' setRootLevelRVA(node, formulaType); setParameterRVA(node,formulaType); return (Ptg[]) tokens.toArray(new Ptg[0]); @@ -948,7 +940,7 @@ } } /** - * Convience method which takes in a list then passes it to the + * Convenience method which takes in a list then passes it to the * other toFormulaString signature. * @param book workbook for 3D and named references * @param lptgs list of Ptg, can be null or empty @@ -963,7 +955,7 @@ return retval; } /** - * Convience method which takes in a list then passes it to the + * Convenience method which takes in a list then passes it to the * other toFormulaString signature. Works on the current * workbook for 3D and named references * @param lptgs list of Ptg, can be null or empty @@ -1011,7 +1003,7 @@ continue; // but if it ever did, care must be taken: // tAttrSpace comes *before* the operand it applies to, which may be consistent - // with how the formula text appears but is against the RPN ordering assumed here + // with how the formula text appears but is against the RPN ordering assumed here } if (attrPtg.isSemiVolatile()) { // similar to tAttrSpace - RPN is violated @@ -1038,7 +1030,7 @@ stack.push(o.toFormulaString(operands)); } if(stack.isEmpty()) { - // inspection of the code above reveals that every stack.pop() is followed by a + // inspection of the code above reveals that every stack.pop() is followed by a // stack.push(). So this is either an internal error or impossible. throw new IllegalStateException("Stack underflow"); } Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/model/LinkTable.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/model/LinkTable.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/model/LinkTable.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/model/LinkTable.java Fri May 23 02:48:23 2008 @@ -41,7 +41,7 @@ * * In BIFF8 the Link Table consists of *
    - *
  • one or more EXTERNALBOOK Blocks

    + *

  • zero or more EXTERNALBOOK Blocks

    * each consisting of *

      *
    • exactly one EXTERNALBOOK (0x01AE) record
    • @@ -55,7 +55,7 @@ * *
    *
  • - *
  • exactly one EXTERNSHEET (0x0017) record
  • + *
  • zero or one EXTERNSHEET (0x0017) record
  • *
  • zero or more DEFINEDNAME (0x0018) records
  • *
* @@ -63,6 +63,7 @@ * @author Josh Micich */ final class LinkTable { + // TODO make this class into a record aggregate private static final class CRNBlock { @@ -79,8 +80,8 @@ _crns = crns; } public CRNRecord[] getCrns() { - return (CRNRecord[]) _crns.clone(); - } + return (CRNRecord[]) _crns.clone(); + } } private static final class ExternalBookBlock { @@ -136,16 +137,19 @@ while(rs.peekNextClass() == SupBookRecord.class) { temp.add(new ExternalBookBlock(rs)); } - if(temp.size() < 1) { - throw new RuntimeException("Need at least one EXTERNALBOOK blocks"); - } + _externalBookBlocks = new ExternalBookBlock[temp.size()]; temp.toArray(_externalBookBlocks); temp.clear(); - - // If link table is present, there is always 1 of ExternSheetRecord - Record next = rs.getNext(); - _externSheetRecord = (ExternSheetRecord)next; + + if (_externalBookBlocks.length > 0) { + // If any ExternalBookBlock present, there is always 1 of ExternSheetRecord + Record next = rs.getNext(); + _externSheetRecord = (ExternSheetRecord) next; + } else { + _externSheetRecord = null; + } + _definedNames = new ArrayList(); // collect zero or more DEFINEDNAMEs id=0x18 while(rs.peekNextClass() == NameRecord.class) { @@ -222,7 +226,7 @@ public void addName(NameRecord name) { _definedNames.add(name); - // TODO - this is messy + // TODO - this is messy // Not the most efficient way but the other way was causing too many bugs int idx = findFirstRecordLocBySid(ExternSheetRecord.sid); if (idx == -1) idx = findFirstRecordLocBySid(SupBookRecord.sid); @@ -242,8 +246,8 @@ public int getSheetIndexFromExternSheetIndex(int externSheetNumber) { if (externSheetNumber >= _externSheetRecord.getNumOfREFStructures()) { - return -1; - } + return -1; + } return _externSheetRecord.getREFRecordAt(externSheetNumber).getIndexToFirstSupBook(); } @@ -265,7 +269,7 @@ ExternSheetSubRecord esr = _externSheetRecord.getREFRecordAt(i); if (esr.getIndexToFirstSupBook() == sheetNumber - && esr.getIndexToLastSupBook() == sheetNumber){ + && esr.getIndexToLastSupBook() == sheetNumber){ return i; } } Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java Fri May 23 02:48:23 2008 @@ -96,8 +96,8 @@ protected List condFormatting = new ArrayList(); /** Add an UncalcedRecord if not true indicating formulas have not been calculated */ - protected boolean uncalced = false; - + protected boolean _isUncalced = false; + public static final byte PANE_LOWER_RIGHT = (byte)0; public static final byte PANE_UPPER_RIGHT = (byte)1; public static final byte PANE_LOWER_LEFT = (byte)2; @@ -162,7 +162,7 @@ } } else if (rec.getSid() == UncalcedRecord.sid) { - retval.uncalced = true; + retval._isUncalced = true; } else if (rec.getSid() == DimensionsRecord.sid) { @@ -329,16 +329,8 @@ } } retval.records = records; -// if (retval.rows == null) -// { -// retval.rows = new RowRecordsAggregate(); -// } retval.checkCells(); retval.checkRows(); -// if (retval.cells == null) -// { -// retval.cells = new ValueRecordsAggregate(); -// } if (log.check( POILogger.DEBUG )) log.log(POILogger.DEBUG, "sheet createSheet (existing file) exited"); return retval; @@ -816,17 +808,17 @@ // Once the rows have been found in the list of records, start // writing out the blocked row information. This includes the DBCell references if (record instanceof RowRecordsAggregate) { - pos += ((RowRecordsAggregate)record).serialize(pos, data, cells); // rec.length; + pos += ((RowRecordsAggregate)record).serialize(pos, data, cells); } else if (record instanceof ValueRecordsAggregate) { //Do nothing here. The records were serialized during the RowRecordAggregate block serialization } else { - pos += record.serialize(pos, data ); // rec.length; + pos += record.serialize(pos, data ); } // If the BOF record was just serialized then add the IndexRecord if (record.getSid() == BOFRecord.sid) { // Add an optional UncalcedRecord - if (uncalced) { + if (_isUncalced) { UncalcedRecord rec = new UncalcedRecord(); pos += rec.serialize(pos, data); } @@ -837,31 +829,10 @@ pos += serializeIndexRecord(k, pos, data); } } - - //// uncomment to test record sizes //// -// System.out.println( record.getClass().getName() ); -// byte[] data2 = new byte[record.getRecordSize()]; -// record.serialize(0, data2 ); // rec.length; -// if (LittleEndian.getUShort(data2, 2) != record.getRecordSize() - 4 -// && record instanceof RowRecordsAggregate == false -// && record instanceof ValueRecordsAggregate == false -// && record instanceof EscherAggregate == false) -// { -// throw new RuntimeException("Blah!!! Size off by " + ( LittleEndian.getUShort(data2, 2) - record.getRecordSize() - 4) + " records."); -// } - -//asd: int len = record.serialize(pos + offset, data ); - - ///// DEBUG BEGIN ///// -//asd: if (len != record.getRecordSize()) -//asd: throw new IllegalStateException("Record size does not match serialized bytes. Serialized size = " + len + " but getRecordSize() returns " + record.getRecordSize() + ". Record object is " + record.getClass()); - ///// DEBUG END ///// - -//asd: pos += len; // rec.length; - } - if (log.check( POILogger.DEBUG )) + if (log.check( POILogger.DEBUG )) { log.log(POILogger.DEBUG, "Sheet.serialize returning "); + } return pos-offset; } @@ -875,10 +846,17 @@ for (int j = BOFRecordIndex+1; j < records.size(); j++) { Record tmpRec = (( Record ) records.get(j)); - if (tmpRec instanceof RowRecordsAggregate) - break; + if (tmpRec instanceof UncalcedRecord) { + continue; + } + if (tmpRec instanceof RowRecordsAggregate) { + break; + } sheetRecSize+= tmpRec.getRecordSize(); } + if (_isUncalced) { + sheetRecSize += UncalcedRecord.getStaticRecordSize(); + } //Add the references to the DBCells in the IndexRecord (one for each block) int blockCount = rows.getRowBlockCount(); //Calculate the size of this IndexRecord @@ -2017,31 +1995,33 @@ { int retval = 0; - for ( int k = 0; k < records.size(); k++ ) - { - retval += ( (Record) records.get( k ) ).getRecordSize(); + for ( int k = 0; k < records.size(); k++) { + Record record = (Record) records.get(k); + if (record instanceof UncalcedRecord) { + // skip the UncalcedRecord if present, it's only encoded if the isUncalced flag is set + continue; + } + retval += record.getRecordSize(); } - //Add space for the IndexRecord if (rows != null) { - final int blocks = rows.getRowBlockCount(); - retval += IndexRecord.getRecordSizeForBlockCount(blocks); - - //Add space for the DBCell records - //Once DBCell per block. - //8 bytes per DBCell (non variable section) - //2 bytes per row reference - retval += (8 * blocks); - for (Iterator itr = rows.getIterator(); itr.hasNext();) { - RowRecord row = (RowRecord)itr.next(); - if (cells != null && cells.rowHasCells(row.getRowNumber())) - retval += 2; + // Add space for the IndexRecord and DBCell records + final int nBlocks = rows.getRowBlockCount(); + int nRows = 0; + if (cells != null) { + for (Iterator itr = rows.getIterator(); itr.hasNext();) { + RowRecord row = (RowRecord)itr.next(); + if (cells.rowHasCells(row.getRowNumber())) { + nRows++; + } + } } + retval += IndexRecord.getRecordSizeForBlockCount(nBlocks); + retval += DBCellRecord.calculateSizeOfRecords(nBlocks, nRows); } // Add space for UncalcedRecord - if (uncalced) { + if (_isUncalced) { retval += UncalcedRecord.getStaticRecordSize(); } - return retval; } @@ -2518,13 +2498,13 @@ * @return whether an uncalced record must be inserted or not at generation */ public boolean getUncalced() { - return uncalced; + return _isUncalced; } /** * @param uncalced whether an uncalced record must be inserted or not at generation */ public void setUncalced(boolean uncalced) { - this.uncalced = uncalced; + this._isUncalced = uncalced; } /** Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Workbook.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Workbook.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Workbook.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Workbook.java Fri May 23 02:48:23 2008 @@ -191,12 +191,11 @@ case ExternSheetRecord.sid : throw new RuntimeException("Extern sheet is part of LinkTable"); case NameRecord.sid : - throw new RuntimeException("DEFINEDNAME is part of LinkTable"); case SupBookRecord.sid : + // LinkTable can start with either of these if (log.check( POILogger.DEBUG )) log.log(DEBUG, "found SupBook record at " + k); retval.linkTable = new LinkTable(recs, k, retval.records); - // retval.records.supbookpos = k; k+=retval.linkTable.getRecordCount() - 1; continue; case FormatRecord.sid : Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/DBCellRecord.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/DBCellRecord.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/DBCellRecord.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/DBCellRecord.java Fri May 23 02:48:23 2008 @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.hssf.record; @@ -29,10 +27,7 @@ * @author Jason Height * @version 2.0-pre */ - -public class DBCellRecord - extends Record -{ +public final class DBCellRecord extends Record { public final static int BLOCK_SIZE = 32; public final static short sid = 0xd7; private int field_1_row_offset; @@ -46,7 +41,6 @@ * Constructs a DBCellRecord and sets its fields appropriately * @param in the RecordInputstream to read the record from */ - public DBCellRecord(RecordInputStream in) { super(in); @@ -78,7 +72,6 @@ * * @param offset offset to the start of the first cell in the next DBCell block */ - public void setRowOffset(int offset) { field_1_row_offset = offset; @@ -108,7 +101,6 @@ * * @return rowoffset to the start of the first cell in the next DBCell block */ - public int getRowOffset() { return field_1_row_offset; @@ -120,7 +112,6 @@ * @param index of the cell offset to retrieve * @return celloffset from the celloffset array */ - public short getCellOffsetAt(int index) { return field_2_cell_offsets[ index ]; @@ -131,7 +122,6 @@ * * @return number of cell offsets */ - public int getNumCellOffsets() { return field_2_cell_offsets.length; @@ -175,9 +165,15 @@ return 8 + (getNumCellOffsets() * 2); } - /** Returns the size of a DBCellRecord when it needs to reference a certain number of rows*/ - public static int getRecordSizeForRows(int rows) { - return 8 + (rows * 2); + /** + * @returns the size of the group of DBCellRecords needed to encode + * the specified number of blocks and rows + */ + public static int calculateSizeOfRecords(int nBlocks, int nRows) { + // One DBCell per block. + // 8 bytes per DBCell (non variable section) + // 2 bytes per row reference + return nBlocks * 8 + nRows * 2; } public short getSid() Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java Fri May 23 02:48:23 2008 @@ -27,7 +27,7 @@ /** - * Title: Area 3D Ptg - 3D referecnce (Sheet + Area)

+ * Title: Area 3D Ptg - 3D reference (Sheet + Area)

* Description: Defined a area in Extern Sheet.

* REFERENCE:

* @author Libin Roman (Vista Portal LDT. Developer) @@ -35,7 +35,6 @@ * @author Jason Height (jheight at chariot dot net dot au) * @version 1.0-pre */ - public class Area3DPtg extends Ptg implements AreaI { public final static byte sid = 0x3b; @@ -84,23 +83,15 @@ setExternSheetIndex(externalSheetIndex); } - public String toString() - { - StringBuffer buffer = new StringBuffer(); - - buffer.append( "AreaPtg\n" ); - buffer.append( "Index to Extern Sheet = " + getExternSheetIndex() ).append( "\n" ); - buffer.append( "firstRow = " + getFirstRow() ).append( "\n" ); - buffer.append( "lastRow = " + getLastRow() ).append( "\n" ); - buffer.append( "firstCol = " + getFirstColumn() ).append( "\n" ); - buffer.append( "lastCol = " + getLastColumn() ).append( "\n" ); - buffer.append( "firstColRel= " - + isFirstRowRelative() ).append( "\n" ); - buffer.append( "lastColRowRel = " - + isLastRowRelative() ).append( "\n" ); - buffer.append( "firstColRel = " + isFirstColRelative() ).append( "\n" ); - buffer.append( "lastColRel = " + isLastColRelative() ).append( "\n" ); - return buffer.toString(); + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(getClass().getName()); + sb.append(" ["); + sb.append("sheetIx=").append(getExternSheetIndex()); + sb.append(" ! "); + sb.append(AreaReference.formatAsString(this)); + sb.append("]"); + return sb.toString(); } public void writeBytes( byte[] array, int offset ) @@ -284,7 +275,7 @@ } // Now the normal area bit - retval.append( AreaPtg.toFormulaString(this, book) ); + retval.append(AreaReference.formatAsString(this)); // All done return retval.toString(); @@ -326,6 +317,7 @@ public int hashCode() { + // TODO - hashCode seems to be unused int result; result = (int) field_1_index_extern_sheet; result = 29 * result + (int) field_2_first_row; Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java Fri May 23 02:48:23 2008 @@ -114,23 +114,13 @@ return "AreaPtg"; } - public String toString() - { - StringBuffer buffer = new StringBuffer(); - - buffer.append(getAreaPtgName()); - buffer.append("\n"); - buffer.append("firstRow = " + getFirstRow()).append("\n"); - buffer.append("lastRow = " + getLastRow()).append("\n"); - buffer.append("firstCol = " + getFirstColumn()).append("\n"); - buffer.append("lastCol = " + getLastColumn()).append("\n"); - buffer.append("firstColRowRel= " - + isFirstRowRelative()).append("\n"); - buffer.append("lastColRowRel = " - + isLastRowRelative()).append("\n"); - buffer.append("firstColRel = " + isFirstColRelative()).append("\n"); - buffer.append("lastColRel = " + isLastColRelative()).append("\n"); - return buffer.toString(); + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(getClass().getName()); + sb.append(" ["); + sb.append(AreaReference.formatAsString(this)); + sb.append("]"); + return sb.toString(); } public void writeBytes(byte [] array, int offset) { @@ -307,19 +297,8 @@ field_4_last_column = column; } - public String toFormulaString(Workbook book) - { - return toFormulaString(this, book); - } - protected static String toFormulaString(AreaI area, Workbook book) { - CellReference topLeft = new CellReference(area.getFirstRow(),area.getFirstColumn(),!area.isFirstRowRelative(),!area.isFirstColRelative()); - CellReference botRight = new CellReference(area.getLastRow(),area.getLastColumn(),!area.isLastRowRelative(),!area.isLastColRelative()); - - if(AreaReference.isWholeColumnReference(topLeft, botRight)) { - return (new AreaReference(topLeft, botRight)).formatAsString(); - } else { - return topLeft.formatAsString() + ":" + botRight.formatAsString(); - } + public String toFormulaString(Workbook book) { + return AreaReference.formatAsString(this); } public byte getDefaultOperandClass() { Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java Fri May 23 02:48:23 2008 @@ -15,12 +15,6 @@ limitations under the License. ==================================================================== */ - -/* - * HSSFWorkbook.java - * - * Created on September 30, 2001, 3:37 PM - */ package org.apache.poi.hssf.usermodel; import java.io.ByteArrayInputStream; @@ -81,7 +75,6 @@ * @author Shawn Laubach (slaubach at apache dot org) * @version 2.0-pre */ - public class HSSFWorkbook extends POIDocument implements org.apache.poi.ss.usermodel.Workbook { private static final int DEBUG = POILogger.DEBUG; @@ -105,7 +98,7 @@ * this holds the HSSFSheet objects attached to this workbook */ - protected ArrayList sheets; + protected List _sheets; /** * this holds the HSSFName objects attached to this workbook @@ -159,7 +152,7 @@ { super(null, null); workbook = book; - sheets = new ArrayList( INITIAL_CAPACITY ); + _sheets = new ArrayList( INITIAL_CAPACITY ); names = new ArrayList( INITIAL_CAPACITY ); } @@ -250,7 +243,7 @@ this.directory = null; } - sheets = new ArrayList(INITIAL_CAPACITY); + _sheets = new ArrayList(INITIAL_CAPACITY); names = new ArrayList(INITIAL_CAPACITY); // Grab the data from the workbook stream, however @@ -280,7 +273,7 @@ HSSFSheet hsheet = new HSSFSheet(this, sheet); - sheets.add(hsheet); + _sheets.add(hsheet); // workbook.setSheetName(sheets.size() -1, "Sheet"+sheets.size()); } @@ -378,12 +371,12 @@ */ public void setSheetOrder(String sheetname, int pos ) { - sheets.add(pos,sheets.remove(getSheetIndex(sheetname))); + _sheets.add(pos,_sheets.remove(getSheetIndex(sheetname))); workbook.setSheetOrder(sheetname, pos); } private void validateSheetIndex(int index) { - int lastSheetIx = sheets.size() - 1; + int lastSheetIx = _sheets.size() - 1; if (index < 0 || index > lastSheetIx) { throw new IllegalArgumentException("Sheet index (" + index +") is out of range (0.." + lastSheetIx + ")"); @@ -397,7 +390,7 @@ public void setSelectedTab(int index) { validateSheetIndex(index); - int nSheets = sheets.size(); + int nSheets = _sheets.size(); for (int i=0; i (sheets.size() - 1)) - { - throw new RuntimeException("Sheet out of bounds"); } - - workbook.setSheetName( sheet, name); + validateSheetIndex(sheetIx); + workbook.setSheetName(sheetIx, name); } @@ -533,15 +522,12 @@ * or contains /\?*[] * @param sheet number (0 based) */ - public void setSheetName( int sheet, String name, short encoding ) + public void setSheetName(int sheetIx, String name, short encoding) { - if (workbook.doesContainsSheetName( name, sheet )) + if (workbook.doesContainsSheetName( name, sheetIx )) { throw new IllegalArgumentException( "The workbook already contains a sheet with this name" ); - - if (sheet > (sheets.size() - 1)) - { - throw new RuntimeException("Sheet out of bounds"); } + validateSheetIndex(sheetIx); switch ( encoding ) { case ENCODING_COMPRESSED_UNICODE: @@ -553,51 +539,39 @@ throw new RuntimeException( "Unsupported encoding" ); } - workbook.setSheetName( sheet, name, encoding ); + workbook.setSheetName( sheetIx, name, encoding ); } /** * get the sheet name - * @param sheet Number + * @param sheetIx Number * @return Sheet name */ - - public String getSheetName(int sheet) + public String getSheetName(int sheetIx) { - if (sheet > (sheets.size() - 1)) - { - throw new RuntimeException("Sheet out of bounds"); - } - return workbook.getSheetName(sheet); + validateSheetIndex(sheetIx); + return workbook.getSheetName(sheetIx); } /** * check whether a sheet is hidden - * @param sheet Number + * @param sheetIx Number * @return True if sheet is hidden */ - - public boolean isSheetHidden(int sheet) { - if (sheet > (sheets.size() - 1)) - { - throw new RuntimeException("Sheet out of bounds"); - } - return workbook.isSheetHidden(sheet); + public boolean isSheetHidden(int sheetIx) { + validateSheetIndex(sheetIx); + return workbook.isSheetHidden(sheetIx); } /** * Hide or unhide a sheet * - * @param sheetnum The sheet number + * @param sheetIx The sheet index * @param hidden True to mark the sheet as hidden, false otherwise */ - - public void setSheetHidden(int sheet, boolean hidden) { - if (sheet > (sheets.size() - 1)) - { - throw new RuntimeException("Sheet out of bounds"); - } - workbook.setSheetHidden(sheet,hidden); + public void setSheetHidden(int sheetIx, boolean hidden) { + validateSheetIndex(sheetIx); + workbook.setSheetHidden(sheetIx, hidden); } /* @@ -619,12 +593,12 @@ /** Returns the index of the given sheet * @param sheet the sheet to look up - * @return index of the sheet (0 based) + * @return index of the sheet (0 based). -1 if not found */ public int getSheetIndex(org.apache.poi.ss.usermodel.Sheet sheet) { - for(int i=0; i= 'A' && parts[0].charAt(0) <= 'Z' && - parts[1].charAt(0) >= 'A' && parts[1].charAt(0) <= 'Z') { - // Represented internally as x$1 to x$65536 - // which is the maximum range of rows - parts[0] = parts[0] + "$1"; - parts[1] = parts[1] + "$65536"; + parts[1].length() == 1 && + parts[0].charAt(0) >= 'A' && parts[0].charAt(0) <= 'Z' && + parts[1].charAt(0) >= 'A' && parts[1].charAt(0) <= 'Z') { + // Represented internally as x$1 to x$65536 + // which is the maximum range of rows + parts[0] = parts[0] + "$1"; + parts[1] = parts[1] + "$65536"; } _firstCell = new CellReference(parts[0]); @@ -74,9 +75,9 @@ * Creates an area ref from a pair of Cell References. */ public AreaReference(CellReference topLeft, CellReference botRight) { - _firstCell = topLeft; - _lastCell = botRight; - _isSingleCell = false; + _firstCell = topLeft; + _lastCell = botRight; + _isSingleCell = false; } /** @@ -98,17 +99,17 @@ * such as C:C or D:G ? */ public static boolean isWholeColumnReference(CellReference topLeft, CellReference botRight) { - // These are represented as something like - // C$1:C$65535 or D$1:F$0 - // i.e. absolute from 1st row to 0th one - if(topLeft.getRow() == 0 && topLeft.isRowAbsolute() && - botRight.getRow() == 65535 && botRight.isRowAbsolute()) { - return true; - } - return false; + // These are represented as something like + // C$1:C$65535 or D$1:F$0 + // i.e. absolute from 1st row to 0th one + if(topLeft.getRow() == 0 && topLeft.isRowAbsolute() && + botRight.getRow() == 65535 && botRight.isRowAbsolute()) { + return true; + } + return false; } public boolean isWholeColumnReference() { - return isWholeColumnReference(_firstCell, _lastCell); + return isWholeColumnReference(_firstCell, _lastCell); } /** @@ -155,26 +156,26 @@ * Returns a reference to every cell covered by this area */ public CellReference[] getAllReferencedCells() { - // Special case for single cell reference - if(_isSingleCell) { - return new CellReference[] { _firstCell, }; - } + // Special case for single cell reference + if(_isSingleCell) { + return new CellReference[] { _firstCell, }; + } - // Interpolate between the two + // Interpolate between the two int minRow = Math.min(_firstCell.getRow(), _lastCell.getRow()); - int maxRow = Math.max(_firstCell.getRow(), _lastCell.getRow()); - int minCol = Math.min(_firstCell.getCol(), _lastCell.getCol()); - int maxCol = Math.max(_firstCell.getCol(), _lastCell.getCol()); + int maxRow = Math.max(_firstCell.getRow(), _lastCell.getRow()); + int minCol = Math.min(_firstCell.getCol(), _lastCell.getCol()); + int maxCol = Math.max(_firstCell.getCol(), _lastCell.getCol()); String sheetName = _firstCell.getSheetName(); - - ArrayList refs = new ArrayList(); - for(int row=minRow; row<=maxRow; row++) { - for(int col=minCol; col<=maxCol; col++) { - CellReference ref = new CellReference(sheetName, row, col, _firstCell.isRowAbsolute(), _firstCell.isColAbsolute()); - refs.add(ref); - } - } - return (CellReference[])refs.toArray(new CellReference[refs.size()]); + + ArrayList refs = new ArrayList(); + for(int row=minRow; row<=maxRow; row++) { + for(int col=minCol; col<=maxCol; col++) { + CellReference ref = new CellReference(sheetName, row, col, _firstCell.isRowAbsolute(), _firstCell.isColAbsolute()); + refs.add(ref); + } + } + return (CellReference[])refs.toArray(new CellReference[refs.size()]); } /** @@ -189,14 +190,14 @@ * @return the text representation of this area reference as it would appear in a formula. */ public String formatAsString() { - // Special handling for whole-column references - if(isWholeColumnReference()) { - return - CellReference.convertNumToColString(_firstCell.getCol()) - + ":" + - CellReference.convertNumToColString(_lastCell.getCol()); - } - + // Special handling for whole-column references + if(isWholeColumnReference()) { + return + CellReference.convertNumToColString(_firstCell.getCol()) + + ":" + + CellReference.convertNumToColString(_lastCell.getCol()); + } + StringBuffer sb = new StringBuffer(32); sb.append(_firstCell.formatAsString()); if(!_isSingleCell) { @@ -210,6 +211,18 @@ } return sb.toString(); } + /** + * Formats a 2-D area as it would appear in a formula. See formatAsString() (no-arg) + */ + public static String formatAsString(AreaI area) { + CellReference topLeft = new CellReference(area.getFirstRow(),area.getFirstColumn(),!area.isFirstRowRelative(),!area.isFirstColRelative()); + CellReference botRight = new CellReference(area.getLastRow(),area.getLastColumn(),!area.isLastRowRelative(),!area.isLastColRelative()); + + if(isWholeColumnReference(topLeft, botRight)) { + return (new AreaReference(topLeft, botRight)).formatAsString(); + } + return topLeft.formatAsString() + ":" + botRight.formatAsString(); + } public String toString() { StringBuffer sb = new StringBuffer(64); sb.append(getClass().getName()).append(" ["); Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/util/HSSFColor.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/util/HSSFColor.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/hssf/util/HSSFColor.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/hssf/util/HSSFColor.java Fri May 23 02:48:23 2008 @@ -15,16 +15,16 @@ limitations under the License. ==================================================================== */ - 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 - * will likely replace the color contants interface for HSSF 2.0. + * will likely replace the color constants interface for HSSF 2.0. * This class contains static inner class members for representing colors. * Each color has an index (for the standard palette in Excel (tm) ), * native (RGB) triplet and string triplet. The string triplet is as the @@ -35,14 +35,10 @@ * @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 -{ - private final static int PALETTE_SIZE = 56; - private final static int DISTINCT_COLOR_COUNT = 46; +public class HSSFColor implements Color { + // TODO make subclass instances immutable /** Creates a new instance of HSSFColor */ - public HSSFColor() { } @@ -54,87 +50,86 @@ * it takes to create it once per request but you will not hold onto it * if you have none of those requests. * - * @return a hashtable containing all colors mapped to their excel-style - * pallette index + * @return a hashtable containing all colors keyed by Integer excel-style palette indexes */ public final static Hashtable getIndexHash() { - Hashtable hash = new Hashtable(PALETTE_SIZE); + return createColorsByIndexMap(); + } - hash.put(new Integer(HSSFColor.BLACK.index), new HSSFColor.BLACK()); - hash.put(new Integer(HSSFColor.BROWN.index), new HSSFColor.BROWN()); - hash.put(new Integer(HSSFColor.OLIVE_GREEN.index), - new HSSFColor.OLIVE_GREEN()); - hash.put(new Integer(HSSFColor.DARK_GREEN.index), new HSSFColor.DARK_GREEN()); - hash.put(new Integer(HSSFColor.DARK_TEAL.index), new HSSFColor.DARK_TEAL()); - hash.put(new Integer(HSSFColor.DARK_BLUE.index), new HSSFColor.DARK_BLUE()); - hash.put(new Integer(HSSFColor.DARK_BLUE.index2), new HSSFColor.DARK_BLUE()); - hash.put(new Integer(HSSFColor.INDIGO.index), new HSSFColor.INDIGO()); - hash.put(new Integer(HSSFColor.GREY_80_PERCENT.index), - new HSSFColor.GREY_80_PERCENT()); - hash.put(new Integer(HSSFColor.ORANGE.index), new HSSFColor.ORANGE()); - hash.put(new Integer(HSSFColor.DARK_YELLOW.index), - new HSSFColor.DARK_YELLOW()); - hash.put(new Integer(HSSFColor.GREEN.index), new HSSFColor.GREEN()); - hash.put(new Integer(HSSFColor.TEAL.index), new HSSFColor.TEAL()); - hash.put(new Integer(HSSFColor.TEAL.index2), new HSSFColor.TEAL()); - hash.put(new Integer(HSSFColor.BLUE.index), new HSSFColor.BLUE()); - hash.put(new Integer(HSSFColor.BLUE.index2), new HSSFColor.BLUE()); - hash.put(new Integer(HSSFColor.BLUE_GREY.index), new HSSFColor.BLUE_GREY()); - hash.put(new Integer(HSSFColor.GREY_50_PERCENT.index), - new HSSFColor.GREY_50_PERCENT()); - hash.put(new Integer(HSSFColor.RED.index), new HSSFColor.RED()); - hash.put(new Integer(HSSFColor.LIGHT_ORANGE.index), - new HSSFColor.LIGHT_ORANGE()); - hash.put(new Integer(HSSFColor.LIME.index), new HSSFColor.LIME()); - hash.put(new Integer(HSSFColor.SEA_GREEN.index), new HSSFColor.SEA_GREEN()); - hash.put(new Integer(HSSFColor.AQUA.index), new HSSFColor.AQUA()); - hash.put(new Integer(HSSFColor.LIGHT_BLUE.index), new HSSFColor.LIGHT_BLUE()); - hash.put(new Integer(HSSFColor.VIOLET.index), new HSSFColor.VIOLET()); - hash.put(new Integer(HSSFColor.VIOLET.index2), new HSSFColor.VIOLET()); - hash.put(new Integer(HSSFColor.GREY_40_PERCENT.index), - new HSSFColor.GREY_40_PERCENT()); - hash.put(new Integer(HSSFColor.PINK.index), new HSSFColor.PINK()); - hash.put(new Integer(HSSFColor.PINK.index2), new HSSFColor.PINK()); - hash.put(new Integer(HSSFColor.GOLD.index), new HSSFColor.GOLD()); - hash.put(new Integer(HSSFColor.YELLOW.index), new HSSFColor.YELLOW()); - hash.put(new Integer(HSSFColor.YELLOW.index2), new HSSFColor.YELLOW()); - hash.put(new Integer(HSSFColor.BRIGHT_GREEN.index), - new HSSFColor.BRIGHT_GREEN()); - hash.put(new Integer(HSSFColor.BRIGHT_GREEN.index2), - new HSSFColor.BRIGHT_GREEN()); - hash.put(new Integer(HSSFColor.TURQUOISE.index), new HSSFColor.TURQUOISE()); - hash.put(new Integer(HSSFColor.TURQUOISE.index2), new HSSFColor.TURQUOISE()); - hash.put(new Integer(HSSFColor.DARK_RED.index), new HSSFColor.DARK_RED()); - hash.put(new Integer(HSSFColor.DARK_RED.index2), new HSSFColor.DARK_RED()); - hash.put(new Integer(HSSFColor.SKY_BLUE.index), new HSSFColor.SKY_BLUE()); - hash.put(new Integer(HSSFColor.PLUM.index), new HSSFColor.PLUM()); - hash.put(new Integer(HSSFColor.PLUM.index2), new HSSFColor.PLUM()); - hash.put(new Integer(HSSFColor.GREY_25_PERCENT.index), - new HSSFColor.GREY_25_PERCENT()); - hash.put(new Integer(HSSFColor.ROSE.index), new HSSFColor.ROSE()); - hash.put(new Integer(HSSFColor.LIGHT_YELLOW.index), - new HSSFColor.LIGHT_YELLOW()); - hash.put(new Integer(HSSFColor.LIGHT_GREEN.index), - new HSSFColor.LIGHT_GREEN()); - hash.put(new Integer(HSSFColor.LIGHT_TURQUOISE.index), - new HSSFColor.LIGHT_TURQUOISE()); - hash.put(new Integer(HSSFColor.LIGHT_TURQUOISE.index2), - new HSSFColor.LIGHT_TURQUOISE()); - hash.put(new Integer(HSSFColor.PALE_BLUE.index), new HSSFColor.PALE_BLUE()); - hash.put(new Integer(HSSFColor.LAVENDER.index), new HSSFColor.LAVENDER()); - hash.put(new Integer(HSSFColor.WHITE.index), new HSSFColor.WHITE()); - hash.put(new Integer(HSSFColor.CORNFLOWER_BLUE.index), - new HSSFColor.CORNFLOWER_BLUE()); - hash.put(new Integer(HSSFColor.LEMON_CHIFFON.index), - new HSSFColor.LEMON_CHIFFON()); - hash.put(new Integer(HSSFColor.MAROON.index), new HSSFColor.MAROON()); - hash.put(new Integer(HSSFColor.ORCHID.index), new HSSFColor.ORCHID()); - hash.put(new Integer(HSSFColor.CORAL.index), new HSSFColor.CORAL()); - hash.put(new Integer(HSSFColor.ROYAL_BLUE.index), new HSSFColor.ROYAL_BLUE()); - hash.put(new Integer(HSSFColor.LIGHT_CORNFLOWER_BLUE.index), - new HSSFColor.LIGHT_CORNFLOWER_BLUE()); - return hash; + private static Hashtable createColorsByIndexMap() { + HSSFColor[] colors = getAllColors(); + Hashtable result = new Hashtable(colors.length * 3 / 2); + + for (int i = 0; i < colors.length; i++) { + HSSFColor color = colors[i]; + + Integer index1 = new Integer(color.getIndex()); + if (result.containsKey(index1)) { + HSSFColor prevColor = (HSSFColor)result.get(index1); + throw new RuntimeException("Dup color index (" + index1 + + ") for colors (" + prevColor.getClass().getName() + + "),(" + color.getClass().getName() + ")"); + } + result.put(index1, color); + } + + for (int i = 0; i < colors.length; i++) { + HSSFColor color = colors[i]; + Integer index2 = getIndex2(color); + if (index2 == null) { + // most colors don't have a second index + continue; + } + if (result.containsKey(index2)) { + if (false) { // Many of the second indexes clash + HSSFColor prevColor = (HSSFColor)result.get(index2); + throw new RuntimeException("Dup color index (" + index2 + + ") for colors (" + prevColor.getClass().getName() + + "),(" + color.getClass().getName() + ")"); + } + } + result.put(index2, color); + } + return result; + } + + private static Integer getIndex2(HSSFColor color) { + + Field f; + try { + f = color.getClass().getDeclaredField("index2"); + } catch (NoSuchFieldException e) { + // can happen because not all colors have a second index + return null; + } + + Short s; + try { + s = (Short) f.get(color); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + return new Integer(s.intValue()); + } + + private static HSSFColor[] getAllColors() { + + return new HSSFColor[] { + new BLACK(), new BROWN(), new OLIVE_GREEN(), new DARK_GREEN(), + new DARK_TEAL(), new DARK_BLUE(), new INDIGO(), new GREY_80_PERCENT(), + new ORANGE(), new DARK_YELLOW(), new GREEN(), new TEAL(), new BLUE(), + new BLUE_GREY(), new GREY_50_PERCENT(), new RED(), new LIGHT_ORANGE(), new LIME(), + new SEA_GREEN(), new AQUA(), new LIGHT_BLUE(), new VIOLET(), new GREY_40_PERCENT(), + new PINK(), new GOLD(), new YELLOW(), new BRIGHT_GREEN(), new TURQUOISE(), + new DARK_RED(), new SKY_BLUE(), new PLUM(), new GREY_25_PERCENT(), new ROSE(), + new LIGHT_YELLOW(), new LIGHT_GREEN(), new LIGHT_TURQUOISE(), new PALE_BLUE(), + new LAVENDER(), new WHITE(), new CORNFLOWER_BLUE(), new LEMON_CHIFFON(), + new MAROON(), new ORCHID(), new CORAL(), new ROYAL_BLUE(), + new LIGHT_CORNFLOWER_BLUE(), new TAN(), + }; } /** @@ -144,73 +139,28 @@ * it takes to create it once per request but you will not hold onto it * if you have none of those requests. * - * @return a hashtable containing all colors mapped to their gnumeric-like - * triplet string + * @return a hashtable containing all colors keyed by String gnumeric-like triplets */ - public final static Hashtable getTripletHash() { - Hashtable hash = new Hashtable(DISTINCT_COLOR_COUNT); + return createColorsByHexStringMap(); + } + + private static Hashtable createColorsByHexStringMap() { + HSSFColor[] colors = getAllColors(); + Hashtable result = new Hashtable(colors.length * 3 / 2); + + for (int i = 0; i < colors.length; i++) { + HSSFColor color = colors[i]; - hash.put(HSSFColor.BLACK.hexString, new HSSFColor.BLACK()); - hash.put(HSSFColor.BROWN.hexString, new HSSFColor.BROWN()); - hash.put(HSSFColor.OLIVE_GREEN.hexString, - new HSSFColor.OLIVE_GREEN()); - hash.put(HSSFColor.DARK_GREEN.hexString, new HSSFColor.DARK_GREEN()); - hash.put(HSSFColor.DARK_TEAL.hexString, new HSSFColor.DARK_TEAL()); - hash.put(HSSFColor.DARK_BLUE.hexString, new HSSFColor.DARK_BLUE()); - hash.put(HSSFColor.INDIGO.hexString, new HSSFColor.INDIGO()); - hash.put(HSSFColor.GREY_80_PERCENT.hexString, - new HSSFColor.GREY_80_PERCENT()); - hash.put(HSSFColor.ORANGE.hexString, new HSSFColor.ORANGE()); - hash.put(HSSFColor.DARK_YELLOW.hexString, - new HSSFColor.DARK_YELLOW()); - hash.put(HSSFColor.GREEN.hexString, new HSSFColor.GREEN()); - hash.put(HSSFColor.TEAL.hexString, new HSSFColor.TEAL()); - hash.put(HSSFColor.BLUE.hexString, new HSSFColor.BLUE()); - hash.put(HSSFColor.BLUE_GREY.hexString, new HSSFColor.BLUE_GREY()); - hash.put(HSSFColor.GREY_50_PERCENT.hexString, - new HSSFColor.GREY_50_PERCENT()); - hash.put(HSSFColor.RED.hexString, new HSSFColor.RED()); - hash.put(HSSFColor.LIGHT_ORANGE.hexString, - new HSSFColor.LIGHT_ORANGE()); - hash.put(HSSFColor.LIME.hexString, new HSSFColor.LIME()); - hash.put(HSSFColor.SEA_GREEN.hexString, new HSSFColor.SEA_GREEN()); - hash.put(HSSFColor.AQUA.hexString, new HSSFColor.AQUA()); - hash.put(HSSFColor.LIGHT_BLUE.hexString, new HSSFColor.LIGHT_BLUE()); - hash.put(HSSFColor.VIOLET.hexString, new HSSFColor.VIOLET()); - hash.put(HSSFColor.GREY_40_PERCENT.hexString, - new HSSFColor.GREY_40_PERCENT()); - hash.put(HSSFColor.PINK.hexString, new HSSFColor.PINK()); - hash.put(HSSFColor.GOLD.hexString, new HSSFColor.GOLD()); - hash.put(HSSFColor.YELLOW.hexString, new HSSFColor.YELLOW()); - hash.put(HSSFColor.BRIGHT_GREEN.hexString, - new HSSFColor.BRIGHT_GREEN()); - hash.put(HSSFColor.TURQUOISE.hexString, new HSSFColor.TURQUOISE()); - hash.put(HSSFColor.DARK_RED.hexString, new HSSFColor.DARK_RED()); - hash.put(HSSFColor.SKY_BLUE.hexString, new HSSFColor.SKY_BLUE()); - hash.put(HSSFColor.PLUM.hexString, new HSSFColor.PLUM()); - hash.put(HSSFColor.GREY_25_PERCENT.hexString, - new HSSFColor.GREY_25_PERCENT()); - hash.put(HSSFColor.ROSE.hexString, new HSSFColor.ROSE()); - hash.put(HSSFColor.LIGHT_YELLOW.hexString, - new HSSFColor.LIGHT_YELLOW()); - hash.put(HSSFColor.LIGHT_GREEN.hexString, - new HSSFColor.LIGHT_GREEN()); - hash.put(HSSFColor.LIGHT_TURQUOISE.hexString, - new HSSFColor.LIGHT_TURQUOISE()); - hash.put(HSSFColor.PALE_BLUE.hexString, new HSSFColor.PALE_BLUE()); - hash.put(HSSFColor.LAVENDER.hexString, new HSSFColor.LAVENDER()); - hash.put(HSSFColor.WHITE.hexString, new HSSFColor.WHITE()); - hash.put(HSSFColor.CORNFLOWER_BLUE.hexString, new HSSFColor.CORNFLOWER_BLUE()); - hash.put(HSSFColor.LEMON_CHIFFON.hexString, new HSSFColor.LEMON_CHIFFON()); - hash.put(HSSFColor.MAROON.hexString, new HSSFColor.MAROON()); - hash.put(HSSFColor.ORCHID.hexString, new HSSFColor.ORCHID()); - hash.put(HSSFColor.CORAL.hexString, new HSSFColor.CORAL()); - hash.put(HSSFColor.ROYAL_BLUE.hexString, new HSSFColor.ROYAL_BLUE()); - hash.put(HSSFColor.LIGHT_CORNFLOWER_BLUE.hexString, - new HSSFColor.LIGHT_CORNFLOWER_BLUE()); - return hash; + String hexString = color.getHexString(); + if (result.containsKey(hexString)) { + throw new RuntimeException("Dup color hexString (" + hexString + + ") for color (" + color.getClass().getName() + ")"); + } + result.put(hexString, color); + } + return result; } /** @@ -1492,7 +1442,7 @@ return hexString; } } - + /** * Class CORNFLOWER_BLUE */ @@ -1521,8 +1471,8 @@ return hexString; } } - - + + /** * Class LEMON_CHIFFON */ @@ -1551,7 +1501,7 @@ return hexString; } } - + /** * Class MAROON */ @@ -1580,7 +1530,7 @@ return hexString; } } - + /** * Class ORCHID */ @@ -1609,7 +1559,7 @@ return hexString; } } - + /** * Class CORAL */ @@ -1638,7 +1588,7 @@ return hexString; } } - + /** * Class ROYAL_BLUE */ @@ -1667,7 +1617,7 @@ return hexString; } } - + /** * Class LIGHT_CORNFLOWER_BLUE */ @@ -1696,19 +1646,19 @@ return hexString; } } - + /** * Special Default/Normal/Automatic color. *

Note: This class is NOT in the default HashTables returned by HSSFColor. * The index is a special case which is interpreted in the various setXXXColor calls. - * + * * @author Jason * */ public final static class AUTOMATIC extends HSSFColor { - private static HSSFColor instance = new AUTOMATIC(); - + private static HSSFColor instance = new AUTOMATIC(); + public final static short index = 0x40; public short getIndex() @@ -1725,7 +1675,7 @@ { return BLACK.hexString; } - + public static HSSFColor getInstance() { return instance; } Modified: poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java (original) +++ poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java Fri May 23 02:48:23 2008 @@ -226,7 +226,9 @@ // Otherwise, check it's only made up, in any case, of: // y m d h s - / , . : - if(fs.matches("^[yYmMdDhHsS\\-/,. :]+$")) { + // optionally followed by AM/PM + // optionally followed by AM/PM + if(fs.matches("^[yYmMdDhHsS\\-/,. :]+[ampAMP]*$")) { return true; } Modified: poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata-asGenerated.txt URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata-asGenerated.txt?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata-asGenerated.txt (original) +++ poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata-asGenerated.txt Fri May 23 02:48:23 2008 @@ -14,7 +14,7 @@ # limitations under the License. # Created by (org.apache.poi.hssf.record.formula.function.ExcelFileFormatDocFunctionExtractor) -# from source file 'excelfileformat.odt' (size=355750, crc=0x2FAEA65A) +# from source file 'excelfileformat.odt' (size=356107, md5=0x8f789cb6e75594caf068f8e193004ef4) # #Columns: (index, name, minParams, maxParams, returnClass, paramClasses, isVolatile, hasFootnote ) @@ -37,7 +37,7 @@ 15 SIN 1 1 V V 16 COS 1 1 V V 17 TAN 1 1 V V -18 ARCTAN 1 1 V V +18 ATAN 1 1 V V 19 PI 0 0 V - 20 SQRT 1 1 V V 21 EXP 1 1 V V @@ -141,8 +141,8 @@ 169 COUNTA 0 30 V R 183 PRODUCT 0 30 V R 184 FACT 1 1 V V -191 DPRODUCT 3 3 V R R R -192 ISNONTEXT 1 1 V V +189 DPRODUCT 3 3 V R R R +190 ISNONTEXT 1 1 V V 193 STDEVP 1 30 V R 194 VARP 1 30 V R 195 DSTDEVP 3 3 V R R R @@ -184,6 +184,8 @@ 244 INFO 1 1 V V # New Built-In Sheet Functions in BIFF4 14 FIXED 2 3 V V V V x +204 USDOLLAR 1 2 V V V x +215 DBCS 1 1 V V x 216 RANK 2 3 V V R V 247 DB 4 5 V V V V V V 252 FREQUENCY 2 2 A R R Modified: poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt (original) +++ poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt Fri May 23 02:48:23 2008 @@ -14,11 +14,9 @@ # limitations under the License. # Created by (org.apache.poi.hssf.record.formula.function.ExcelFileFormatDocFunctionExtractor) -# from source file 'excelfileformat.odt' (size=355750, crc=0x2FAEA65A) +# from source file 'excelfileformat.odt' (size=356107, md5=0x8f789cb6e75594caf068f8e193004ef4) # #Columns: (index, name, minParams, maxParams, returnClass, paramClasses, isVolatile, hasFootnote ) -# -# + some manual edits ! # Built-In Sheet Functions in BIFF2 0 COUNT 0 30 V R @@ -186,7 +184,7 @@ 244 INFO 1 1 V V # New Built-In Sheet Functions in BIFF4 14 FIXED 2 3 V V V V x -204 USDOLLAR 1 1 V V x +204 USDOLLAR 1 2 V V V x 215 DBCS 1 1 V V x 216 RANK 2 3 V V R V 247 DB 4 5 V V V V V V Modified: poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hdgf/HDGFDiagram.java URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hdgf/HDGFDiagram.java?rev=659485&r1=659484&r2=659485&view=diff ============================================================================== --- poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hdgf/HDGFDiagram.java (original) +++ poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hdgf/HDGFDiagram.java Fri May 23 02:48:23 2008 @@ -18,6 +18,7 @@ import java.io.FileInputStream; import java.io.IOException; +import java.io.OutputStream; import org.apache.poi.POIDocument; import org.apache.poi.hdgf.chunks.ChunkFactory; @@ -27,6 +28,7 @@ import org.apache.poi.hdgf.streams.Stream; import org.apache.poi.hdgf.streams.StringsStream; import org.apache.poi.hdgf.streams.TrailerStream; +import org.apache.poi.poifs.filesystem.DirectoryNode; import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.LittleEndian; @@ -53,14 +55,17 @@ private PointerFactory ptrFactory; public HDGFDiagram(POIFSFileSystem fs) throws IOException { - super(fs); + this(fs.getRoot(), fs); + } + public HDGFDiagram(DirectoryNode dir, POIFSFileSystem fs) throws IOException { + super(dir, fs); DocumentEntry docProps = - (DocumentEntry)filesystem.getRoot().getEntry("VisioDocument"); + (DocumentEntry)dir.getEntry("VisioDocument"); // Grab the document stream _docstream = new byte[docProps.getSize()]; - filesystem.createDocumentInputStream("VisioDocument").read(_docstream); + dir.createDocumentInputStream("VisioDocument").read(_docstream); // Read in the common POI streams readProperties(); @@ -149,6 +154,10 @@ } } + public void write(OutputStream out) { + throw new IllegalStateException("Writing is not yet implemented, see http://poi.apache.org/hdgf/"); + } + /** * For testing only */ --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org For additional commands, e-mail: commits-help@poi.apache.org