Browse Source

fix adding duplicate NumFmt; fix the builtin number format code such as 00+E00 which was not recognized as builtin NumFormt.

Hugh Gao 10 years ago
parent
commit
2c3b48eaf2
2 changed files with 26 additions and 14 deletions
  1. 14 10
      xmlStyle.go
  2. 12 4
      xmlStyle_test.go

+ 14 - 10
xmlStyle.go

@@ -30,7 +30,7 @@ var builtInNumFmt = map[int]string{
 	4:  "#,##0.00",
 	9:  "0%",
 	10: "0.00%",
-	11: "0.00E+00",
+	11: "0.00e+00",
 	12: "# ?/?",
 	13: "# ??/??",
 	14: "mm-dd-yy",
@@ -53,7 +53,7 @@ var builtInNumFmt = map[int]string{
 	45: "mm:ss",
 	46: "[h]:mm:ss",
 	47: "mmss.0",
-	48: "##0.0E+0",
+	48: "##0.0e+0",
 	49: "@",
 }
 
@@ -154,7 +154,7 @@ func (styles *xlsxStyleSheet) getStyle(styleIndex int) (style *Style) {
 			if italic := xfont.I; italic != nil && italic.Val != "0" {
 				style.Font.Italic = true
 			}
-			if underline := xfont.U; underline != nil && underline.Val != "0"  {
+			if underline := xfont.U; underline != nil && underline.Val != "0" {
 				style.Font.Underline = true
 			}
 		}
@@ -285,6 +285,13 @@ func (styles *xlsxStyleSheet) newNumFmt(formatCode string) xlsxNumFmt {
 		return xlsxNumFmt{NumFmtId: numFmtId, FormatCode: formatCode}
 	}
 
+	// find the exist xlsxNumFmt
+	for _, numFmt := range styles.NumFmts.NumFmt {
+		if formatCode == numFmt.FormatCode {
+			return numFmt
+		}
+	}
+
 	// The user define NumFmtId. The one less than 164 in built in.
 	numFmtId = builtinNumFmtsCount + 1
 	styles.lock.Lock()
@@ -301,24 +308,21 @@ func (styles *xlsxStyleSheet) newNumFmt(formatCode string) xlsxNumFmt {
 	return xlsxNumFmt{NumFmtId: numFmtId, FormatCode: formatCode}
 }
 
-func (styles *xlsxStyleSheet) addNumFmt(xNumFmt xlsxNumFmt) (index int) {
+// addNumFmt add xlsxNumFmt if its not exist.
+func (styles *xlsxStyleSheet) addNumFmt(xNumFmt xlsxNumFmt) {
 	// don't add built in NumFmt
 	if xNumFmt.NumFmtId <= builtinNumFmtsCount {
-		return -1
+		return
 	}
-	numFmt, ok := styles.numFmtRefTable[xNumFmt.NumFmtId]
+	_, ok := styles.numFmtRefTable[xNumFmt.NumFmtId]
 	if !ok {
 		if styles.numFmtRefTable == nil {
 			styles.numFmtRefTable = make(map[int]xlsxNumFmt)
 		}
 		styles.NumFmts.NumFmt = append(styles.NumFmts.NumFmt, xNumFmt)
 		styles.numFmtRefTable[xNumFmt.NumFmtId] = xNumFmt
-		index = styles.NumFmts.Count
 		styles.NumFmts.Count += 1
-		return
 	}
-	numFmt.FormatCode = xNumFmt.FormatCode
-	return
 }
 
 func (styles *xlsxStyleSheet) Marshal() (result string, err error) {

+ 12 - 4
xmlStyle_test.go

@@ -309,8 +309,10 @@ func (s *CellSuite) TestNewNumFmt(c *C) {
 	styles.NumFmts.NumFmt = make([]xlsxNumFmt, 0)
 
 	c.Assert(styles.newNumFmt("0"), DeepEquals, xlsxNumFmt{1, "0"})
+	c.Assert(styles.newNumFmt("0.00e+00"), DeepEquals, xlsxNumFmt{11, "0.00e+00"})
 	c.Assert(styles.newNumFmt("mm-dd-yy"), DeepEquals, xlsxNumFmt{14, "mm-dd-yy"})
 	c.Assert(styles.newNumFmt("hh:mm:ss"), DeepEquals, xlsxNumFmt{164, "hh:mm:ss"})
+	c.Assert(len(styles.NumFmts.NumFmt), Equals, 1)
 }
 
 func (s *CellSuite) TestAddNumFmt(c *C) {
@@ -318,8 +320,14 @@ func (s *CellSuite) TestAddNumFmt(c *C) {
 	styles.NumFmts = xlsxNumFmts{}
 	styles.NumFmts.NumFmt = make([]xlsxNumFmt, 0)
 
-	c.Assert(styles.addNumFmt(xlsxNumFmt{1, "0"}), Equals, -1)
-	c.Assert(styles.addNumFmt(xlsxNumFmt{14, "mm-dd-yy"}), Equals, -1)
-	c.Assert(styles.addNumFmt(xlsxNumFmt{164, "hh:mm:ss"}), DeepEquals, 0)
-	c.Assert(styles.addNumFmt(xlsxNumFmt{165, "yyyy/mm/dd"}), DeepEquals, 1)
+	styles.addNumFmt(xlsxNumFmt{1, "0"})
+	c.Assert(styles.NumFmts.Count, Equals, 0)
+	styles.addNumFmt(xlsxNumFmt{14, "mm-dd-yy"})
+	c.Assert(styles.NumFmts.Count, Equals, 0)
+	styles.addNumFmt(xlsxNumFmt{164, "hh:mm:ss"})
+	c.Assert(styles.NumFmts.Count, Equals, 1)
+	styles.addNumFmt(xlsxNumFmt{165, "yyyy/mm/dd"})
+	c.Assert(styles.NumFmts.Count, Equals, 2)
+	styles.addNumFmt(xlsxNumFmt{165, "yyyy/mm/dd"})
+	c.Assert(styles.NumFmts.Count, Equals, 2)
 }