Ver Fonte

Merge pull request #391 from mlh758/390-change-default-font

Add the ability to change the default font
xuri há 6 anos atrás
pai
commit
6233757805
5 ficheiros alterados com 65 adições e 14 exclusões
  1. 3 2
      comment.go
  2. 1 1
      shape.go
  3. 31 9
      styles.go
  4. 29 1
      styles_test.go
  5. 1 1
      templates.go

+ 3 - 2
comment.go

@@ -239,6 +239,7 @@ func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) {
 			},
 		}
 	}
+	defaultFont := f.GetDefaultFont()
 	cmt := xlsxComment{
 		Ref:      cell,
 		AuthorID: 0,
@@ -251,7 +252,7 @@ func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) {
 						Color: &xlsxColor{
 							Indexed: 81,
 						},
-						RFont:  &attrValString{Val: "Calibri"},
+						RFont:  &attrValString{Val: defaultFont},
 						Family: &attrValInt{Val: 2},
 					},
 					T: a,
@@ -262,7 +263,7 @@ func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) {
 						Color: &xlsxColor{
 							Indexed: 81,
 						},
-						RFont:  &attrValString{Val: "Calibri"},
+						RFont:  &attrValString{Val: defaultFont},
 						Family: &attrValInt{Val: 2},
 					},
 					T: t,

+ 1 - 1
shape.go

@@ -381,7 +381,7 @@ func (f *File) addDrawingShape(sheet, drawingXML, cell string, formatSet *format
 					Bold:      false,
 					Italic:    false,
 					Underline: "none",
-					Family:    "Calibri",
+					Family:    f.GetDefaultFont(),
 					Size:      11,
 					Color:     "#000000",
 				},

+ 31 - 9
styles.go

@@ -1896,7 +1896,7 @@ func (f *File) NewStyle(style string) (int, error) {
 
 	if fs.Font != nil {
 		s.Fonts.Count++
-		s.Fonts.Font = append(s.Fonts.Font, setFont(fs))
+		s.Fonts.Font = append(s.Fonts.Font, f.setFont(fs))
 		fontID = s.Fonts.Count - 1
 	}
 
@@ -1932,7 +1932,7 @@ func (f *File) NewConditionalStyle(style string) (int, error) {
 		Border:    setBorders(fs),
 	}
 	if fs.Font != nil {
-		dxf.Font = setFont(fs)
+		dxf.Font = f.setFont(fs)
 	}
 	dxfStr, _ := xml.Marshal(dxf)
 	if s.Dxfs == nil {
@@ -1945,9 +1945,32 @@ func (f *File) NewConditionalStyle(style string) (int, error) {
 	return s.Dxfs.Count - 1, nil
 }
 
+// GetDefaultFont provides the default font name currently set in the workbook
+// Documents generated by excelize start with Calibri
+func (f *File) GetDefaultFont() string {
+	font := f.readDefaultFont()
+	return font.Name.Val
+}
+
+// SetDefaultFont changes the default font in the workbook
+func (f *File) SetDefaultFont(fontName string) {
+	font := f.readDefaultFont()
+	font.Name.Val = fontName
+	s := f.stylesReader()
+	s.Fonts.Font[0] = font
+	custom := true
+	s.CellStyles.CellStyle[0].CustomBuiltIn = &custom
+}
+
+// readDefaultFont provides an unmarshalled font value
+func (f *File) readDefaultFont() *xlsxFont {
+	s := f.stylesReader()
+	return s.Fonts.Font[0]
+}
+
 // setFont provides a function to add font style by given cell format
 // settings.
-func setFont(formatStyle *formatStyle) *xlsxFont {
+func (f *File) setFont(formatStyle *formatStyle) *xlsxFont {
 	fontUnderlineType := map[string]string{"single": "single", "double": "double"}
 	if formatStyle.Font.Size < 1 {
 		formatStyle.Font.Size = 11
@@ -1955,7 +1978,7 @@ func setFont(formatStyle *formatStyle) *xlsxFont {
 	if formatStyle.Font.Color == "" {
 		formatStyle.Font.Color = "#000000"
 	}
-	f := xlsxFont{
+	fnt := xlsxFont{
 		B:      formatStyle.Font.Bold,
 		I:      formatStyle.Font.Italic,
 		Sz:     &attrValInt{Val: formatStyle.Font.Size},
@@ -1963,15 +1986,14 @@ func setFont(formatStyle *formatStyle) *xlsxFont {
 		Name:   &attrValString{Val: formatStyle.Font.Family},
 		Family: &attrValInt{Val: 2},
 	}
-	if f.Name.Val == "" {
-		f.Name.Val = "Calibri"
-		f.Scheme = &attrValString{Val: "minor"}
+	if fnt.Name.Val == "" {
+		fnt.Name.Val = f.GetDefaultFont()
 	}
 	val, ok := fontUnderlineType[formatStyle.Font.Underline]
 	if ok {
-		f.U = &attrValString{Val: val}
+		fnt.U = &attrValString{Val: val}
 	}
-	return &f
+	return &fnt
 }
 
 // setNumFmt provides a function to check if number format code in the range

+ 29 - 1
styles_test.go

@@ -25,7 +25,7 @@ func TestStyleFill(t *testing.T) {
 		xl := NewFile()
 		styleID, err := xl.NewStyle(testCase.format)
 		if err != nil {
-			t.Fatalf("%v", err)
+			t.Fatal(err)
 		}
 
 		styles := xl.stylesReader()
@@ -165,3 +165,31 @@ func TestSetConditionalFormat(t *testing.T) {
 		assert.EqualValues(t, testCase.rules, cf[0].CfRule, testCase.label)
 	}
 }
+
+func TestNewStyle(t *testing.T) {
+	f := NewFile()
+	styleID, err := f.NewStyle(`{"font":{"bold":true,"italic":true,"family":"Berlin Sans FB Demi","size":36,"color":"#777777"}}`)
+	if err != nil {
+		t.Fatal(err)
+	}
+	styles := f.stylesReader()
+	fontID := styles.CellXfs.Xf[styleID].FontID
+	font := styles.Fonts.Font[fontID]
+	assert.Contains(t, font.Name.Val, "Berlin Sans FB Demi", "Stored font should contain font name")
+	assert.Equal(t, 2, styles.CellXfs.Count, "Should have 2 styles")
+}
+
+func TestGetDefaultFont(t *testing.T) {
+	f := NewFile()
+	s := f.GetDefaultFont()
+	assert.Equal(t, s, "Calibri", "Default font should be Calibri")
+}
+
+func TestSetDefaultFont(t *testing.T) {
+	f := NewFile()
+	f.SetDefaultFont("Ariel")
+	styles := f.stylesReader()
+	s := f.GetDefaultFont()
+	assert.Equal(t, s, "Ariel", "Default font should change to Ariel")
+	assert.Equal(t, *styles.CellStyles.CellStyle[0].CustomBuiltIn, true)
+}

+ 1 - 1
templates.go

@@ -27,7 +27,7 @@ const templateContentTypes = `<Types xmlns="http://schemas.openxmlformats.org/pa
 
 const templateWorkbook = `<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x15" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"><fileVersion appName="xl" lastEdited="6" lowestEdited="6" rupBuild="14420" /><workbookPr filterPrivacy="1" defaultThemeVersion="164011" /><bookViews><workbookView xWindow="0" yWindow="0" windowWidth="14805" windowHeight="8010" /></bookViews><sheets><sheet name="Sheet1" sheetId="1" r:id="rId1" /></sheets><calcPr calcId="122211" /></workbook>`
 
-const templateStyles = `<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac x16r2" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:x16r2="http://schemas.microsoft.com/office/spreadsheetml/2015/02/main"><fonts count="1" x14ac:knownFonts="1"><font><sz val="11"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts><fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills><borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs><cellXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/></cellXfs><cellStyles count="1"><cellStyle name="常规" xfId="0" builtinId="0"/></cellStyles><dxfs count="0"/><tableStyles count="0" defaultTableStyle="TableStyleMedium2" defaultPivotStyle="PivotStyleLight16"/></styleSheet>`
+const templateStyles = `<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac x16r2" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:x16r2="http://schemas.microsoft.com/office/spreadsheetml/2015/02/main"><fonts count="1" x14ac:knownFonts="1"><font><sz val="11"/><color theme="1"/><name val="Calibri"/><family val="2"/></font></fonts><fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills><borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders><cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs><cellXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/></cellXfs><cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles><dxfs count="0"/><tableStyles count="0" defaultTableStyle="TableStyleMedium2" defaultPivotStyle="PivotStyleLight16"/></styleSheet>`
 
 const templateSheet = `<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="A1"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"/></sheetViews><sheetFormatPr defaultRowHeight="15"/><sheetData/><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/></worksheet>`