aboutsummaryrefslogtreecommitdiffstats
path: root/poi-ooxml
diff options
context:
space:
mode:
authorPJ Fanning <fanningpj@apache.org>2023-10-17 15:22:16 +0000
committerPJ Fanning <fanningpj@apache.org>2023-10-17 15:22:16 +0000
commit818091f54df3dc0dae7873bc19dd46bfa1defc2f (patch)
tree9df9d75ffd74386e0832d1a5175bd7c47411f4e2 /poi-ooxml
parent0dd2b18b56301548794e1ca8c2f558622d799a43 (diff)
downloadpoi-818091f54df3dc0dae7873bc19dd46bfa1defc2f.tar.gz
poi-818091f54df3dc0dae7873bc19dd46bfa1defc2f.zip
[bug-67784] experimental hack to fix regression
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1913067 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poi-ooxml')
-rw-r--r--poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java125
1 files changed, 66 insertions, 59 deletions
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
index 42dca23e30..ec6d1a0872 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
@@ -215,7 +215,9 @@ public class XSSFSheetXMLHandler extends DefaultHandler {
formula.setLength(0);
// Mark us as being a formula if not already
- nextDataType = xssfDataType.FORMULA;
+ if (this.nextDataType == XSSFSheetXMLHandler.xssfDataType.NUMBER) {
+ this.nextDataType = XSSFSheetXMLHandler.xssfDataType.FORMULA;
+ }
// Decide where to get the formula string from
String type = attributes.getValue("t");
@@ -260,6 +262,7 @@ public class XSSFSheetXMLHandler extends DefaultHandler {
// c => cell
else if ("c".equals(localName)) {
// Set up defaults.
+ this.formula.setLength(0);
this.nextDataType = xssfDataType.NUMBER;
this.formatIndex = -1;
this.formatString = null;
@@ -367,68 +370,72 @@ public class XSSFSheetXMLHandler extends DefaultHandler {
String thisStr = null;
// Process the value contents as required, now we have it all
- switch (nextDataType) {
- case BOOLEAN:
- char first = value.charAt(0);
- thisStr = first == '0' ? "FALSE" : "TRUE";
- break;
-
- case ERROR:
- thisStr = "ERROR:" + value;
- break;
-
- case FORMULA:
- if (formulasNotResults) {
- thisStr = formula.toString();
- } else {
- String fv = value.toString();
-
- if (this.formatString != null) {
- try {
- // Try to use the value as a formattable number
- double d = Double.parseDouble(fv);
- thisStr = formatter.formatRawCellContents(d, this.formatIndex, this.formatString);
- } catch (NumberFormatException e) {
- // Formula is a String result not a Numeric one
+ if (formulasNotResults && formula.length() > 0) {
+ thisStr = formula.toString();
+ } else {
+ switch (nextDataType) {
+ case BOOLEAN:
+ char first = value.charAt(0);
+ thisStr = first == '0' ? "FALSE" : "TRUE";
+ break;
+
+ case ERROR:
+ thisStr = "ERROR:" + value;
+ break;
+
+ case FORMULA:
+ if (formulasNotResults) {
+ thisStr = formula.toString();
+ } else {
+ String fv = value.toString();
+
+ if (this.formatString != null) {
+ try {
+ // Try to use the value as a formattable number
+ double d = Double.parseDouble(fv);
+ thisStr = formatter.formatRawCellContents(d, this.formatIndex, this.formatString);
+ } catch (NumberFormatException e) {
+ // Formula is a String result not a Numeric one
+ thisStr = fv;
+ }
+ } else {
+ // No formatting applied, just do raw value in all cases
thisStr = fv;
}
- } else {
- // No formatting applied, just do raw value in all cases
- thisStr = fv;
}
- }
- break;
-
- case INLINE_STRING:
- // TODO: Can these ever have formatting on them?
- XSSFRichTextString rtsi = new XSSFRichTextString(value.toString());
- thisStr = rtsi.toString();
- break;
-
- case SST_STRING:
- String sstIndex = value.toString();
- if (sstIndex.length() > 0) {
- try {
- int idx = Integer.parseInt(sstIndex);
- RichTextString rtss = sharedStringsTable.getItemAt(idx);
- thisStr = rtss.toString();
- } catch (NumberFormatException ex) {
- LOG.atError().withThrowable(ex).log("Failed to parse SST index '{}'", sstIndex);
+ break;
+
+ case INLINE_STRING:
+ // TODO: Can these ever have formatting on them?
+ XSSFRichTextString rtsi = new XSSFRichTextString(value.toString());
+ thisStr = rtsi.toString();
+ break;
+
+ case SST_STRING:
+ String sstIndex = value.toString();
+ if (sstIndex.length() > 0) {
+ try {
+ int idx = Integer.parseInt(sstIndex);
+ RichTextString rtss = sharedStringsTable.getItemAt(idx);
+ thisStr = rtss.toString();
+ } catch (NumberFormatException ex) {
+ LOG.atError().withThrowable(ex).log("Failed to parse SST index '{}'", sstIndex);
+ }
}
- }
- break;
-
- case NUMBER:
- String n = value.toString();
- if (this.formatString != null && n.length() > 0)
- thisStr = formatter.formatRawCellContents(Double.parseDouble(n), this.formatIndex, this.formatString);
- else
- thisStr = n;
- break;
-
- default:
- thisStr = "(TODO: Unexpected type: " + nextDataType + ")";
- break;
+ break;
+
+ case NUMBER:
+ String n = value.toString();
+ if (this.formatString != null && n.length() > 0)
+ thisStr = formatter.formatRawCellContents(Double.parseDouble(n), this.formatIndex, this.formatString);
+ else
+ thisStr = n;
+ break;
+
+ default:
+ thisStr = "(TODO: Unexpected type: " + nextDataType + ")";
+ break;
+ }
}
// Do we have a comment for this cell?