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
This commit is contained in:
Vladislav Galas 2019-01-26 23:19:53 +00:00
parent 70b4b88a3a
commit 5da229797f
5 changed files with 55 additions and 75 deletions

View File

@ -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;
}
}
/**

View File

@ -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 <code>getCachedFormulaResultType()</code> 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.
*/

View File

@ -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.
* <code>value</code> 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);
}

View File

@ -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);
}
}

View File

@ -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));
}
/**