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: [PATCH] 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 ebf4681f..c8fa9b25 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 b0f39451..73a76a96 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()) + } } }