You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TestSharedStringsTable.java 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /* ====================================================================
  2. Licensed to the Apache Software Foundation (ASF) under one or more
  3. contributor license agreements. See the NOTICE file distributed with
  4. this work for additional information regarding copyright ownership.
  5. The ASF licenses this file to You under the Apache License, Version 2.0
  6. (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. ==================================================================== */
  15. package org.apache.poi.xssf.model;
  16. import java.util.List;
  17. import java.util.ArrayList;
  18. import java.io.*;
  19. import junit.framework.TestCase;
  20. import org.apache.poi.xssf.XSSFTestDataSamples;
  21. import org.apache.poi.xssf.usermodel.XSSFRichTextString;
  22. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  23. import org.apache.poi.ss.usermodel.Workbook;
  24. import org.apache.poi.ss.usermodel.Sheet;
  25. import org.apache.poi.POIDataSamples;
  26. import org.apache.poi.POIXMLException;
  27. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRElt;
  28. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRPrElt;
  29. import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
  30. /**
  31. * Test {@link SharedStringsTable}, the cache of strings in a workbook
  32. *
  33. * @author Yegor Kozlov
  34. */
  35. public final class TestSharedStringsTable extends TestCase {
  36. public void testCreateNew() {
  37. SharedStringsTable sst = new SharedStringsTable();
  38. CTRst st;
  39. int idx;
  40. // Check defaults
  41. assertNotNull(sst.getItems());
  42. assertEquals(0, sst.getItems().size());
  43. assertEquals(0, sst.getCount());
  44. assertEquals(0, sst.getUniqueCount());
  45. st = CTRst.Factory.newInstance();
  46. st.setT("Hello, World!");
  47. idx = sst.addEntry(st);
  48. assertEquals(0, idx);
  49. assertEquals(1, sst.getCount());
  50. assertEquals(1, sst.getUniqueCount());
  51. //add the same entry again
  52. idx = sst.addEntry(st);
  53. assertEquals(0, idx);
  54. assertEquals(2, sst.getCount());
  55. assertEquals(1, sst.getUniqueCount());
  56. //and again
  57. idx = sst.addEntry(st);
  58. assertEquals(0, idx);
  59. assertEquals(3, sst.getCount());
  60. assertEquals(1, sst.getUniqueCount());
  61. st = CTRst.Factory.newInstance();
  62. st.setT("Second string");
  63. idx = sst.addEntry(st);
  64. assertEquals(1, idx);
  65. assertEquals(4, sst.getCount());
  66. assertEquals(2, sst.getUniqueCount());
  67. //add the same entry again
  68. idx = sst.addEntry(st);
  69. assertEquals(1, idx);
  70. assertEquals(5, sst.getCount());
  71. assertEquals(2, sst.getUniqueCount());
  72. st = CTRst.Factory.newInstance();
  73. CTRElt r = st.addNewR();
  74. CTRPrElt pr = r.addNewRPr();
  75. pr.addNewColor().setRgb(new byte[]{(byte)0xFF, 0, 0}); //red
  76. pr.addNewI().setVal(true); //bold
  77. pr.addNewB().setVal(true); //italic
  78. r.setT("Second string");
  79. idx = sst.addEntry(st);
  80. assertEquals(2, idx);
  81. assertEquals(6, sst.getCount());
  82. assertEquals(3, sst.getUniqueCount());
  83. idx = sst.addEntry(st);
  84. assertEquals(2, idx);
  85. assertEquals(7, sst.getCount());
  86. assertEquals(3, sst.getUniqueCount());
  87. //OK. the sst table is filled, check the contents
  88. assertEquals(3, sst.getItems().size());
  89. assertEquals("Hello, World!", new XSSFRichTextString(sst.getEntryAt(0)).toString());
  90. assertEquals("Second string", new XSSFRichTextString(sst.getEntryAt(1)).toString());
  91. assertEquals("Second string", new XSSFRichTextString(sst.getEntryAt(2)).toString());
  92. }
  93. public void testReadWrite() {
  94. XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("sample.xlsx");
  95. SharedStringsTable sst1 = wb.getSharedStringSource();
  96. //serialize, read back and compare with the original
  97. SharedStringsTable sst2 = XSSFTestDataSamples.writeOutAndReadBack(wb).getSharedStringSource();
  98. assertEquals(sst1.getCount(), sst2.getCount());
  99. assertEquals(sst1.getUniqueCount(), sst2.getUniqueCount());
  100. List<CTRst> items1 = sst1.getItems();
  101. List<CTRst> items2 = sst2.getItems();
  102. assertEquals(items1.size(), items2.size());
  103. for (int i = 0; i < items1.size(); i++) {
  104. CTRst st1 = items1.get(i);
  105. CTRst st2 = items2.get(i);
  106. assertEquals(st1.toString(), st2.toString());
  107. }
  108. }
  109. /**
  110. * Test for Bugzilla 48936
  111. *
  112. * A specific sequence of strings can result in broken CDATA section in sharedStrings.xml file.
  113. *
  114. * @author Philippe Laflamme
  115. */
  116. public void testBug48936() throws IOException {
  117. Workbook w = new XSSFWorkbook();
  118. Sheet s = w.createSheet();
  119. int i = 0;
  120. List<String> lst = readStrings("48936-strings.txt");
  121. for (String str : lst) {
  122. s.createRow(i++).createCell(0).setCellValue(str);
  123. }
  124. try {
  125. w = XSSFTestDataSamples.writeOutAndReadBack(w);
  126. } catch (POIXMLException e){
  127. fail("Detected Bug #48936");
  128. }
  129. s = w.getSheetAt(0);
  130. i = 0;
  131. for (String str : lst) {
  132. String val = s.getRow(i++).getCell(0).getStringCellValue();
  133. assertEquals(str, val);
  134. }
  135. }
  136. private List<String> readStrings(String filename) throws IOException {
  137. List<String> strs = new ArrayList<String>();
  138. POIDataSamples samples = POIDataSamples.getSpreadSheetInstance();
  139. BufferedReader br = new BufferedReader(
  140. new InputStreamReader(samples.openResourceAsStream(filename)));
  141. String s;
  142. while ((s = br.readLine()) != null) {
  143. if (s.trim().length() > 0) {
  144. strs.add(s.trim());
  145. }
  146. }
  147. br.close();
  148. return strs;
  149. }
  150. }