Browse Source

- Add protection properties associated with the cell support, relate issue #191;
- godoc and go test has been updated

Ri Xu 7 years ago
parent
commit
ecc3adf22a
3 changed files with 47 additions and 2 deletions
  1. 17 0
      excelize_test.go
  2. 26 2
      styles.go
  3. 4 0
      xmlStyles.go

+ 17 - 0
excelize_test.go

@@ -607,6 +607,23 @@ func TestSetCellStyleFont(t *testing.T) {
 	}
 }
 
+func TestSetCellStyleProtection(t *testing.T) {
+	xlsx, err := OpenFile("./test/Book2.xlsx")
+	if err != nil {
+		t.Log(err)
+	}
+	var style int
+	style, err = xlsx.NewStyle(`{"protection":{"hidden":true, "locked":true}}`)
+	if err != nil {
+		t.Log(err)
+	}
+	xlsx.SetCellStyle("Sheet2", "A6", "A6", style)
+	err = xlsx.Save()
+	if err != nil {
+		t.Log(err)
+	}
+}
+
 func TestSetDeleteSheet(t *testing.T) {
 	xlsx, err := OpenFile("./test/Book3.xlsx")
 	if err != nil {

+ 26 - 2
styles.go

@@ -1901,7 +1901,8 @@ func (f *File) NewStyle(style string) (int, error) {
 	fillID = s.Fills.Count - 1
 
 	applyAlignment, alignment := fs.Alignment != nil, setAlignment(fs)
-	cellXfsID = setCellXfs(s, fontID, numFmtID, fillID, borderID, applyAlignment, alignment)
+	applyProtection, protection := fs.Protection != nil, setProtection(fs)
+	cellXfsID = setCellXfs(s, fontID, numFmtID, fillID, borderID, applyAlignment, applyProtection, alignment, protection)
 	return cellXfsID, nil
 }
 
@@ -2155,6 +2156,17 @@ func setAlignment(formatStyle *formatStyle) *xlsxAlignment {
 	return &alignment
 }
 
+// setProtection provides function to set protection properties associated
+// with the cell.
+func setProtection(formatStyle *formatStyle) *xlsxProtection {
+	var protection xlsxProtection
+	if formatStyle.Protection != nil {
+		protection.Hidden = formatStyle.Protection.Hidden
+		protection.Locked = formatStyle.Protection.Locked
+	}
+	return &protection
+}
+
 // setBorders provides function to add border elements in the styles.xml by
 // given borders format settings.
 func setBorders(formatStyle *formatStyle) *xlsxBorder {
@@ -2209,7 +2221,7 @@ func setBorders(formatStyle *formatStyle) *xlsxBorder {
 
 // setCellXfs provides function to set describes all of the formatting for a
 // cell.
-func setCellXfs(style *xlsxStyleSheet, fontID, numFmtID, fillID, borderID int, applyAlignment bool, alignment *xlsxAlignment) int {
+func setCellXfs(style *xlsxStyleSheet, fontID, numFmtID, fillID, borderID int, applyAlignment, applyProtection bool, alignment *xlsxAlignment, protection *xlsxProtection) int {
 	var xf xlsxXf
 	xf.FontID = fontID
 	if fontID != 0 {
@@ -2224,6 +2236,10 @@ func setCellXfs(style *xlsxStyleSheet, fontID, numFmtID, fillID, borderID int, a
 	style.CellXfs.Count++
 	xf.Alignment = alignment
 	xf.ApplyAlignment = applyAlignment
+	if applyProtection {
+		xf.ApplyProtection = applyProtection
+		xf.Protection = protection
+	}
 	xfID := 0
 	xf.XfID = &xfID
 	style.CellXfs.Xf = append(style.CellXfs.Xf, xf)
@@ -2286,6 +2302,14 @@ func setCellXfs(style *xlsxStyleSheet, fontID, numFmtID, fillID, borderID int, a
 //    }
 //    xlsx.SetCellStyle("Sheet1", "H9", "H9", style)
 //
+// Hide and lock for cell H9 on Sheet1:
+//
+//    style, err := xlsx.NewStyle(`{"protection":{"hidden":true, "locked":true}`)
+//    if err != nil {
+//        fmt.Println(err)
+//    }
+//    xlsx.SetCellStyle("Sheet1", "H9", "H9", style)
+//
 func (f *File) SetCellStyle(sheet, hcell, vcell string, styleID int) {
 	hcell = strings.ToUpper(hcell)
 	vcell = strings.ToUpper(vcell)

+ 4 - 0
xmlStyles.go

@@ -344,6 +344,10 @@ type formatStyle struct {
 		Vertical        string `json:"vertical"`
 		WrapText        bool   `json:"wrap_text"`
 	} `json:"alignment"`
+	Protection *struct {
+		Hidden bool `json:"hidden"`
+		Locked bool `json:"locked"`
+	} `json:"protection"`
 	NumFmt        int     `json:"number_format"`
 	DecimalPlaces int     `json:"decimal_places"`
 	CustomNumFmt  *string `json:"custom_number_format"`