Przeglądaj źródła

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

Hugh Gao 10 lat temu
rodzic
commit
c6acfd6de1
2 zmienionych plików z 30 dodań i 18 usunięć
  1. 18 14
      xmlStyle.go
  2. 12 4
      xmlStyle_test.go

+ 18 - 14
xmlStyle.go

@@ -30,22 +30,22 @@ 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",
 	15: "d-mmm-yy",
 	16: "d-mmm",
 	17: "mmm-yy",
-	18: "h:mm AM/PM",
-	19: "h:mm:ss AM/PM",
+	18: "h:mm am/pm",
+	19: "h:mm:ss am/pm",
 	20: "h:mm",
 	21: "h:mm:ss",
 	22: "m/d/yy h:mm",
 	37: "#,##0 ;(#,##0)",
-	38: "#,##0 ;[Red](#,##0)",
+	38: "#,##0 ;[red](#,##0)",
 	39: "#,##0.00;(#,##0.00)",
-	40: "#,##0.00;[Red](#,##0.00)",
+	40: "#,##0.00;[red](#,##0.00)",
 	41: `_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)`,
 	42: `_("$"* #,##0_);_("$* \(#,##0\);_("$"* "-"_);_(@_)`,
 	43: `_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)`,
@@ -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)
 }