Return-Path: X-Original-To: apmail-poi-commits-archive@minotaur.apache.org Delivered-To: apmail-poi-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E012B1195C for ; Sun, 20 Jul 2014 17:52:15 +0000 (UTC) Received: (qmail 14351 invoked by uid 500); 20 Jul 2014 17:52:15 -0000 Delivered-To: apmail-poi-commits-archive@poi.apache.org Received: (qmail 14317 invoked by uid 500); 20 Jul 2014 17:52:15 -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 14308 invoked by uid 99); 20 Jul 2014 17:52:15 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 20 Jul 2014 17:52:15 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.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; Sun, 20 Jul 2014 17:52:12 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 5D10F2388906; Sun, 20 Jul 2014 17:51:52 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1612133 - in /poi/trunk/src: java/org/apache/poi/hssf/usermodel/ java/org/apache/poi/ss/formula/ java/org/apache/poi/ss/formula/eval/forked/ java/org/apache/poi/ss/formula/ptg/ ooxml/java/org/apache/poi/xssf/usermodel/ ooxml/java/org/apach... Date: Sun, 20 Jul 2014 17:51:51 -0000 To: commits@poi.apache.org From: nick@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140720175152.5D10F2388906@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: nick Date: Sun Jul 20 17:51:51 2014 New Revision: 1612133 URL: http://svn.apache.org/r1612133 Log: Update the formula evaluator to support XSSF style external named ranges too Added: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java poi/trunk/src/java/org/apache/poi/ss/formula/FormulaShifter.java poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java poi/trunk/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java poi/trunk/src/testcases/org/apache/poi/ss/formula/TestFormulaShifter.java Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java Sun Jul 20 17:51:51 2014 @@ -146,6 +146,10 @@ public final class HSSFEvaluationWorkboo return _iBook.getExternalName(externSheetIndex, externNameIndex); } + public ExternalName getExternalName(String nameName, String sheetName, int externalWorkbookNumber) { + throw new IllegalStateException("XSSF-style external names are not supported for HSSF"); + } + public String resolveNameXText(NameXPtg n) { return _iBook.resolveNameXText(n.getSheetRefIndex(), n.getNameIndex()); } Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original) +++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Sun Jul 20 17:51:51 2014 @@ -1504,8 +1504,10 @@ public final class HSSFSheet implements // Update any formulas on this sheet that point to // rows which have been moved int sheetIndex = _workbook.getSheetIndex(this); + String sheetName = _workbook.getSheetName(sheetIndex); short externSheetIndex = _book.checkExternSheet(sheetIndex); - FormulaShifter shifter = FormulaShifter.createForRowShift(externSheetIndex, startRow, endRow, n); + FormulaShifter shifter = FormulaShifter.createForRowShift( + externSheetIndex, sheetName, startRow, endRow, n); _sheet.updateFormulasAfterCellShift(shifter, externSheetIndex); int nSheets = _workbook.getNumberOfSheets(); Modified: poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java (original) +++ poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java Sun Jul 20 17:51:51 2014 @@ -59,7 +59,15 @@ public interface EvaluationWorkbook { */ int convertFromExternSheetIndex(int externSheetIndex); + /** + * HSSF Only - fetch the external-style name details + */ ExternalName getExternalName(int externSheetIndex, int externNameIndex); + /** + * XSSF Only - fetch the external-style name details + */ + ExternalName getExternalName(String nameName, String sheetName, int externalWorkbookNumber); + EvaluationName getName(NamePtg namePtg); EvaluationName getName(String name, int sheetIndex); String resolveNameXText(NameXPtg ptg); Modified: poi/trunk/src/java/org/apache/poi/ss/formula/FormulaShifter.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/FormulaShifter.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/formula/FormulaShifter.java (original) +++ poi/trunk/src/java/org/apache/poi/ss/formula/FormulaShifter.java Sun Jul 20 17:51:51 2014 @@ -17,11 +17,25 @@ package org.apache.poi.ss.formula; -import org.apache.poi.ss.formula.ptg.*; +import org.apache.poi.ss.formula.ptg.Area2DPtgBase; +import org.apache.poi.ss.formula.ptg.Area3DPtg; +import org.apache.poi.ss.formula.ptg.Area3DPxg; +import org.apache.poi.ss.formula.ptg.AreaErrPtg; +import org.apache.poi.ss.formula.ptg.AreaPtg; +import org.apache.poi.ss.formula.ptg.AreaPtgBase; +import org.apache.poi.ss.formula.ptg.Deleted3DPxg; +import org.apache.poi.ss.formula.ptg.DeletedArea3DPtg; +import org.apache.poi.ss.formula.ptg.DeletedRef3DPtg; +import org.apache.poi.ss.formula.ptg.Ptg; +import org.apache.poi.ss.formula.ptg.Ref3DPtg; +import org.apache.poi.ss.formula.ptg.Ref3DPxg; +import org.apache.poi.ss.formula.ptg.RefErrorPtg; +import org.apache.poi.ss.formula.ptg.RefPtg; +import org.apache.poi.ss.formula.ptg.RefPtgBase; /** - * @author Josh Micich + * Updates Formulas as rows or sheets are shifted */ public final class FormulaShifter { @@ -31,9 +45,16 @@ public final class FormulaShifter { } /** - * Extern sheet index of sheet where moving is occurring + * Extern sheet index of sheet where moving is occurring, + * used for updating HSSF style 3D references */ private final int _externSheetIndex; + /** + * Sheet name of the sheet where moving is occurring, + * used for updating XSSF style 3D references on row shifts. + */ + private final String _sheetName; + private final int _firstMovedIndex; private final int _lastMovedIndex; private final int _amountToMove; @@ -48,7 +69,7 @@ public final class FormulaShifter { * * For example, this will be called on {@link org.apache.poi.hssf.usermodel.HSSFSheet#shiftRows(int, int, int)} } */ - private FormulaShifter(int externSheetIndex, int firstMovedIndex, int lastMovedIndex, int amountToMove) { + private FormulaShifter(int externSheetIndex, String sheetName, int firstMovedIndex, int lastMovedIndex, int amountToMove) { if (amountToMove == 0) { throw new IllegalArgumentException("amountToMove must not be zero"); } @@ -56,6 +77,7 @@ public final class FormulaShifter { throw new IllegalArgumentException("firstMovedIndex, lastMovedIndex out of order"); } _externSheetIndex = externSheetIndex; + _sheetName = sheetName; _firstMovedIndex = firstMovedIndex; _lastMovedIndex = lastMovedIndex; _amountToMove = amountToMove; @@ -71,14 +93,15 @@ public final class FormulaShifter { */ private FormulaShifter(int srcSheetIndex, int dstSheetIndex) { _externSheetIndex = _firstMovedIndex = _lastMovedIndex = _amountToMove = -1; + _sheetName = null; _srcSheetIndex = srcSheetIndex; _dstSheetIndex = dstSheetIndex; _mode = ShiftMode.Sheet; } - public static FormulaShifter createForRowShift(int externSheetIndex, int firstMovedRowIndex, int lastMovedRowIndex, int numberOfRowsToMove) { - return new FormulaShifter(externSheetIndex, firstMovedRowIndex, lastMovedRowIndex, numberOfRowsToMove); + public static FormulaShifter createForRowShift(int externSheetIndex, String sheetName, int firstMovedRowIndex, int lastMovedRowIndex, int numberOfRowsToMove) { + return new FormulaShifter(externSheetIndex, sheetName, firstMovedRowIndex, lastMovedRowIndex, numberOfRowsToMove); } public static FormulaShifter createForSheetShift(int srcSheetIndex, int dstSheetIndex) { @@ -145,6 +168,14 @@ public final class FormulaShifter { } return rowMoveRefPtg(rptg); } + if(ptg instanceof Ref3DPxg) { + Ref3DPxg rpxg = (Ref3DPxg)ptg; + if (rpxg.getExternalWorkbookNumber() > 0 || + ! _sheetName.equals(rpxg.getSheetName())) { + // only move 3D refs that refer to the sheet with cells being moved + } + return rowMoveRefPtg(rpxg); + } if(ptg instanceof Area2DPtgBase) { if (currentExternSheetIx != _externSheetIndex) { // local refs on other sheets are unaffected @@ -161,6 +192,15 @@ public final class FormulaShifter { } return rowMoveAreaPtg(aptg); } + if(ptg instanceof Area3DPxg) { + Area3DPxg apxg = (Area3DPxg)ptg; + if (apxg.getExternalWorkbookNumber() > 0 || + ! _sheetName.equals(apxg.getSheetName())) { + // only move 3D refs that refer to the sheet with cells being moved + return null; + } + return rowMoveAreaPtg(apxg); + } return null; } @@ -348,6 +388,14 @@ public final class FormulaShifter { Area3DPtg area3DPtg = (Area3DPtg) ptg; return new DeletedArea3DPtg(area3DPtg.getExternSheetIndex()); } + if (ptg instanceof Ref3DPxg) { + Ref3DPxg pxg = (Ref3DPxg)ptg; + return new Deleted3DPxg(pxg.getExternalWorkbookNumber(), pxg.getSheetName()); + } + if (ptg instanceof Area3DPxg) { + Area3DPxg pxg = (Area3DPxg)ptg; + return new Deleted3DPxg(pxg.getExternalWorkbookNumber(), pxg.getSheetName()); + } throw new IllegalArgumentException("Unexpected ref ptg class (" + ptg.getClass().getName() + ")"); } Modified: poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java (original) +++ poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java Sun Jul 20 17:51:51 2014 @@ -23,7 +23,8 @@ import org.apache.poi.ss.formula.Evaluat import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet; import org.apache.poi.ss.formula.eval.AreaEval; import org.apache.poi.ss.formula.eval.ErrorEval; -import org.apache.poi.ss.formula.eval.NameXEval; +import org.apache.poi.ss.formula.eval.ExternalNameEval; +import org.apache.poi.ss.formula.eval.FunctionNameEval; import org.apache.poi.ss.formula.eval.RefEval; import org.apache.poi.ss.formula.eval.ValueEval; import org.apache.poi.ss.formula.functions.FreeRefFunction; @@ -299,32 +300,82 @@ public final class OperationEvaluationCo } public ValueEval getNameXEval(NameXPtg nameXPtg) { + // Is the name actually on our workbook? ExternalSheet externSheet = _workbook.getExternalSheet(nameXPtg.getSheetRefIndex()); if(externSheet == null || externSheet.getWorkbookName() == null) { // External reference to our own workbook's name - return new NameXEval(nameXPtg); + return getLocalNameXEval(nameXPtg); } + // Look it up for the external workbook String workbookName = externSheet.getWorkbookName(); ExternalName externName = _workbook.getExternalName( nameXPtg.getSheetRefIndex(), nameXPtg.getNameIndex() ); - return getNameXEval(externName, workbookName); + return getExternalNameXEval(externName, workbookName); } public ValueEval getNameXEval(NameXPxg nameXPxg) { ExternalSheet externSheet = _workbook.getExternalSheet(nameXPxg.getSheetName(), nameXPxg.getExternalWorkbookNumber()); if(externSheet == null || externSheet.getWorkbookName() == null) { // External reference to our own workbook's name - // TODO How to do this? - return new NameXEval(null); + return getLocalNameXEval(nameXPxg); } - // TODO - return null; -// return getNameXEval(nameXPxg.getNameName(), externSheet.getWorkbookName()); + // Look it up for the external workbook + String workbookName = externSheet.getWorkbookName(); + ExternalName externName = _workbook.getExternalName( + nameXPxg.getNameName(), + nameXPxg.getSheetName(), + nameXPxg.getExternalWorkbookNumber() + ); + return getExternalNameXEval(externName, workbookName); + } + + private ValueEval getLocalNameXEval(NameXPxg nameXPxg) { + // Look up the sheet, if present + int sIdx = -1; + if (nameXPxg.getSheetName() != null) { + sIdx = _workbook.getSheetIndex(nameXPxg.getSheetName()); + } + + // Is it a name or a function? + String name = nameXPxg.getNameName(); + EvaluationName evalName = _workbook.getName(name, sIdx); + if (evalName != null) { + // Process it as a name + return new ExternalNameEval(evalName); + } else { + // Must be an external function + return new FunctionNameEval(name); + } + } + private ValueEval getLocalNameXEval(NameXPtg nameXPtg) { + String name = _workbook.resolveNameXText(nameXPtg); + + // Try to parse it as a name + int sheetNameAt = name.indexOf('!'); + EvaluationName evalName = null; + if (sheetNameAt > -1) { + // Sheet based name + String sheetName = name.substring(0, sheetNameAt); + String nameName = name.substring(sheetNameAt+1); + evalName = _workbook.getName(nameName, _workbook.getSheetIndex(sheetName)); + } else { + // Workbook based name + evalName = _workbook.getName(name, -1); + } + + if (evalName != null) { + // Process it as a name + return new ExternalNameEval(evalName); + } else { + // Must be an external function + return new FunctionNameEval(name); + } } - private ValueEval getNameXEval(ExternalName externName, String workbookName) { + + private ValueEval getExternalNameXEval(ExternalName externName, String workbookName) { try { WorkbookEvaluator refWorkbookEvaluator = _bookEvaluator.getOtherWorkbookEvaluator(workbookName); EvaluationName evaluationName = refWorkbookEvaluator.getName(externName.getName(),externName.getIx()-1); Modified: poi/trunk/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java (original) +++ poi/trunk/src/java/org/apache/poi/ss/formula/UserDefinedFunction.java Sun Jul 20 17:51:51 2014 @@ -17,7 +17,7 @@ package org.apache.poi.ss.formula; -import org.apache.poi.ss.formula.eval.NameEval; +import org.apache.poi.ss.formula.eval.FunctionNameEval; import org.apache.poi.ss.formula.eval.NotImplementedFunctionException; import org.apache.poi.ss.formula.eval.ValueEval; import org.apache.poi.ss.formula.functions.FreeRefFunction; @@ -45,8 +45,8 @@ final class UserDefinedFunction implemen ValueEval nameArg = args[0]; String functionName; - if (nameArg instanceof NameEval) { - functionName = ((NameEval) nameArg).getFunctionName(); + if (nameArg instanceof FunctionNameEval) { + functionName = ((FunctionNameEval) nameArg).getFunctionName(); } else { throw new RuntimeException("First argument should be a NameEval, but got (" + nameArg.getClass().getName() + ")"); Modified: poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java (original) +++ poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java Sun Jul 20 17:51:51 2014 @@ -30,10 +30,10 @@ import org.apache.poi.ss.formula.eval.Bl import org.apache.poi.ss.formula.eval.BoolEval; import org.apache.poi.ss.formula.eval.ErrorEval; import org.apache.poi.ss.formula.eval.EvaluationException; +import org.apache.poi.ss.formula.eval.ExternalNameEval; import org.apache.poi.ss.formula.eval.FunctionEval; +import org.apache.poi.ss.formula.eval.FunctionNameEval; import org.apache.poi.ss.formula.eval.MissingArgEval; -import org.apache.poi.ss.formula.eval.NameEval; -import org.apache.poi.ss.formula.eval.NameXEval; import org.apache.poi.ss.formula.eval.NotImplementedException; import org.apache.poi.ss.formula.eval.NumberEval; import org.apache.poi.ss.formula.eval.OperandResolver; @@ -638,37 +638,13 @@ public final class WorkbookEvaluator { EvaluationName nameRecord = _workbook.getName(namePtg); return getEvalForNameRecord(nameRecord, ec); } - if (ptg instanceof NameXPtg) { // TODO Generalise for NameXPxg + if (ptg instanceof NameXPtg) { // Externally defined named ranges or macro functions - NameXPtg nameXPtg = (NameXPtg)ptg; - ValueEval eval = ec.getNameXEval(nameXPtg); - - if (eval instanceof NameXEval) { - // Could not be directly evaluated, so process as a name - return getEvalForNameX(nameXPtg, ec); - } else { - // Use the evaluated version - return eval; - } + return processNameEval(ec.getNameXEval((NameXPtg)ptg), ec); } if (ptg instanceof NameXPxg) { - // TODO This is a temporary hack.... - NameXPxg pxg = (NameXPxg)ptg; - int sIdx = -1; - if (pxg.getSheetName() != null) { - sIdx = _workbook.getSheetIndex(pxg.getSheetName()); - } - EvaluationName evalName = _workbook.getName(pxg.getNameName(), sIdx); - if (evalName == null) { - // We don't know about that name, sorry - // TODO What about UDFs? - logInfo("Unknown Name referenced: " + pxg.getNameName()); - return ErrorEval.NAME_INVALID; - } - - int nIdx = evalName.createPtg().getIndex(); - NameXPtg nptg = new NameXPtg(sIdx, nIdx); - return getEvalForPtg(nptg, ec); + // Externally defined named ranges or macro functions + return processNameEval(ec.getNameXEval((NameXPxg)ptg), ec); } if (ptg instanceof IntPtg) { @@ -728,10 +704,18 @@ public final class WorkbookEvaluator { throw new RuntimeException("Unexpected ptg class (" + ptg.getClass().getName() + ")"); } + + private ValueEval processNameEval(ValueEval eval, OperationEvaluationContext ec) { + if (eval instanceof ExternalNameEval) { + EvaluationName name = ((ExternalNameEval)eval).getName(); + return getEvalForNameRecord(name, ec); + } + return eval; + } private ValueEval getEvalForNameRecord(EvaluationName nameRecord, OperationEvaluationContext ec) { if (nameRecord.isFunctionName()) { - return new NameEval(nameRecord.getNameText()); + return new FunctionNameEval(nameRecord.getNameText()); } if (nameRecord.hasFormula()) { return evaluateNameFormula(nameRecord.getNameDefinition(), ec); @@ -739,30 +723,6 @@ public final class WorkbookEvaluator { throw new RuntimeException("Don't now how to evalate name '" + nameRecord.getNameText() + "'"); } - private ValueEval getEvalForNameX(NameXPtg nameXPtg, OperationEvaluationContext ec) { - String name = _workbook.resolveNameXText(nameXPtg); - - // Try to parse it as a name - int sheetNameAt = name.indexOf('!'); - EvaluationName nameRecord = null; - if (sheetNameAt > -1) { - // Sheet based name - String sheetName = name.substring(0, sheetNameAt); - String nameName = name.substring(sheetNameAt+1); - nameRecord = _workbook.getName(nameName, _workbook.getSheetIndex(sheetName)); - } else { - // Workbook based name - nameRecord = _workbook.getName(name, -1); - } - - if (nameRecord != null) { - // Process it as a name - return getEvalForNameRecord(nameRecord, ec); - } else { - // Must be an external function - return new NameEval(name); - } - } /** * YK: Used by OperationEvaluationContext to resolve indirect names. Modified: poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java (original) +++ poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java Sun Jul 20 17:51:51 2014 @@ -117,8 +117,11 @@ final class ForkedEvaluationWorkbook imp public ExternalName getExternalName(int externSheetIndex, int externNameIndex) { return _masterBook.getExternalName(externSheetIndex, externNameIndex); } + public ExternalName getExternalName(String nameName, String sheetName, int externalWorkbookNumber) { + return _masterBook.getExternalName(nameName, sheetName, externalWorkbookNumber); + } - public int getSheetIndex(EvaluationSheet sheet) { + public int getSheetIndex(EvaluationSheet sheet) { if (sheet instanceof ForkedEvaluationSheet) { ForkedEvaluationSheet mes = (ForkedEvaluationSheet) sheet; return mes.getSheetIndex(_masterBook); Added: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java?rev=1612133&view=auto ============================================================================== --- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java (added) +++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java Sun Jul 20 17:51:51 2014 @@ -0,0 +1,87 @@ +/* ==================================================================== + 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.formula.ptg; + +import org.apache.poi.ss.usermodel.ErrorConstants; +import org.apache.poi.util.LittleEndianOutput; + + +/** + * An XSSF only representation of a reference to a deleted area + */ +public final class Deleted3DPxg extends OperandPtg { + private int externalWorkbookNumber = -1; + private String sheetName; + + public Deleted3DPxg(int externalWorkbookNumber, String sheetName) { + this.externalWorkbookNumber = externalWorkbookNumber; + this.sheetName = sheetName; + } + public Deleted3DPxg(String sheetName) { + this(-1, sheetName); + } + + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(getClass().getName()); + sb.append(" ["); + if (externalWorkbookNumber >= 0) { + sb.append(" ["); + sb.append("workbook=").append(getExternalWorkbookNumber()); + sb.append("] "); + } + sb.append("sheet=").append(getSheetName()); + sb.append(" ! "); + sb.append(ErrorConstants.getText(ErrorConstants.ERROR_REF)); + sb.append("]"); + return sb.toString(); + } + + public int getExternalWorkbookNumber() { + return externalWorkbookNumber; + } + public String getSheetName() { + return sheetName; + } + + public String toFormulaString() { + StringBuffer sb = new StringBuffer(); + if (externalWorkbookNumber >= 0) { + sb.append('['); + sb.append(externalWorkbookNumber); + sb.append(']'); + } + if (sheetName != null) { + sb.append(sheetName); + } + sb.append('!'); + sb.append(ErrorConstants.getText(ErrorConstants.ERROR_REF)); + return sb.toString(); + } + + public byte getDefaultOperandClass() { + return Ptg.CLASS_VALUE; + } + + public int getSize() { + return 1; + } + public void write(LittleEndianOutput out) { + throw new IllegalStateException("XSSF-only Ptg, should not be serialised"); + } +} Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java Sun Jul 20 17:51:51 2014 @@ -119,10 +119,24 @@ public final class XSSFEvaluationWorkboo } public ExternalName getExternalName(int externSheetIndex, int externNameIndex) { - throw new RuntimeException("Not implemented yet"); + throw new IllegalStateException("HSSF-style external references are not supported for XSSF"); } - public NameXPxg getNameXPtg(String name, SheetIdentifier sheet) { + public ExternalName getExternalName(String nameName, String sheetName, int externalWorkbookNumber) { + if (externalWorkbookNumber > 0) { + // External reference - reference is 1 based, link table is 0 based + int linkNumber = externalWorkbookNumber - 1; + ExternalLinksTable linkTable = _uBook.getExternalLinksTable().get(linkNumber); + return new ExternalName(nameName, -1, -1); // TODO Finish this + } else { + // Internal reference + int nameIdx = _uBook.getNameIndex(nameName); + return new ExternalName(nameName, nameIdx, -1); // TODO Is this right? + } + + } + + public NameXPxg getNameXPtg(String name, SheetIdentifier sheet) { // First, try to find it as a User Defined Function IndexedUDFFinder udfFinder = (IndexedUDFFinder)getUDFFinder(); FreeRefFunction func = udfFinder.findFunction(name); @@ -131,6 +145,12 @@ public final class XSSFEvaluationWorkboo } // Otherwise, try it as a named range + if (sheet == null) { + if (_uBook.getNameIndex(name) > -1) { + return new NameXPxg(null, name); + } + return null; + } if (sheet._sheetIdentifier == null) { // Workbook + Named Range only int bookIndex = resolveBookIndex(sheet._bookName); @@ -229,7 +249,7 @@ public final class XSSFEvaluationWorkboo XSSFEvaluationWorkbook frBook = XSSFEvaluationWorkbook.create(_uBook); return FormulaParser.parse(cell.getCellFormula(), frBook, FormulaType.CELL, _uBook.getSheetIndex(cell.getSheet())); } - + public UDFFinder getUDFFinder(){ return _uBook.getUDFFinder(); } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Sun Jul 20 17:51:51 2014 @@ -42,7 +42,16 @@ import org.apache.poi.openxml4j.opc.Pack import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.formula.FormulaShifter; import org.apache.poi.ss.formula.SheetNameFormatter; -import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellRange; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.Footer; +import org.apache.poi.ss.usermodel.Header; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.ss.util.CellReference; @@ -58,7 +67,48 @@ import org.apache.poi.xssf.usermodel.hel import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTAutoFilter; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBreak; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcPr; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComment; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCommentList; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidation; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidations; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDrawing; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHyperlink; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTLegacyDrawing; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCell; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCells; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOutlinePr; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageBreak; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageMargins; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageSetUpPr; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPane; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPrintOptions; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSelection; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetCalcPr; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetFormatPr; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetPr; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetProtection; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetView; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetViews; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTablePart; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableParts; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCalcMode; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPane; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPaneState; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STUnsignedShortHex; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument; /** * High level representation of a SpreadsheetML worksheet. @@ -2498,7 +2548,9 @@ public class XSSFSheet extends POIXMLDoc XSSFRowShifter rowShifter = new XSSFRowShifter(this); int sheetIndex = getWorkbook().getSheetIndex(this); - FormulaShifter shifter = FormulaShifter.createForRowShift(sheetIndex, startRow, endRow, n); + String sheetName = getWorkbook().getSheetName(sheetIndex); + FormulaShifter shifter = FormulaShifter.createForRowShift( + sheetIndex, sheetName, startRow, endRow, n); rowShifter.updateNamedRanges(shifter); rowShifter.updateFormulas(shifter); Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java Sun Jul 20 17:51:51 2014 @@ -17,21 +17,30 @@ package org.apache.poi.xssf.usermodel.helpers; -import org.apache.poi.xssf.usermodel.*; -import org.apache.poi.ss.util.CellRangeAddress; +import java.util.ArrayList; +import java.util.List; + import org.apache.poi.ss.formula.FormulaParser; -import org.apache.poi.ss.formula.FormulaType; import org.apache.poi.ss.formula.FormulaRenderer; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.formula.FormulaShifter; -import org.apache.poi.ss.formula.ptg.Ptg; -import org.apache.poi.ss.formula.ptg.AreaPtg; +import org.apache.poi.ss.formula.FormulaType; import org.apache.poi.ss.formula.ptg.AreaErrPtg; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; - -import java.util.List; -import java.util.ArrayList; +import org.apache.poi.ss.formula.ptg.AreaPtg; +import org.apache.poi.ss.formula.ptg.Ptg; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook; +import org.apache.poi.xssf.usermodel.XSSFName; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCfRule; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTConditionalFormatting; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType; /** * @author Yegor Kozlov @@ -115,7 +124,6 @@ public final class XSSFRowShifter { String shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs); name.setRefersToFormula(shiftedFmla); } - } } Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java (original) +++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestSheet.java Sun Jul 20 17:51:51 2014 @@ -17,11 +17,39 @@ package org.apache.poi.hssf.model; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import junit.framework.AssertionFailedError; import junit.framework.TestCase; + import org.apache.poi.ddf.EscherDggRecord; import org.apache.poi.hssf.HSSFTestDataSamples; -import org.apache.poi.hssf.record.*; +import org.apache.poi.hssf.record.BOFRecord; +import org.apache.poi.hssf.record.BlankRecord; +import org.apache.poi.hssf.record.CellValueRecordInterface; +import org.apache.poi.hssf.record.ColumnInfoRecord; +import org.apache.poi.hssf.record.DimensionsRecord; +import org.apache.poi.hssf.record.DrawingRecord; +import org.apache.poi.hssf.record.EOFRecord; +import org.apache.poi.hssf.record.EscherAggregate; +import org.apache.poi.hssf.record.FormulaRecord; +import org.apache.poi.hssf.record.GutsRecord; +import org.apache.poi.hssf.record.IndexRecord; +import org.apache.poi.hssf.record.MergeCellsRecord; +import org.apache.poi.hssf.record.MulBlankRecord; +import org.apache.poi.hssf.record.NoteRecord; +import org.apache.poi.hssf.record.NumberRecord; +import org.apache.poi.hssf.record.ObjRecord; +import org.apache.poi.hssf.record.Record; +import org.apache.poi.hssf.record.RecordBase; +import org.apache.poi.hssf.record.RowRecord; +import org.apache.poi.hssf.record.StringRecord; +import org.apache.poi.hssf.record.TextObjectRecord; +import org.apache.poi.hssf.record.UncalcedRecord; +import org.apache.poi.hssf.record.WindowTwoRecord; import org.apache.poi.hssf.record.aggregates.ConditionalFormattingTable; import org.apache.poi.hssf.record.aggregates.PageSettingsBlock; import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor; @@ -35,11 +63,6 @@ import org.apache.poi.ss.formula.Formula import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.util.HexRead; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - /** * Unit test for the {@link InternalSheet} class. * @@ -632,7 +655,7 @@ public final class TestSheet extends Tes List sheetRecs = sheet.getRecords(); assertEquals(23, sheetRecs.size()); - FormulaShifter shifter = FormulaShifter.createForRowShift(0, 0, 0, 1); + FormulaShifter shifter = FormulaShifter.createForRowShift(0, "", 0, 0, 1); sheet.updateFormulasAfterCellShift(shifter, 0); if (sheetRecs.size() == 24 && sheetRecs.get(22) instanceof ConditionalFormattingTable) { throw new AssertionFailedError("Identified bug 46547a"); Modified: poi/trunk/src/testcases/org/apache/poi/ss/formula/TestFormulaShifter.java URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/formula/TestFormulaShifter.java?rev=1612133&r1=1612132&r2=1612133&view=diff ============================================================================== --- poi/trunk/src/testcases/org/apache/poi/ss/formula/TestFormulaShifter.java (original) +++ poi/trunk/src/testcases/org/apache/poi/ss/formula/TestFormulaShifter.java Sun Jul 20 17:51:51 2014 @@ -97,7 +97,7 @@ public final class TestFormulaShifter ex int firstRowMoved, int lastRowMoved, int numberRowsMoved, int expectedAreaFirstRow, int expectedAreaLastRow) { - FormulaShifter fs = FormulaShifter.createForRowShift(0, firstRowMoved, lastRowMoved, numberRowsMoved); + FormulaShifter fs = FormulaShifter.createForRowShift(0, "", firstRowMoved, lastRowMoved, numberRowsMoved); boolean expectedChanged = aptg.getFirstRow() != expectedAreaFirstRow || aptg.getLastRow() != expectedAreaLastRow; AreaPtg copyPtg = (AreaPtg) aptg.copy(); // clone so we can re-use aptg in calling method --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org For additional commands, e-mail: commits-help@poi.apache.org