You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2013/06/02 17:13:48 UTC
svn commit: r1488729 - in /poi/trunk/src: java/org/apache/poi/hssf/usermodel/
java/org/apache/poi/ss/formula/functions/ java/org/apache/poi/util/
testcases/org/apache/poi/ss/formula/functions/
Author: yegor
Date: Sun Jun 2 15:13:47 2013
New Revision: 1488729
URL: http://svn.apache.org/r1488729
Log:
Bugzilla 55036 - Dec2HEx formula support
Added:
poi/trunk/src/java/org/apache/poi/ss/formula/functions/Dec2Hex.java
poi/trunk/src/java/org/apache/poi/util/Configurator.java
poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/TestDec2Hex.java
Modified:
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/BaseTestFunctionsFromSpreadsheet.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java?rev=1488729&r1=1488728&r2=1488729&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java Sun Jun 2 15:13:47 2013
@@ -27,6 +27,7 @@ import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.SpreadsheetVersion;
+import org.apache.poi.util.Configurator;
/**
* High level representation of a row of a spreadsheet.
@@ -39,7 +40,7 @@ import org.apache.poi.ss.SpreadsheetVers
public final class HSSFRow implements Row {
// used for collections
- public final static int INITIAL_CAPACITY = 5;
+ public final static int INITIAL_CAPACITY = Configurator.getIntValue("HSSFRow.ColInitialCapacity", 5);
private int rowNum;
private HSSFCell[] cells;
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=1488729&r1=1488728&r2=1488729&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 Jun 2 15:13:47 2013
@@ -50,6 +50,7 @@ import org.apache.poi.ss.util.CellRangeA
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.ss.util.SSCellRange;
import org.apache.poi.ss.util.SheetUtil;
+import org.apache.poi.util.Configurator;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
@@ -74,7 +75,7 @@ public final class HSSFSheet implements
* rows. It is currently set to 20. If you generate larger sheets you may benefit
* by setting this to a higher number and recompiling a custom edition of HSSFSheet.
*/
- public final static int INITIAL_CAPACITY = 20;
+ public final static int INITIAL_CAPACITY = Configurator.getIntValue("HSSFSheet.RowInitialCapacity", 20);
/**
* reference to the low level {@link InternalSheet} object
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?rev=1488729&r1=1488728&r2=1488729&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java Sun Jun 2 15:13:47 2013
@@ -29,6 +29,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
+import org.apache.commons.codec.digest.DigestUtils;
import org.apache.poi.POIDocument;
import org.apache.poi.ddf.EscherBSERecord;
import org.apache.poi.ddf.EscherBitmapBlip;
@@ -54,9 +55,9 @@ import org.apache.poi.ss.formula.udf.UDF
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.WorkbookUtil;
+import org.apache.poi.util.Configurator;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
-import org.apache.commons.codec.digest.DigestUtils;
import org.apache.poi.ss.formula.udf.IndexedUDFFinder;
@@ -93,7 +94,7 @@ public final class HSSFWorkbook extends
* since you're never allowed to have more or less than three sheets!
*/
- public final static int INITIAL_CAPACITY = 3;
+ public final static int INITIAL_CAPACITY = Configurator.getIntValue("HSSFWorkbook.SheetInitialCapacity",3);
/**
* this is the reference to the low level Workbook object
Added: poi/trunk/src/java/org/apache/poi/ss/formula/functions/Dec2Hex.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/functions/Dec2Hex.java?rev=1488729&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/functions/Dec2Hex.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/functions/Dec2Hex.java Sun Jun 2 15:13:47 2013
@@ -0,0 +1,122 @@
+/* ====================================================================
+ 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.functions;
+
+import org.apache.poi.ss.formula.eval.*;
+
+/**
+ * Implementation for Excel DELTA() function.<p/>
+ * <p/>
+ * <b>Syntax</b>:<br/> <b>DEC2HEX </b>(<b>number</b>,<b>places</b> )<br/>
+ * <p/>
+ * Converts a decimal number to hexadecimal.
+ *
+ * The decimal integer you want to convert. If number is negative, places is ignored
+ * and this function returns a 10-character (40-bit) hexadecimal number in which the
+ * most significant bit is the sign bit. The remaining 39 bits are magnitude bits.
+ * Negative numbers are represented using two's-complement notation.
+ *
+ * <ul>
+ * <li>If number < -549,755,813,888 or if number > 549,755,813,887, this function returns the #NUM! error value.</li>
+ * <li>If number is nonnumeric, this function returns the #VALUE! error value.</li>
+ * </ul>
+ *
+ * <h2>places</h2>
+ *
+ * The number of characters to use. The places argument is useful for padding the
+ * return value with leading 0s (zeros).
+ *
+ * <ul>
+ * <li>If this argument is omitted, this function uses the minimum number of characters necessary.</li>
+ * <li>If this function requires more than places characters, it returns the #NUM! error value.</li>
+ * <li>If this argument is nonnumeric, this function returns the #VALUE! error value.</li>
+ * <li>If this argument is negative, this function returns the #NUM! error value.</li>
+ * <li>If this argument contains a decimal value, this function ignores the numbers to the right side of the decimal point.</li>
+ * </ul>
+ *
+ * @author cedric dot walter @ gmail dot com
+ */
+public final class Dec2Hex extends Var1or2ArgFunction {
+
+ private final static long MIN_VALUE = new Long("-549755813888").longValue();
+ private final static long MAX_VALUE = new Long("549755813887").longValue();
+ private final static int DEFAULT_PLACES_VALUE = 10;;
+
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval number, ValueEval places) {
+ ValueEval veText1;
+ try {
+ veText1 = OperandResolver.getSingleValue(number, srcRowIndex, srcColumnIndex);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ String strText1 = OperandResolver.coerceValueToString(veText1);
+ Double number1 = OperandResolver.parseDouble(strText1);
+
+ //If this number argument is non numeric, this function returns the #VALUE! error value.
+ if (number1 == null) {
+ return ErrorEval.VALUE_INVALID;
+ }
+
+ //If number < -549,755,813,888 or if number > 549,755,813,887, this function returns the #NUM! error value.
+ if (number1.longValue() < MIN_VALUE || number1.longValue() > MAX_VALUE) {
+ return ErrorEval.NUM_ERROR;
+ }
+
+ int placesNumber = 0;
+ if (number1 < 0) {
+ placesNumber = DEFAULT_PLACES_VALUE;
+ } else {
+ ValueEval placesValueEval;
+ try {
+ placesValueEval = OperandResolver.getSingleValue(places, srcRowIndex, srcColumnIndex);
+ } catch (EvaluationException e) {
+ return e.getErrorEval();
+ }
+ String placesStr = OperandResolver.coerceValueToString(placesValueEval);
+ Double placesNumberDouble = OperandResolver.parseDouble(placesStr);
+
+ //non numeric value
+ if (placesNumberDouble == null) {
+ return ErrorEval.VALUE_INVALID;
+ }
+
+ //If this argument contains a decimal value, this function ignores the numbers to the right side of the decimal point.
+ placesNumber = placesNumberDouble.intValue();
+
+ if (placesNumber < 0) {
+ return ErrorEval.NUM_ERROR;
+ }
+ }
+
+ String hex = "";
+ if (placesNumber != 0) {
+ hex = String.format("%0"+placesNumber+"X", number1.intValue() & 0x0FFFFF);
+ }
+ else {
+ hex = Integer.toHexString(number1.intValue());
+ }
+
+ return new StringEval(hex.toUpperCase());
+ }
+
+ @Override
+ public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0) {
+ return this.evaluate(srcRowIndex, srcColumnIndex, arg0, new StringEval(String.valueOf(DEFAULT_PLACES_VALUE)));
+ }
+}
\ No newline at end of file
Added: poi/trunk/src/java/org/apache/poi/util/Configurator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/util/Configurator.java?rev=1488729&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/Configurator.java (added)
+++ poi/trunk/src/java/org/apache/poi/util/Configurator.java Sun Jun 2 15:13:47 2013
@@ -0,0 +1,40 @@
+package org.apache.poi.util;
+
+/* ====================================================================
+ 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.
+==================================================================== */
+
+/**
+ *
+ * @author Cedric Walter (cedric.walter at innoveo.com)
+ */
+public class Configurator {
+
+ private static POILogger logger = POILogFactory.getLogger(Configurator.class);
+
+ public static int getIntValue(String systemProperty, int defaultValue) {
+ int result = defaultValue;
+ String property = System.getProperty(systemProperty);
+ try {
+ result = Integer.valueOf(property);
+ } catch (Exception e) {
+ logger.log(POILogger.ERROR, "System property -D"+systemProperty +" do not contains a valid integer " + property);
+ }
+ return result;
+ }
+
+
+}
Modified: poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/BaseTestFunctionsFromSpreadsheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/BaseTestFunctionsFromSpreadsheet.java?rev=1488729&r1=1488728&r2=1488729&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/BaseTestFunctionsFromSpreadsheet.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/BaseTestFunctionsFromSpreadsheet.java Sun Jun 2 15:13:47 2013
@@ -226,7 +226,7 @@ public abstract class BaseTestFunctionsF
HSSFCell expectedValueCell = r.getCell(SS.COLUMN_INDEX_EXPECTED_RESULT);
String rowComment = getRowCommentColumnValue(r);
- String msgPrefix = formatTestCaseDetails(sheetName, r.getRowNum(), c, currentGroupComment, rowComment);
+ String msgPrefix = formatTestCaseDetails(this.getFilename(),sheetName, r.getRowNum(), c, currentGroupComment, rowComment);
try {
confirmExpectedResult(msgPrefix, expectedValueCell, actualValue);
_evaluationSuccessCount ++;
@@ -250,10 +250,13 @@ public abstract class BaseTestFunctionsF
}
- private static String formatTestCaseDetails(String sheetName, int rowIndex, HSSFCell c, String currentGroupComment,
+ private static String formatTestCaseDetails(String filename, String sheetName, int rowIndex, HSSFCell c, String currentGroupComment,
String rowComment) {
StringBuffer sb = new StringBuffer();
+
+ sb.append("In ").append(filename).append(" ");
+
CellReference cr = new CellReference(sheetName, rowIndex, c.getColumnIndex(), false, false);
sb.append(cr.formatAsString());
sb.append(" {=").append(c.getCellFormula()).append("}");
Added: poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/TestDec2Hex.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/TestDec2Hex.java?rev=1488729&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/TestDec2Hex.java (added)
+++ poi/trunk/src/testcases/org/apache/poi/ss/formula/functions/TestDec2Hex.java Sun Jun 2 15:13:47 2013
@@ -0,0 +1,79 @@
+/* ====================================================================
+ 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.functions;
+
+import junit.framework.TestCase;
+import org.apache.poi.ss.formula.eval.ErrorEval;
+import org.apache.poi.ss.formula.eval.StringEval;
+import org.apache.poi.ss.formula.eval.ValueEval;
+
+/**
+ * Tests for {@link Dec2Hex}
+ *
+ * @author cedric dot walter @ gmail dot com
+ */
+public final class TestDec2Hex extends TestCase {
+
+ private static ValueEval invokeValue(String number1, String number2) {
+ ValueEval[] args = new ValueEval[] { new StringEval(number1), new StringEval(number2), };
+ return new Dec2Hex().evaluate(args, -1, -1);
+ }
+
+ private static ValueEval invokeValue(String number1) {
+ ValueEval[] args = new ValueEval[] { new StringEval(number1), };
+ return new Dec2Hex().evaluate(args, -1, -1);
+ }
+
+ private static void confirmValue(String msg, String number1, String number2, String expected) {
+ ValueEval result = invokeValue(number1, number2);
+ assertEquals(StringEval.class, result.getClass());
+ assertEquals(msg, expected, ((StringEval) result).getStringValue());
+ }
+
+ private static void confirmValue(String msg, String number1, String expected) {
+ ValueEval result = invokeValue(number1);
+ assertEquals(StringEval.class, result.getClass());
+ assertEquals(msg, expected, ((StringEval) result).getStringValue());
+ }
+
+ private static void confirmValueError(String msg, String number1, String number2, ErrorEval numError) {
+ ValueEval result = invokeValue(number1, number2);
+ assertEquals(ErrorEval.class, result.getClass());
+ assertEquals(msg, numError, result);
+ }
+
+ public void testBasic() {
+ confirmValue("Converts decimal 100 to hexadecimal with 0 characters (64)", "100","0", "64");
+ confirmValue("Converts decimal 100 to hexadecimal with 4 characters (0064)", "100","4", "0064");
+ confirmValue("Converts decimal 100 to hexadecimal with 5 characters (0064)", "100","5", "00064");
+ confirmValue("Converts decimal 100 to hexadecimal with 10 (default) characters", "100","10", "0000000064");
+ confirmValue("If argument places contains a decimal value, dec2hex ignores the numbers to the right side of the decimal point.", "100","10.0", "0000000064");
+
+ confirmValue("Converts decimal -54 to hexadecimal, 0 is ignored", "-54", "0", "00000FFFCA");
+ confirmValue("Converts decimal -54 to hexadecimal, 2 is ignored","-54", "2", "00000FFFCA");
+ confirmValue("places is optionnal","-54", "00000FFFCA");
+ }
+
+ public void testErrors() {
+ confirmValueError("Out of range min number","-549755813889","0", ErrorEval.NUM_ERROR);
+ confirmValueError("Out of range max number","549755813888","0", ErrorEval.NUM_ERROR);
+
+ confirmValueError("negative places not allowed","549755813888","-10", ErrorEval.NUM_ERROR);
+ confirmValueError("non number places not allowed","ABCDEF","0", ErrorEval.VALUE_INVALID);
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org