]> source.dussan.org Git - poi.git/commitdiff
Load shared strings table when loading workbook.
authorUgo Cei <ugo@apache.org>
Wed, 13 Feb 2008 13:43:42 +0000 (13:43 +0000)
committerUgo Cei <ugo@apache.org>
Wed, 13 Feb 2008 13:43:42 +0000 (13:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@627407 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/POIXMLDocument.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRow.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFRow.java

index 8b4dc84d9aff32fb28a2bf4f896a6744e5d55038..f84418545ac68ec14cf55ce52aaa294105900beb 100644 (file)
@@ -22,8 +22,10 @@ import org.openxml4j.exceptions.InvalidFormatException;
 import org.openxml4j.exceptions.OpenXML4JException;
 import org.openxml4j.opc.Package;
 import org.openxml4j.opc.PackagePart;
+import org.openxml4j.opc.PackagePartName;
 import org.openxml4j.opc.PackageRelationship;
 import org.openxml4j.opc.PackageRelationshipTypes;
+import org.openxml4j.opc.PackagingURIHelper;
 
 
 public abstract class POIXMLDocument {
@@ -62,4 +64,13 @@ public abstract class POIXMLDocument {
     protected PackagePart getCorePart() {
         return this.corePart;
     }
+
+    protected PackagePart getPart(PackageRelationship rel) throws InvalidFormatException {
+        PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
+        PackagePart part = getPackage().getPart(relName);
+        if (part == null) {
+            throw new IllegalArgumentException("No part found for relationship " + rel);
+        }
+        return part;
+    }
 }
index aed5b6463ef8a0e64301449c6fc78486aff35cde..0eb6384e9b9864e0fe844a2e0ca3a222748ebe03 100644 (file)
@@ -37,8 +37,8 @@ public class XSSFCell implements Cell {
     private static final String TRUE_AS_STRING  = "1";
     private final CTCell cell;
     private final XSSFRow row;
-    private SharedStringSource sharedStringSource;
     private short cellNum;
+    private SharedStringSource sharedStringSource;
     
     /**
      * Create a new XSSFCell. This method is protected to be used only by
@@ -54,10 +54,11 @@ public class XSSFCell implements Cell {
         if (cell.getR() != null) {
             this.cellNum = parseCellNum(cell.getR());
         }
+        this.sharedStringSource = row.getSheet().getWorkbook().getSharedStringSource();
     }
-
-    protected void setSharedStringSource(SharedStringSource sharedStringSource) {
-        this.sharedStringSource = sharedStringSource;
+    
+    protected SharedStringSource getSharedStringSource() {
+        return this.sharedStringSource;
     }
 
     public boolean getBooleanCellValue() {
@@ -154,7 +155,7 @@ public class XSSFCell implements Cell {
         if(this.cell.getT() == STCellType.S) {
             if(this.cell.isSetV()) {
                 int sRef = Integer.parseInt(this.cell.getV());
-                return new XSSFRichTextString(sharedStringSource.getSharedStringAt(sRef));
+                return new XSSFRichTextString(getSharedStringSource().getSharedStringAt(sRef));
             } else {
                 return new XSSFRichTextString("");
             }
@@ -273,7 +274,7 @@ public class XSSFCell implements Cell {
         if(this.cell.getT() != STCellType.S) {
             this.cell.setT(STCellType.S);
         }
-        int sRef = sharedStringSource.putSharedString(value.getString());
+        int sRef = getSharedStringSource().putSharedString(value.getString());
         this.cell.setV(Integer.toString(sRef));
     }
 
index 0d155502ec0e1e314110916c158c0987d2bf9099..fc372de585f8783bf1289d69b490a5b2ad69ac31 100644 (file)
@@ -33,22 +33,35 @@ public class XSSFRow implements Row {
     
     private List<Cell> cells;
     
+    private XSSFSheet sheet;
+    
     /**
      * Create a new XSSFRow. This method is protected to be used only by
      * tests.
      */
-    protected XSSFRow() {
-        this(CTRow.Factory.newInstance());
+    protected XSSFRow(XSSFSheet sheet) {
+        this(CTRow.Factory.newInstance(), sheet);
     }
     
-    public XSSFRow(CTRow row) {
+    /**
+     * Create a new XSSFRow.
+     * 
+     * @param row The underlying XMLBeans row.
+     * @param sheet The parent sheet.
+     */
+    public XSSFRow(CTRow row, XSSFSheet sheet) {
         this.row = row;
+        this.sheet = sheet;
         this.cells = new LinkedList<Cell>(); 
         for (CTCell c : row.getCArray()) {
             this.cells.add(new XSSFCell(this, c));
         }
         
     }
+
+    public XSSFSheet getSheet() {
+        return this.sheet;
+    }
     
     public Iterator<Cell> cellIterator() {
         return cells.iterator();
index 5884f7439a8a62994247be1e78e9fcdd231a3a1a..c1e0c05af705eccbb00b21c8b7648c6a13f0c669 100644 (file)
@@ -53,6 +53,7 @@ public class XSSFSheet implements Sheet {
     private CTWorksheet worksheet;
     private List<Row> rows;
     private ColumnHelper columnHelper;
+    private XSSFWorkbook workbook;
 
     public static final short LeftMargin = 0;
     public static final short RightMargin = 1;
@@ -61,9 +62,10 @@ public class XSSFSheet implements Sheet {
     public static final short HeaderMargin = 4;
     public static final short FooterMargin = 5;
     
-    public XSSFSheet(CTSheet sheet) {
+    public XSSFSheet(CTSheet sheet, XSSFWorkbook workbook) {
         this.sheet = sheet;
         this.worksheet = CTWorksheet.Factory.newInstance();
+        this.workbook = workbook;
         this.worksheet.addNewSheetData();
         initRows(worksheet);
         
@@ -102,17 +104,26 @@ public class XSSFSheet implements Sheet {
         initColumns(worksheet);
     }
     
-    public XSSFSheet(CTSheet sheet, CTWorksheet worksheet) {
+    public XSSFSheet(CTSheet sheet, CTWorksheet worksheet, XSSFWorkbook workbook) {
         this.sheet = sheet;
         this.worksheet = worksheet;
+        this.workbook = workbook;
         initRows(worksheet);
         initColumns(worksheet);
     }
 
+    public XSSFSheet(XSSFWorkbook workbook) {
+        this.workbook = workbook;
+    }
+
+    public XSSFWorkbook getWorkbook() {
+        return this.workbook;
+    }
+
     private void initRows(CTWorksheet worksheet) {
         this.rows = new LinkedList<Row>();
         for (CTRow row : worksheet.getSheetData().getRowArray()) {
-            this.rows.add(new XSSFRow(row));
+            this.rows.add(new XSSFRow(row, this));
         }
     }
 
@@ -153,13 +164,12 @@ public class XSSFSheet implements Sheet {
 
     }
 
-        protected XSSFRow addRow(int index, int rownum) {
-                CTRow row = this.worksheet.getSheetData().insertNewRow(index);
-                XSSFRow xrow = new XSSFRow(row);
-                xrow.setRowNum(rownum);
-//              xrow.setHeight(13.41);
-                return xrow;
-        }
+    protected XSSFRow addRow(int index, int rownum) {
+        CTRow row = this.worksheet.getSheetData().insertNewRow(index);
+        XSSFRow xrow = new XSSFRow(row, this);
+        xrow.setRowNum(rownum);
+        return xrow;
+    }
 
     public Row createRow(int rownum) {
         int index = 0;
@@ -760,7 +770,7 @@ public class XSSFSheet implements Sheet {
     }
     
     protected XSSFSheet cloneSheet() {
-        return new XSSFSheet((CTSheet) sheet.copy());
+        return new XSSFSheet((CTSheet) sheet.copy(), this.workbook);
     }
 
 }
index 44ad5aed242c289660c4d12a4e4bcbefa375fe9f..309225b3a655cebbb290587b2ccf18f74788abc5 100644 (file)
@@ -19,6 +19,7 @@ package org.apache.poi.xssf.usermodel;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -30,8 +31,10 @@ import org.apache.poi.ss.usermodel.DataFormat;
 import org.apache.poi.ss.usermodel.Font;
 import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Palette;
+import org.apache.poi.ss.usermodel.SharedStringSource;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.strings.SharedStringsTable;
 import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
@@ -40,6 +43,7 @@ import org.openxml4j.opc.Package;
 import org.openxml4j.opc.PackagePart;
 import org.openxml4j.opc.PackagePartName;
 import org.openxml4j.opc.PackageRelationship;
+import org.openxml4j.opc.PackageRelationshipCollection;
 import org.openxml4j.opc.PackageRelationshipTypes;
 import org.openxml4j.opc.PackagingURIHelper;
 import org.openxml4j.opc.TargetMode;
@@ -58,10 +62,14 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
 
     private static final String WORKSHEET_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet";
 
+    private static final String SHARED_STRINGS_RELATIONSHIP = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
+    
     private CTWorkbook workbook;
     
     private List<XSSFSheet> sheets = new LinkedList<XSSFSheet>();
-
+    
+    private SharedStringSource sharedStringSource;
+    
     public XSSFWorkbook() {
         this.workbook = CTWorkbook.Factory.newInstance();
         CTBookViews bvs = this.workbook.addNewBookViews();
@@ -75,25 +83,26 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
         try {
             WorkbookDocument doc = WorkbookDocument.Factory.parse(getCorePart().getInputStream());
             this.workbook = doc.getWorkbook();
+            // Load shared strings
+            PackageRelationshipCollection prc = getCorePart().getRelationshipsByType(SHARED_STRINGS_RELATIONSHIP);
+            Iterator<PackageRelationship> it = prc.iterator();
+            if (it.hasNext()) { 
+                PackageRelationship rel = it.next();
+                PackagePart part = getPart(rel);
+                this.sharedStringSource = new SharedStringsTable(part);
+            }
+            // Load individual sheets
             for (CTSheet ctSheet : this.workbook.getSheets().getSheetArray()) {
                 PackageRelationship rel = this.getCorePart().getRelationship(ctSheet.getId());
-                PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
-                PackagePart part = getPackage().getPart(relName);
-                if (part == null) {
-                    throw new IllegalArgumentException("No part found for relationship " + rel);
-                }
+                PackagePart part = getPart(rel);
                 WorksheetDocument worksheetDoc = WorksheetDocument.Factory.parse(part.getInputStream());
-                XSSFSheet sheet = new XSSFSheet(ctSheet, worksheetDoc.getWorksheet());
+                XSSFSheet sheet = new XSSFSheet(ctSheet, worksheetDoc.getWorksheet(), this);
                 this.sheets.add(sheet);
             }
         } catch (XmlException e) {
             throw new IOException(e.toString());
         } catch (InvalidFormatException e) {
             throw new IOException(e.toString());
-/*            
-        } catch (OpenXML4JException e) {
-            throw new IOException(e.toString());
-*/
         }
     }
 
@@ -172,7 +181,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
         if (sheetname != null) {
             sheet.setName(sheetname);
         }
-        XSSFSheet wrapper = new XSSFSheet(sheet);
+        XSSFSheet wrapper = new XSSFSheet(sheet, this);
         this.sheets.add(wrapper);
         return wrapper;
     }
@@ -448,4 +457,12 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
 
     }
 
+    public SharedStringSource getSharedStringSource() {
+        return this.sharedStringSource;
+    }
+
+    protected void setSharedStringSource(SharedStringSource sharedStringSource) {
+        this.sharedStringSource = sharedStringSource;
+    }
+
 }
index 291856ccea8f0e39a7d68defa871702fbc69e736..1c445f2b07c652f5d41e985ab618d468dce3a715 100644 (file)
@@ -48,6 +48,8 @@ public class TestLoadSaveXSSF extends TestCase {
         Cell cell = row.getCell((short) 1);
         assertNotNull(cell);
         assertEquals(111.0, cell.getNumericCellValue());
+        cell = row.getCell((short) 0);
+        assertEquals("Lorem", cell.getRichStringCellValue().getString());
     }
 
 }
index fdd3c1e1ca40f76ffe95b89f6131a158886061e5..2bfe164ea772302c9602be8caced2a0b09043073 100644 (file)
@@ -35,7 +35,8 @@ public class TestXSSFCell extends TestCase {
      * Test setting and getting boolean values.
      */
     public void testSetGetBoolean() throws Exception {
-        XSSFCell cell = new XSSFCell(new XSSFRow());
+        XSSFRow row = createParentObjects();
+        XSSFCell cell = new XSSFCell(row);
         cell.setCellValue(true);
         assertEquals(Cell.CELL_TYPE_BOOLEAN, cell.getCellType());
         assertTrue(cell.getBooleanCellValue());
@@ -54,7 +55,8 @@ public class TestXSSFCell extends TestCase {
      * Test setting and getting numeric values.
      */
     public void testSetGetNumeric() throws Exception {
-        XSSFCell cell = new XSSFCell(new XSSFRow());
+        XSSFRow row = createParentObjects();
+        XSSFCell cell = new XSSFCell(row);
         cell.setCellValue(10d);
         assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType());
         assertEquals(10d, cell.getNumericCellValue());
@@ -66,7 +68,8 @@ public class TestXSSFCell extends TestCase {
      * Test setting and getting numeric values.
      */
     public void testSetGetDate() throws Exception {
-        XSSFCell cell = new XSSFCell(new XSSFRow());
+        XSSFRow row = createParentObjects();
+        XSSFCell cell = new XSSFCell(row);
         Date now = new Date();
         cell.setCellValue(now);
         assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType());
@@ -89,7 +92,8 @@ public class TestXSSFCell extends TestCase {
     }
     
     public void testSetGetError() throws Exception {
-        XSSFCell cell = new XSSFCell(new XSSFRow());
+        XSSFRow row = createParentObjects();
+        XSSFCell cell = new XSSFCell(row);
         cell.setCellErrorValue((byte)255);
         assertEquals(Cell.CELL_TYPE_ERROR, cell.getCellType());
 
@@ -97,7 +101,8 @@ public class TestXSSFCell extends TestCase {
     }
     
     public void testSetGetFormula() throws Exception {
-        XSSFCell cell = new XSSFCell(new XSSFRow());
+        XSSFRow row = createParentObjects();
+        XSSFCell cell = new XSSFCell(row);
         String formula = "SQRT(C2^2+D2^2)";
         
         cell.setCellFormula(formula);
@@ -109,8 +114,8 @@ public class TestXSSFCell extends TestCase {
     
     public void testSetGetStringInline() throws Exception {
         CTCell rawCell = CTCell.Factory.newInstance();
-        XSSFCell cell = new XSSFCell(new XSSFRow(), rawCell);
-        cell.setSharedStringSource(new DummySharedStringSource());
+        XSSFRow row = createParentObjects();
+        XSSFCell cell = new XSSFCell(row, rawCell);
         
         // Default is shared string mode, so have to do this explicitly
         rawCell.setT(STCellType.INLINE_STR);
@@ -133,8 +138,8 @@ public class TestXSSFCell extends TestCase {
     }
     
     public void testSetGetStringShared() throws Exception {
-        XSSFCell cell = new XSSFCell(new XSSFRow());
-        cell.setSharedStringSource(new DummySharedStringSource());
+        XSSFRow row = createParentObjects();
+        XSSFCell cell = new XSSFCell(row);
 
         cell.setCellValue(new XSSFRichTextString(""));
         assertEquals(Cell.CELL_TYPE_STRING, cell.getCellType());
@@ -149,7 +154,8 @@ public class TestXSSFCell extends TestCase {
      * Test that empty cells (no v element) return default values.
      */
     public void testGetEmptyCellValue() throws Exception {
-        XSSFCell cell = new XSSFCell(new XSSFRow());
+        XSSFRow row = createParentObjects();
+        XSSFCell cell = new XSSFCell(row);
         cell.setCellType(Cell.CELL_TYPE_BOOLEAN);
         assertFalse(cell.getBooleanCellValue());
         cell.setCellType(Cell.CELL_TYPE_NUMERIC);
@@ -171,7 +177,7 @@ public class TestXSSFCell extends TestCase {
     }
     
     public void testFormatPosition() {
-        XSSFRow row = new XSSFRow();
+        XSSFRow row = createParentObjects();
         row.setRowNum(0);
         XSSFCell cell = new XSSFCell(row);
         cell.setCellNum((short) 0);
@@ -185,6 +191,14 @@ public class TestXSSFCell extends TestCase {
         row.setRowNum(32767);
         assertEquals("IV32768", cell.formatPosition());
     }
+
+    private XSSFRow createParentObjects() {
+        XSSFWorkbook wb = new XSSFWorkbook();
+        wb.setSharedStringSource(new DummySharedStringSource());
+        XSSFSheet sheet = new XSSFSheet(wb);
+        XSSFRow row = new XSSFRow(sheet);
+        return row;
+    }
     
     public static class DummySharedStringSource implements SharedStringSource {
         ArrayList<String> strs = new ArrayList<String>();
index 571e0f4c779d9bcc903075bfb3af40754b476038..314d49c51aa9334138ce63244589519342eb2ce2 100644 (file)
@@ -22,6 +22,7 @@ import java.util.Iterator;
 import junit.framework.TestCase;
 
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.xssf.usermodel.TestXSSFCell.DummySharedStringSource;
 
 
 public class TestXSSFRow extends TestCase {
@@ -30,7 +31,7 @@ public class TestXSSFRow extends TestCase {
      * Test adding cells to a row in various places and see if we can find them again.
      */
     public void testAddAndIterateCells() {
-        XSSFRow row = new XSSFRow();
+        XSSFRow row = new XSSFRow(createParentObjects());
         
         // One cell at the beginning
         Cell cell1 = row.createCell((short) 1);
@@ -110,7 +111,7 @@ public class TestXSSFRow extends TestCase {
         assertFalse(row.getFirstCellNum() == (short) 2);
         
         // Test a row without cells
-        XSSFRow emptyRow = new XSSFRow();
+        XSSFRow emptyRow = new XSSFRow(createParentObjects());
         assertEquals(-1, emptyRow.getFirstCellNum());
     }
     
@@ -167,8 +168,8 @@ public class TestXSSFRow extends TestCase {
      * Method that returns a row with some sample cells
      * @return row
      */
-    public static XSSFRow getSampleRow() {
-       XSSFRow row = new XSSFRow();
+    public XSSFRow getSampleRow() {
+       XSSFRow row = new XSSFRow(createParentObjects());
        row.createCell((short) 2);
        row.createCell((short) 3, Cell.CELL_TYPE_NUMERIC);
        row.createCell((short) 4);
@@ -178,4 +179,10 @@ public class TestXSSFRow extends TestCase {
        row.createCell((short) 100);
        return row;
     }
+
+    private XSSFSheet createParentObjects() {
+        XSSFWorkbook wb = new XSSFWorkbook();
+        wb.setSharedStringSource(new DummySharedStringSource());
+        return new XSSFSheet(wb);
+    }
 }