From 0f2845be6703ae9336814e467d10b6e58219fea6 Mon Sep 17 00:00:00 2001 From: Vladislav Galas Date: Sat, 26 Jan 2019 23:19:53 +0000 Subject: [PATCH] pulled *Cell.setCellValue(double) to the common base git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1852253 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/usermodel/HSSFCell.java | 50 +++++++------------ .../org/apache/poi/ss/usermodel/Cell.java | 5 +- .../org/apache/poi/ss/usermodel/CellBase.java | 25 ++++++++++ .../apache/poi/xssf/streaming/SXSSFCell.java | 25 +++------- .../apache/poi/xssf/usermodel/XSSFCell.java | 25 ++-------- 5 files changed, 55 insertions(+), 75 deletions(-) diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java index b1cf8a4845..7abfe59d20 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java @@ -50,7 +50,6 @@ import org.apache.poi.ss.usermodel.Comment; import org.apache.poi.ss.usermodel.FormulaError; import org.apache.poi.ss.usermodel.Hyperlink; import org.apache.poi.ss.usermodel.RichTextString; -import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.NumberToTextConverter; @@ -420,41 +419,26 @@ public class HSSFCell extends CellBase { } /** - * set a numeric value for the cell - * - * @param value the numeric value to set this cell to. For formulas we'll set the - * precalculated value, for numerics we'll set its value. For other types we - * will change the cell to a numeric cell and set its value. + * {@inheritDoc} */ - @SuppressWarnings("fallthrough") @Override - public void setCellValue(double value) { - if(Double.isInfinite(value)) { - // Excel does not support positive/negative infinities, - // rather, it gives a #DIV/0! error in these cases. - setCellErrorValue(FormulaError.DIV0.getCode()); - } else if (Double.isNaN(value)){ - // Excel does not support Not-a-Number (NaN), - // instead it immediately generates a #NUM! error. - setCellErrorValue(FormulaError.NUM.getCode()); - } else { - int row=_record.getRow(); - short col=_record.getColumn(); - short styleIndex=_record.getXFIndex(); - - switch (_cellType) { - default: - setCellType(CellType.NUMERIC, false, row, col, styleIndex); - // fall through - case NUMERIC: - (( NumberRecord ) _record).setValue(value); - break; - case FORMULA: - ((FormulaRecordAggregate)_record).setCachedDoubleResult(value); - break; - } + @SuppressWarnings("fallthrough") + protected void setCellValueImpl(double value) { + switch (_cellType) { + default: + setCellType(CellType.NUMERIC, + false, + _record.getRow(), + _record.getColumn(), + _record.getXFIndex()); + // fall through + case NUMERIC: + ((NumberRecord)_record).setValue(value); + break; + case FORMULA: + ((FormulaRecordAggregate)_record).setCachedDoubleResult(value); + break; } - } /** diff --git a/src/java/org/apache/poi/ss/usermodel/Cell.java b/src/java/org/apache/poi/ss/usermodel/Cell.java index 533f21a92f..d806ef6842 100644 --- a/src/java/org/apache/poi/ss/usermodel/Cell.java +++ b/src/java/org/apache/poi/ss/usermodel/Cell.java @@ -145,6 +145,7 @@ public interface Cell { * {@link CellType#BOOLEAN}, {@link CellType#ERROR}) depending * on the cached value of the formula * @since POI 3.15 beta 3 + * @deprecated will be removed in 4.2 * Will be renamed to getCachedFormulaResultType() when we make the CellType enum transition in POI 4.0. See bug 59791. */ @Deprecated @@ -152,9 +153,9 @@ public interface Cell { CellType getCachedFormulaResultTypeEnum(); /** - * Set a numeric value for the cell + * Set a numeric value for the cell. * - * @param value the numeric value to set this cell to. For formulas we'll set the + * @param value the numeric value to set this cell to. For formulas we'll set the * precalculated value, for numerics we'll set its value. For other types we * will change the cell to a numeric cell and set its value. */ diff --git a/src/java/org/apache/poi/ss/usermodel/CellBase.java b/src/java/org/apache/poi/ss/usermodel/CellBase.java index 46fa21f3f4..107f906668 100644 --- a/src/java/org/apache/poi/ss/usermodel/CellBase.java +++ b/src/java/org/apache/poi/ss/usermodel/CellBase.java @@ -188,4 +188,29 @@ public abstract class CellBase implements Cell { tryToDeleteArrayFormula(null); } } + + /** + * {@inheritDoc} + */ + @Override + public final void setCellValue(double value) { + if(Double.isInfinite(value)) { + // Excel does not support positive/negative infinities, + // rather, it gives a #DIV/0! error in these cases. + setCellErrorValue(FormulaError.DIV0.getCode()); + } else if (Double.isNaN(value)){ + setCellErrorValue(FormulaError.NUM.getCode()); + } else { + setCellValueImpl(value); + } + } + + /** + * Implementation-specific way to set a numeric value. + * value is guaranteed to be a valid (non-NaN) double. + * The implementation is expected to adjust the cell type accordingly, so that after this call + * getCellType() or getCachedFormulaResultType() would return {@link CellType#NUMERIC}. + * @param value the new value to set + */ + protected abstract void setCellValueImpl(double value); } diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java index be01f3ef54..2b5f4bbf5d 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java @@ -36,7 +36,6 @@ import org.apache.poi.ss.usermodel.FormulaError; import org.apache.poi.ss.usermodel.Hyperlink; import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.util.*; @@ -159,27 +158,15 @@ public class SXSSFCell extends CellBase { } /** - * Set a numeric value for the cell - * - * @param value the numeric value to set this cell to. For formulas we'll set the - * precalculated value, for numerics we'll set its value. For other types we - * will change the cell to a numeric cell and set its value. + * {@inheritDoc} */ @Override - public void setCellValue(double value) - { - if(Double.isInfinite(value)) { - // Excel does not support positive/negative infinities, - // rather, it gives a #DIV/0! error in these cases. - setCellErrorValue(FormulaError.DIV0.getCode()); - } else if (Double.isNaN(value)){ - setCellErrorValue(FormulaError.NUM.getCode()); + public void setCellValueImpl(double value) { + ensureTypeOrFormulaType(CellType.NUMERIC); + if(_value.getType() == CellType.FORMULA) { + ((NumericFormulaValue) _value).setPreEvaluatedValue(value); } else { - ensureTypeOrFormulaType(CellType.NUMERIC); - if(_value.getType()==CellType.FORMULA) - ((NumericFormulaValue)_value).setPreEvaluatedValue(value); - else - ((NumericValue)_value).setValue(value); + ((NumericValue)_value).setValue(value); } } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index 42c34da85a..b16ce37d03 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -311,30 +311,13 @@ public final class XSSFCell extends CellBase { } } - /** - * Set a numeric value for the cell - * - * @param value the numeric value to set this cell to. For formulas we'll set the - * precalculated value, for numerics we'll set its value. For other types we - * will change the cell to a numeric cell and set its value. + * {@inheritDoc} */ @Override - public void setCellValue(double value) { - if(Double.isInfinite(value)) { - // Excel does not support positive/negative infinities, - // rather, it gives a #DIV/0! error in these cases. - _cell.setT(STCellType.E); - _cell.setV(FormulaError.DIV0.getString()); - } else if (Double.isNaN(value)){ - // Excel does not support Not-a-Number (NaN), - // instead it immediately generates an #NUM! error. - _cell.setT(STCellType.E); - _cell.setV(FormulaError.NUM.getString()); - } else { - _cell.setT(STCellType.N); - _cell.setV(String.valueOf(value)); - } + public void setCellValueImpl(double value) { + _cell.setT(STCellType.N); + _cell.setV(String.valueOf(value)); } /** -- 2.39.5