From 2d21b5b50f30ae9868b2f8b1f7299ceefcf87fd2 Mon Sep 17 00:00:00 2001 From: streboryaj Date: Tue, 15 Oct 2019 09:26:08 -0500 Subject: [PATCH] Added accessors for Getting/Setting Page Margins (#497) * Added accessors for Getting/Setting Page Margins * Added test cases --- sheet.go | 159 ++++++++++++++++++++++++++++++++++++++++++++++++ sheet_test.go | 62 +++++++++++++++++++ xmlWorksheet.go | 10 +++ 3 files changed, 231 insertions(+) diff --git a/sheet.go b/sheet.go index 951baf9..ce3e645 100644 --- a/sheet.go +++ b/sheet.go @@ -1401,3 +1401,162 @@ func makeContiguousColumns(xlsx *xlsxWorksheet, fromRow, toRow, colCount int) { fillColumns(rowData, colCount, fromRow) } } + +type ( + PageMarginBottom float64 + PageMarginFooter float64 + PageMarginHeader float64 + PageMarginLeft float64 + PageMarginRight float64 + PageMarginTop float64 +) + +// setPageMargins provides a method to set the bottom margin for the worksheet. +func (p PageMarginBottom) setPageMargins(ps *xlsxPageMargins) { + ps.Bottom = float64(p) +} + +// setPageMargins provides a method to get the bottom margin for the worksheet. +func (o *PageMarginBottom) getPageMargins(ps *xlsxPageMargins) { + // Excel default: portrait + if ps == nil || ps.Bottom == 0 { + *o = 0.75 + return + } + *o = PageMarginBottom(ps.Bottom) +} + +// setPageMargins provides a method to set the Footer margin for the worksheet. +func (p PageMarginFooter) setPageMargins(ps *xlsxPageMargins) { + ps.Footer = float64(p) +} + +// setPageMargins provides a method to get the Footer margin for the worksheet. +func (o *PageMarginFooter) getPageMargins(ps *xlsxPageMargins) { + // Excel default: portrait + if ps == nil || ps.Footer == 0 { + *o = 0.3 + return + } + *o = PageMarginFooter(ps.Footer) +} + +// setPageMargins provides a method to set the Header margin for the worksheet. +func (p PageMarginHeader) setPageMargins(ps *xlsxPageMargins) { + ps.Header = float64(p) +} + +// setPageMargins provides a method to get the Header margin for the worksheet. +func (o *PageMarginHeader) getPageMargins(ps *xlsxPageMargins) { + // Excel default: portrait + if ps == nil || ps.Header == 0 { + *o = 0.3 + return + } + *o = PageMarginHeader(ps.Header) +} + +// setPageMargins provides a method to set the left margin for the worksheet. +func (p PageMarginLeft) setPageMargins(ps *xlsxPageMargins) { + ps.Left = float64(p) +} + +// setPageMargins provides a method to get the left margin for the worksheet. +func (o *PageMarginLeft) getPageMargins(ps *xlsxPageMargins) { + // Excel default: portrait + if ps == nil || ps.Left == 0 { + *o = 0.7 + return + } + *o = PageMarginLeft(ps.Left) +} + +// setPageMargins provides a method to set the right margin for the worksheet. +func (p PageMarginRight) setPageMargins(ps *xlsxPageMargins) { + ps.Right = float64(p) +} + +// setPageMargins provides a method to get the right margin for the worksheet. +func (o *PageMarginRight) getPageMargins(ps *xlsxPageMargins) { + // Excel default: portrait + if ps == nil || ps.Right == 0 { + *o = 0.7 + return + } + *o = PageMarginRight(ps.Right) +} + +// setPageMargins provides a method to set the top margin for the worksheet. +func (p PageMarginTop) setPageMargins(ps *xlsxPageMargins) { + ps.Top = float64(p) +} + +// setPageMargins provides a method to get the top margin for the worksheet. +func (o *PageMarginTop) getPageMargins(ps *xlsxPageMargins) { + // Excel default: portrait + if ps == nil || ps.Top == 0 { + *o = 0.75 + return + } + *o = PageMarginTop(ps.Top) +} + +// PageMarginsOptions is an option of a page margin of a worksheet. See +// SetPageMargins(). +type PageMarginsOptions interface { + setPageMargins(layout *xlsxPageMargins) +} + +// PageMarginsOptionsPtr is a writable PageMarginsOptions. See GetPageMargins(). +type PageMarginsOptionsPtr interface { + PageMarginsOptions + getPageMargins(layout *xlsxPageMargins) +} + +// SetPageMargins provides a function to set worksheet page lmargins. +// +// Available options: +// PageMarginBotom(float64) +// PageMarginFooter(float64) +// PageMarginHeader(float64) +// PageMarginLeft(float64) +// PageMarginRightfloat64) +// PageMarginTop(float64) +func (f *File) SetPageMargins(sheet string, opts ...PageMarginsOptions) error { + s, err := f.workSheetReader(sheet) + if err != nil { + return err + } + ps := s.PageMargins + if ps == nil { + ps = new(xlsxPageMargins) + s.PageMargins = ps + } + + for _, opt := range opts { + opt.setPageMargins(ps) + } + return err +} + +// GetPageMargins provides a function to get worksheet page margins. +// +// Available options: +// PageMarginBotom(float64) +// PageMarginFooter(float64) +// PageMarginHeader(float64) +// PageMarginLeft(float64) +// PageMarginRightfloat64) +// PageMarginTop(float64) +func (f *File) GetPageMargins(sheet string, opts ...PageMarginsOptionsPtr) error { + s, err := f.workSheetReader(sheet) + if err != nil { + return err + } + ps := s.PageMargins + + for _, opt := range opts { + opt.getPageMargins(ps) + } + return err +} diff --git a/sheet_test.go b/sheet_test.go index 5179793..6bfa7dc 100644 --- a/sheet_test.go +++ b/sheet_test.go @@ -247,3 +247,65 @@ func TestGetSheetMap(t *testing.T) { } assert.Equal(t, len(sheetMap), 2) } + +func TestPageMarginsOption(t *testing.T) { + const sheet = "Sheet1" + + testData := []struct { + container excelize.PageMarginsOptionsPtr + nonDefault excelize.PageMarginsOptions + }{ + {new(excelize.PageMarginTop), excelize.PageMarginTop(1.0)}, + {new(excelize.PageMarginBottom), excelize.PageMarginBottom(1.0)}, + {new(excelize.PageMarginLeft), excelize.PageMarginLeft(1.0)}, + {new(excelize.PageMarginRight), excelize.PageMarginRight(1.0)}, + {new(excelize.PageMarginHeader), excelize.PageMarginHeader(1.0)}, + {new(excelize.PageMarginFooter), excelize.PageMarginFooter(1.0)}, + } + + for i, test := range testData { + t.Run(fmt.Sprintf("TestData%d", i), func(t *testing.T) { + + opt := test.nonDefault + t.Logf("option %T", opt) + + def := deepcopy.Copy(test.container).(excelize.PageMarginsOptionsPtr) + val1 := deepcopy.Copy(def).(excelize.PageMarginsOptionsPtr) + val2 := deepcopy.Copy(def).(excelize.PageMarginsOptionsPtr) + + f := excelize.NewFile() + // Get the default value + assert.NoError(t, f.GetPageMargins(sheet, def), opt) + // Get again and check + assert.NoError(t, f.GetPageMargins(sheet, val1), opt) + if !assert.Equal(t, val1, def, opt) { + t.FailNow() + } + // Set the same value + assert.NoError(t, f.SetPageMargins(sheet, val1), opt) + // Get again and check + assert.NoError(t, f.GetPageMargins(sheet, val1), opt) + if !assert.Equal(t, val1, def, "%T: value should not have changed", opt) { + t.FailNow() + } + // Set a different value + assert.NoError(t, f.SetPageMargins(sheet, test.nonDefault), opt) + assert.NoError(t, f.GetPageMargins(sheet, val1), opt) + // Get again and compare + assert.NoError(t, f.GetPageMargins(sheet, val2), opt) + if !assert.Equal(t, val1, val2, "%T: value should not have changed", opt) { + t.FailNow() + } + // Value should not be the same as the default + if !assert.NotEqual(t, def, val1, "%T: value should have changed from default", opt) { + t.FailNow() + } + // Restore the default value + assert.NoError(t, f.SetPageMargins(sheet, def), opt) + assert.NoError(t, f.GetPageMargins(sheet, val1), opt) + if !assert.Equal(t, def, val1) { + t.FailNow() + } + }) + } +} diff --git a/xmlWorksheet.go b/xmlWorksheet.go index c78d3ef..96ca235 100644 --- a/xmlWorksheet.go +++ b/xmlWorksheet.go @@ -801,3 +801,13 @@ type FormatHeaderFooter struct { FirstFooter string FirstHeader string } + +// FormatPageMargins directly maps the settings of page margins +type FormatPageMargins struct { + Bottom string + Footer string + Header string + Left string + Right string + Top string +}