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;
* (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 {
NUMBER,
}
+ /**
+ * Each cell is enclosed in "si". Each cell can have multiple "t" elements.
+ * Example input
+ *
+ * <pre>
+ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+ <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="2" uniqueCount="2">
+ <si>
+ <r>
+ <rPr>
+ <b />
+ <sz val="11" />
+ <color theme="1" />
+ <rFont val="Calibri" />
+ <family val="2" />
+ <scheme val="minor" />
+ </rPr>
+ <t>This:</t>
+ </r>
+ <r>
+ <rPr>
+ <sz val="11" />
+ <color theme="1" />
+ <rFont val="Calibri" />
+ <family val="2" />
+ <scheme val="minor" />
+ </rPr>
+ <t xml:space="preserve">Causes Problems</t>
+ </r>
+ </si>
+ <si>
+ <t>This does not</t>
+ </si>
+ </sst>
+ * </pre>
+ *
+ */
static class ReadonlySharedStringsTable extends DefaultHandler {
/**
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;
}
}
*/
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;
}
}