diff --git a/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java b/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java index 934a96738f..bbd77398a9 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java @@ -31,6 +31,9 @@ import java.util.Map; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.ss.usermodel.RichTextString; +import org.apache.poi.util.Removal; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; @@ -140,11 +143,23 @@ public class SharedStringsTable extends POIXMLDocumentPart { * * @param idx index of item to return. * @return the item at the specified position in this Shared String table. + * @deprecated use addSharedStringItem(RichTextString string) instead */ + @Removal(version = "4.2") public CTRst getEntryAt(int idx) { return strings.get(idx); } + /** + * Return a string item by index + * + * @param idx index of item to return. + * @return the item at the specified position in this Shared String table. + */ + public RichTextString getItemAt(int idx) { + return new XSSFRichTextString(strings.get(idx)); + } + /** * Return an integer representing the total count of strings in the workbook. This count does not * include any numbers, it counts only the total of text strings in the workbook. @@ -167,7 +182,7 @@ public class SharedStringsTable extends POIXMLDocumentPart { } /** - * Add an entry to this Shared String table (a new value is appened to the end). + * Add an entry to this Shared String table (a new value is appended to the end). * *

* If the Shared String table already contains this CTRst bean, its index is returned. @@ -176,7 +191,9 @@ public class SharedStringsTable extends POIXMLDocumentPart { * * @param st the entry to add * @return index the index of added entry + * @deprecated use addSharedStringItem(RichTextString string) instead */ + @Removal(version = "4.2") public int addEntry(CTRst st) { String s = getKey(st); count++; @@ -193,15 +210,50 @@ public class SharedStringsTable extends POIXMLDocumentPart { strings.add(newSt); return idx; } + + /** + * Add an entry to this Shared String table (a new value is appended to the end). + * + *

+ * If the Shared String table already contains this string entry, its index is returned. + * Otherwise a new entry is added. + *

+ * + * @param string the entry to add + * @since POI 4.0.0 + * @return index the index of added entry + */ + public int addSharedStringItem(RichTextString string) { + if(!(string instanceof XSSFRichTextString)){ + throw new IllegalArgumentException("Only XSSFRichTextString argument is supported"); + } + return addEntry(((XSSFRichTextString) string).getCTRst()); + } + /** * Provide low-level access to the underlying array of CTRst beans * * @return array of CTRst beans + * @deprecated use getSharedStringItems instead */ + @Removal(version = "4.2") public List getItems() { return Collections.unmodifiableList(strings); } + /** + * Provide access to the strings in the SharedStringsTable + * + * @return list of shared string instances + */ + public List getSharedStringItems() { + ArrayList items = new ArrayList<>(); + for (CTRst rst : strings) { + items.add(new XSSFRichTextString(rst)); + } + return Collections.unmodifiableList(items); + } + /** * Write this table out as XML. * 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 b6abbaf3cc..574cecfc1c 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -450,7 +450,7 @@ public final class XSSFCell implements Cell { _cell.setT(STCellType.S); XSSFRichTextString rt = (XSSFRichTextString)str; rt.setStylesTableReference(_stylesSource); - int sRef = _sharedStringSource.addEntry(rt.getCTRst()); + int sRef = _sharedStringSource.addSharedStringItem(rt); _cell.setV(Integer.toString(sRef)); } break; @@ -966,7 +966,7 @@ public final class XSSFCell implements Cell { String str = convertCellValueToString(); XSSFRichTextString rt = new XSSFRichTextString(str); rt.setStylesTableReference(_stylesSource); - int sRef = _sharedStringSource.addEntry(rt.getCTRst()); + int sRef = _sharedStringSource.addSharedStringItem(rt); _cell.setV(Integer.toString(sRef)); } _cell.setT(STCellType.S); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java index 483b7e2e99..c24fb10008 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java @@ -70,6 +70,7 @@ public class XSSFFont implements Font { * * @param font the underlying CTFont bean */ + @Internal public XSSFFont(CTFont font) { _ctFont = font; _index = 0; @@ -81,6 +82,7 @@ public class XSSFFont implements Font { * @param index font index * @param colorMap for default or custom indexed colors */ + @Internal public XSSFFont(CTFont font, int index, IndexedColorMap colorMap) { _ctFont = font; _index = (short)index; @@ -90,7 +92,7 @@ public class XSSFFont implements Font { /** * Create a new XSSFont. This method is protected to be used only by XSSFWorkbook */ - protected XSSFFont() { + public XSSFFont() { this._ctFont = CTFont.Factory.newInstance(); setFontName(DEFAULT_FONT_NAME); setFontHeight((double)DEFAULT_FONT_SIZE); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java index 3c944d4cde..53eb543cad 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java @@ -99,6 +99,7 @@ public class XSSFRichTextString implements RichTextString { /** * Create a rich text string from the supplied XML bean */ + @Internal public XSSFRichTextString(CTRst st) { this.st = st; } @@ -324,7 +325,7 @@ public class XSSFRichTextString implements RichTextString { * * @param s new string value */ - public void setString(String s){ + public void setString(String s) { clearFormatting(); st.setT(s); preserveSpaces(st.xgetT()); @@ -496,7 +497,7 @@ public class XSSFRichTextString implements RichTextString { * @param value the string to decode * @return the decoded string */ - static String utfDecode(String value){ + static String utfDecode(String value) { if(value == null || !value.contains("_x")) { return value; } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java b/src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java index d1cdfaba08..061144e735 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java @@ -27,6 +27,7 @@ import org.apache.poi.POIDataSamples; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.XSSFTestDataSamples; +import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRElt; @@ -42,6 +43,7 @@ import junit.framework.TestCase; */ public final class TestSharedStringsTable extends TestCase { + @SuppressWarnings("deprecation") public void testCreateNew() { SharedStringsTable sst = new SharedStringsTable(); @@ -113,6 +115,72 @@ public final class TestSharedStringsTable extends TestCase { assertEquals("Second string", new XSSFRichTextString(sst.getEntryAt(2)).toString()); } + public void testCreateUsingRichTextStrings() { + SharedStringsTable sst = new SharedStringsTable(); + + // Check defaults + assertNotNull(sst.getSharedStringItems()); + assertEquals(0, sst.getSharedStringItems().size()); + assertEquals(0, sst.getCount()); + assertEquals(0, sst.getUniqueCount()); + + int idx; + + XSSFRichTextString rts = new XSSFRichTextString("Hello, World!"); + + idx = sst.addSharedStringItem(rts); + assertEquals(0, idx); + assertEquals(1, sst.getCount()); + assertEquals(1, sst.getUniqueCount()); + + //add the same entry again + idx = sst.addSharedStringItem(rts); + assertEquals(0, idx); + assertEquals(2, sst.getCount()); + assertEquals(1, sst.getUniqueCount()); + + //and again + idx = sst.addSharedStringItem(rts); + assertEquals(0, idx); + assertEquals(3, sst.getCount()); + assertEquals(1, sst.getUniqueCount()); + + rts = new XSSFRichTextString("Second string"); + + idx = sst.addSharedStringItem(rts); + assertEquals(1, idx); + assertEquals(4, sst.getCount()); + assertEquals(2, sst.getUniqueCount()); + + //add the same entry again + idx = sst.addSharedStringItem(rts); + assertEquals(1, idx); + assertEquals(5, sst.getCount()); + assertEquals(2, sst.getUniqueCount()); + + rts = new XSSFRichTextString("Second string"); + XSSFFont font = new XSSFFont(); + font.setFontName("Arial"); + font.setBold(true); + rts.applyFont(font); + + idx = sst.addSharedStringItem(rts); + assertEquals(2, idx); + assertEquals(6, sst.getCount()); + assertEquals(3, sst.getUniqueCount()); + + idx = sst.addSharedStringItem(rts); + assertEquals(2, idx); + assertEquals(7, sst.getCount()); + assertEquals(3, sst.getUniqueCount()); + + //OK. the sst table is filled, check the contents + assertEquals(3, sst.getSharedStringItems().size()); + assertEquals("Hello, World!", sst.getItemAt(0).toString()); + assertEquals("Second string", sst.getItemAt(1).toString()); + assertEquals("Second string", sst.getItemAt(2).toString()); + } + public void testReadWrite() throws IOException { XSSFWorkbook wb1 = XSSFTestDataSamples.openSampleWorkbook("sample.xlsx"); SharedStringsTable sst1 = wb1.getSharedStringSource();