From 8753950d62c150034a919599a7762cef19035552 Mon Sep 17 00:00:00 2001
From: March <115345952+March0715@users.noreply.github.com>
Date: Tue, 8 Nov 2022 00:35:19 +0800
Subject: Delete shared formula in calc chain when writing a formula cell
 (#1387)

---
 cell.go    |  4 +++-
 sheetpr.go | 54 ++++++++++++++++--------------------------------------
 2 files changed, 19 insertions(+), 39 deletions(-)

diff --git a/cell.go b/cell.go
index ebf4681..c8fa9b2 100644
--- a/cell.go
+++ b/cell.go
@@ -175,13 +175,15 @@ func (c *xlsxC) hasValue() bool {
 // removeFormula delete formula for the cell.
 func (f *File) removeFormula(c *xlsxC, ws *xlsxWorksheet, sheet string) {
 	if c.F != nil && c.Vm == nil {
-		f.deleteCalcChain(f.getSheetID(sheet), c.R)
+		sheetID := f.getSheetID(sheet)
+		f.deleteCalcChain(sheetID, c.R)
 		if c.F.T == STCellFormulaTypeShared && c.F.Ref != "" {
 			si := c.F.Si
 			for r, row := range ws.SheetData.Row {
 				for col, cell := range row.C {
 					if cell.F != nil && cell.F.Si != nil && *cell.F.Si == *si {
 						ws.SheetData.Row[r].C[col].F = nil
+						f.deleteCalcChain(sheetID, cell.R)
 					}
 				}
 			}
diff --git a/sheetpr.go b/sheetpr.go
index b0f3945..73a76a9 100644
--- a/sheetpr.go
+++ b/sheetpr.go
@@ -11,6 +11,8 @@
 
 package excelize
 
+import "reflect"
+
 // SetPageMargins provides a function to set worksheet page margins.
 func (f *File) SetPageMargins(sheet string, opts *PageLayoutMarginsOptions) error {
 	ws, err := f.workSheetReader(sheet)
@@ -30,29 +32,13 @@ func (f *File) SetPageMargins(sheet string, opts *PageLayoutMarginsOptions) erro
 			ws.PrintOptions = new(xlsxPrintOptions)
 		}
 	}
-	if opts.Bottom != nil {
-		preparePageMargins(ws)
-		ws.PageMargins.Bottom = *opts.Bottom
-	}
-	if opts.Footer != nil {
-		preparePageMargins(ws)
-		ws.PageMargins.Footer = *opts.Footer
-	}
-	if opts.Header != nil {
-		preparePageMargins(ws)
-		ws.PageMargins.Header = *opts.Header
-	}
-	if opts.Left != nil {
-		preparePageMargins(ws)
-		ws.PageMargins.Left = *opts.Left
-	}
-	if opts.Right != nil {
-		preparePageMargins(ws)
-		ws.PageMargins.Right = *opts.Right
-	}
-	if opts.Top != nil {
-		preparePageMargins(ws)
-		ws.PageMargins.Top = *opts.Top
+	s := reflect.ValueOf(opts).Elem()
+	for i := 0; i < 6; i++ {
+		if !s.Field(i).IsNil() {
+			preparePageMargins(ws)
+			name := s.Type().Field(i).Name
+			reflect.ValueOf(ws.PageMargins).Elem().FieldByName(name).Set(s.Field(i).Elem())
+		}
 	}
 	if opts.Horizontally != nil {
 		preparePrintOptions(ws)
@@ -154,21 +140,13 @@ func (ws *xlsxWorksheet) setSheetProps(opts *SheetPropsOptions) {
 		ws.SheetPr.PageSetUpPr.FitToPage = *opts.FitToPage
 	}
 	ws.setSheetOutlineProps(opts)
-	if opts.TabColorIndexed != nil {
-		prepareTabColor(ws)
-		ws.SheetPr.TabColor.Indexed = *opts.TabColorIndexed
-	}
-	if opts.TabColorRGB != nil {
-		prepareTabColor(ws)
-		ws.SheetPr.TabColor.RGB = *opts.TabColorRGB
-	}
-	if opts.TabColorTheme != nil {
-		prepareTabColor(ws)
-		ws.SheetPr.TabColor.Theme = *opts.TabColorTheme
-	}
-	if opts.TabColorTint != nil {
-		prepareTabColor(ws)
-		ws.SheetPr.TabColor.Tint = *opts.TabColorTint
+	s := reflect.ValueOf(opts).Elem()
+	for i := 5; i < 9; i++ {
+		if !s.Field(i).IsNil() {
+			prepareTabColor(ws)
+			name := s.Type().Field(i).Name
+			reflect.ValueOf(ws.SheetPr.TabColor).Elem().FieldByName(name[8:]).Set(s.Field(i).Elem())
+		}
 	}
 }
 
-- 
cgit v1.2.1