Преглед на файлове

fix #45 add an isWrite option on RefTable.

bronze1man преди 11 години
родител
ревизия
83bdc390c6
променени са 3 файла, в които са добавени 30 реда и са изтрити 4 реда
  1. 1 0
      file.go
  2. 8 4
      sharedstrings.go
  3. 21 0
      sharedstrings_test.go

+ 1 - 0
file.go

@@ -104,6 +104,7 @@ func (f *File) makeWorkbook() xlsxWorkbook {
 func (f *File) MarshallParts() (map[string]string, error) {
 	var parts map[string]string
 	var refTable *RefTable = NewSharedStringRefTable()
+	refTable.isWrite = true
 	var workbookRels WorkBookRels = make(WorkBookRels)
 	var err error
 	var workbook xlsxWorkbook

+ 8 - 4
sharedstrings.go

@@ -34,6 +34,7 @@ type xlsxR struct {
 type RefTable struct {
 	indexedStrings []string
 	knownStrings   map[string]int
+	isWrite        bool
 }
 
 // NewSharedStringRefTable() creates a new, empty RefTable.
@@ -49,6 +50,7 @@ func NewSharedStringRefTable() *RefTable {
 // numeric reference is stored to a shared cell value).
 func MakeSharedStringRefTable(source *xlsxSST) *RefTable {
 	reftable := NewSharedStringRefTable()
+	reftable.isWrite = false
 	for _, si := range source.SI {
 		if len(si.R) > 0 {
 			newString := ""
@@ -89,12 +91,14 @@ func (rt *RefTable) ResolveSharedString(index int) string {
 // numeric index.  If the string already exists then it simply returns
 // the existing index.
 func (rt *RefTable) AddString(str string) int {
-	index, ok := rt.knownStrings[str]
-	if ok {
-		return index
+	if rt.isWrite {
+		index, ok := rt.knownStrings[str]
+		if ok {
+			return index
+		}
 	}
 	rt.indexedStrings = append(rt.indexedStrings, str)
-	index = len(rt.indexedStrings) - 1
+	index := len(rt.indexedStrings) - 1
 	rt.knownStrings[str] = index
 	return index
 }

+ 21 - 0
sharedstrings_test.go

@@ -118,3 +118,24 @@ func (s *SharedStringsSuite) TestMarshalSST(c *C) {
   </sst>`
 	c.Assert(output.String(), Equals, expectedXLSXSST)
 }
+
+func (s *SharedStringsSuite) TestRefTableReadAddString(c *C) {
+	refTable := NewSharedStringRefTable()
+	refTable.isWrite = false
+	index1 := refTable.AddString("Foo")
+	index2 := refTable.AddString("Foo")
+	c.Assert(index1, Equals, 0)
+	c.Assert(index2, Equals, 1)
+	c.Assert(refTable.ResolveSharedString(0), Equals, "Foo")
+	c.Assert(refTable.ResolveSharedString(1), Equals, "Foo")
+}
+
+func (s *SharedStringsSuite) TestRefTableWriteAddString(c *C) {
+	refTable := NewSharedStringRefTable()
+	refTable.isWrite = true
+	index1 := refTable.AddString("Foo")
+	index2 := refTable.AddString("Foo")
+	c.Assert(index1, Equals, 0)
+	c.Assert(index2, Equals, 0)
+	c.Assert(refTable.ResolveSharedString(0), Equals, "Foo")
+}