aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYegor Kozlov <yegor@apache.org>2009-11-16 17:31:16 +0000
committerYegor Kozlov <yegor@apache.org>2009-11-16 17:31:16 +0000
commit50f3168c1abf9d371521bc74fcd7f4f12a3e993a (patch)
treea8e91f68205fc1793607fff60fddbacf6496fe35 /src
parentce79a4f121feeef71c16edb52f5adbea2e6c27ab (diff)
downloadpoi-50f3168c1abf9d371521bc74fcd7f4f12a3e993a.tar.gz
poi-50f3168c1abf9d371521bc74fcd7f4f12a3e993a.zip
fixed XLSX2CSV to avoid exception when processing cells with multiple "t" elements, see Bugzilla 47757
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@880864 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r--src/documentation/content/xdocs/status.xml1
-rw-r--r--src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java54
2 files changed, 51 insertions, 4 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml
index 0ae0c956ba..b2c9c100f4 100644
--- a/src/documentation/content/xdocs/status.xml
+++ b/src/documentation/content/xdocs/status.xml
@@ -34,6 +34,7 @@
<changes>
<release version="3.6-beta1" date="2009-??-??">
+ <action dev="POI-DEVELOPERS" type="fix">47757 - fixed XLSX2CSV to avoid exception when processing cells with multiple "t" elements</action>
<action dev="POI-DEVELOPERS" type="add">48195 - short-circuit evaluation of IF() and CHOOSE()</action>
<action dev="POI-DEVELOPERS" type="add">48161 - support for text extraction from PPT master slides</action>
<action dev="POI-DEVELOPERS" type="add">47970 - added a method to set arabic mode in HSSFSheet</action>
diff --git a/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java b/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java
index 91092eda67..8a77e599df 100644
--- a/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java
+++ b/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java
@@ -34,6 +34,7 @@ import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.ss.usermodel.BuiltinFormats;
import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
@@ -60,7 +61,12 @@ import org.xml.sax.helpers.DefaultHandler;
* (read-only) class is used for the shared string table
* because the standard POI SharedStringsTable grows very
* quickly with the number of unique strings.
- *
+ * <p/>
+ * Thanks to Eric Smith for a patch that fixes a problem
+ * triggered by cells with multiple "t" elements, which is
+ * how Excel represents different formats (e.g., one word
+ * plain and one word bold).
+ *
* @author Chris Lott
*/
public class XLSX2CSV {
@@ -78,6 +84,43 @@ public class XLSX2CSV {
NUMBER,
}
+ /**
+ * Each cell is enclosed in "si". Each cell can have multiple "t" elements.
+ * Example input
+ *
+ * <pre>
+ &lt;?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+ &lt;sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="2" uniqueCount="2">
+ &lt;si>
+ &lt;r>
+ &lt;rPr>
+ &lt;b />
+ &lt;sz val="11" />
+ &lt;color theme="1" />
+ &lt;rFont val="Calibri" />
+ &lt;family val="2" />
+ &lt;scheme val="minor" />
+ &lt;/rPr>
+ &lt;t>This:&lt;/t>
+ &lt;/r>
+ &lt;r>
+ &lt;rPr>
+ &lt;sz val="11" />
+ &lt;color theme="1" />
+ &lt;rFont val="Calibri" />
+ &lt;family val="2" />
+ &lt;scheme val="minor" />
+ &lt;/rPr>
+ &lt;t xml:space="preserve">Causes Problems&lt;/t>
+ &lt;/r>
+ &lt;/si>
+ &lt;si>
+ &lt;t>This does not&lt;/t>
+ &lt;/si>
+ &lt;/sst>
+ * </pre>
+ *
+ */
static class ReadonlySharedStringsTable extends DefaultHandler {
/**
@@ -192,8 +235,9 @@ public class XLSX2CSV {
this.strings = new String[this.uniqueCount];
index = 0;
characters = new StringBuffer();
- } else if ("t".equals(name)) {
+ } else if ("si".equals(name)) {
characters.setLength(0);
+ } else if ("t".equals(name)) {
tIsOpen = true;
}
}
@@ -204,9 +248,11 @@ public class XLSX2CSV {
*/
public void endElement(String uri, String localName, String name)
throws SAXException {
- if ("t".equals(name)) {
- strings[index] = characters.toString();
+ if ("si".equals(name)) {
+ strings[index] = characters.toString();
++index;
+ } else if ("t".equals(name)) {
+ tIsOpen = false;
}
}