فهرست منبع

Test that we copy the ApplyBorder, ApplyFill and ApplyFont attributes from the
CellXf and CellStyleXf into the user oriented style.

Geoffrey J. Teale 11 سال پیش
والد
کامیت
be61afb670
2فایلهای تغییر یافته به همراه19 افزوده شده و 8 حذف شده
  1. 3 0
      file_test.go
  2. 16 8
      xmlStyle.go

+ 3 - 0
file_test.go

@@ -158,12 +158,15 @@ func (l *FileSuite) TestGetStyleFromZipFile(c *C) {
 	style = cellFoo.GetStyle()
 	style = cellFoo.GetStyle()
 	c.Assert(cellFoo.String(), Equals, "Foo")
 	c.Assert(cellFoo.String(), Equals, "Foo")
 	c.Assert(style.Fill.BgColor, Equals, "FF33CCCC")
 	c.Assert(style.Fill.BgColor, Equals, "FF33CCCC")
+	c.Assert(style.ApplyFill, Equals, false)
+	c.Assert(style.ApplyFont, Equals, true)
 
 
 	row1 := tabelle1.Rows[1]
 	row1 := tabelle1.Rows[1]
 	cellQuuk := row1.Cells[1]
 	cellQuuk := row1.Cells[1]
 	style = cellQuuk.GetStyle()
 	style = cellQuuk.GetStyle()
 	c.Assert(cellQuuk.String(), Equals, "Quuk")
 	c.Assert(cellQuuk.String(), Equals, "Quuk")
 	c.Assert(style.Border.Left, Equals, "thin")
 	c.Assert(style.Border.Left, Equals, "thin")
+	c.Assert(style.ApplyBorder, Equals, true)
 
 
 	cellBar := row0.Cells[1]
 	cellBar := row0.Cells[1]
 	c.Assert(cellBar.String(), Equals, "Bar")
 	c.Assert(cellBar.String(), Equals, "Bar")

+ 16 - 8
xmlStyle.go

@@ -126,6 +126,7 @@ type xlsxAlignment struct {
 }
 }
 
 
 func (styles *xlsxStyles) getStyle(styleIndex int) (style Style) {
 func (styles *xlsxStyles) getStyle(styleIndex int) (style Style) {
+	var styleXf xlsxXf
 	style = Style{}
 	style = Style{}
 	style.Border = Border{}
 	style.Border = Border{}
 	style.Fill = Fill{}
 	style.Fill = Fill{}
@@ -135,26 +136,33 @@ func (styles *xlsxStyles) getStyle(styleIndex int) (style Style) {
 	if styleIndex > -1 && xfCount > 0 && styleIndex <= xfCount {
 	if styleIndex > -1 && xfCount > 0 && styleIndex <= xfCount {
 		xf := styles.CellXfs[styleIndex]
 		xf := styles.CellXfs[styleIndex]
 
 
-		if xf.ApplyBorder {
+		// Google docs can produce output that has fewer
+		// CellStyleXfs than CellXfs - this copes with that.
+		if styleIndex < len(styles.CellStyleXfs) {
+			styleXf = styles.CellStyleXfs[styleIndex]
+		} else {
+			styleXf = xlsxXf{}
+		}
+
+		style.ApplyBorder = xf.ApplyBorder || styleXf.ApplyBorder
+		style.ApplyFill = xf.ApplyFill || styleXf.ApplyFill
+		style.ApplyFont = xf.ApplyFont || styleXf.ApplyFont
+
+		if xf.BorderId > -1 && xf.BorderId < len(styles.Borders) {
 			style.Border.Left = styles.Borders[xf.BorderId].Left.Style
 			style.Border.Left = styles.Borders[xf.BorderId].Left.Style
 			style.Border.Right = styles.Borders[xf.BorderId].Right.Style
 			style.Border.Right = styles.Borders[xf.BorderId].Right.Style
 			style.Border.Top = styles.Borders[xf.BorderId].Top.Style
 			style.Border.Top = styles.Borders[xf.BorderId].Top.Style
 			style.Border.Bottom = styles.Borders[xf.BorderId].Bottom.Style
 			style.Border.Bottom = styles.Borders[xf.BorderId].Bottom.Style
 		}
 		}
-		// TODO - consider how to handle the fact that
-		// ApplyFill can be missing.  At the moment the XML
-		// unmarshaller simply sets it to false, which creates
-		// a bug.
 
 
-		// if xf.ApplyFill {
 		if xf.FillId > -1 && xf.FillId < len(styles.Fills) {
 		if xf.FillId > -1 && xf.FillId < len(styles.Fills) {
 			xFill := styles.Fills[xf.FillId]
 			xFill := styles.Fills[xf.FillId]
 			style.Fill.PatternType = xFill.PatternFill.PatternType
 			style.Fill.PatternType = xFill.PatternFill.PatternType
 			style.Fill.FgColor = xFill.PatternFill.FgColor.RGB
 			style.Fill.FgColor = xFill.PatternFill.FgColor.RGB
 			style.Fill.BgColor = xFill.PatternFill.BgColor.RGB
 			style.Fill.BgColor = xFill.PatternFill.BgColor.RGB
 		}
 		}
-		// }
-		if xf.ApplyFont {
+
+		if xf.FontId > -1 && xf.FontId < len(styles.Fonts) {
 			xfont := styles.Fonts[xf.FontId]
 			xfont := styles.Fonts[xf.FontId]
 			style.Font.Size, _ = strconv.Atoi(xfont.Sz.Val)
 			style.Font.Size, _ = strconv.Atoi(xfont.Sz.Val)
 			style.Font.Name = xfont.Name.Val
 			style.Font.Name = xfont.Name.Val