diff --git a/spreadsheet/new.go b/spreadsheet/new.go index 1b342a68..9acc754b 100644 --- a/spreadsheet/new.go +++ b/spreadsheet/new.go @@ -8,6 +8,8 @@ package spreadsheet import ( + "runtime" + "baliance.com/gooxml" "baliance.com/gooxml/common" "baliance.com/gooxml/schema/soo/sml" @@ -18,6 +20,8 @@ func New() *Workbook { wb := &Workbook{} wb.x = sml.NewWorkbook() + runtime.SetFinalizer(wb, workbookFinalizer) + wb.AppProperties = common.NewAppProperties() wb.CoreProperties = common.NewCoreProperties() wb.StyleSheet = NewStyleSheet(wb) diff --git a/spreadsheet/workbook.go b/spreadsheet/workbook.go index 2b20b3d9..f2ef1b7b 100644 --- a/spreadsheet/workbook.go +++ b/spreadsheet/workbook.go @@ -15,6 +15,7 @@ import ( "image/jpeg" "io" "os" + "strings" "time" "baliance.com/gooxml" @@ -29,6 +30,9 @@ import ( "baliance.com/gooxml/schema/soo/sml" ) +// ErrorNotFound is returned when something is not found +var ErrorNotFound = errors.New("not found") + // Workbook is the top level container item for a set of spreadsheets. type Workbook struct { common.DocBase @@ -552,11 +556,26 @@ func (wb *Workbook) Protection() WorkbookProtection { return WorkbookProtection{wb.x.WorkbookProtection} } -func (wb *Workbook) GetSheet(name string) Sheet { +// GetSheet returns a sheet by name, or an error if a sheet by the given name +// was not found. +func (wb *Workbook) GetSheet(name string) (Sheet, error) { for _, s := range wb.Sheets() { if s.Name() == name { - return s + return s, nil } } - return Sheet{} + return Sheet{}, ErrorNotFound +} + +func workbookFinalizer(wb *Workbook) { + wb.Close() +} + +// Close closes the workbook, removing any temporary files that might have been +// created when opening a document. +func (wb *Workbook) Close() error { + if wb.TmpPath != "" && strings.HasPrefix(wb.TmpPath, os.TempDir()) { + return os.RemoveAll(wb.TmpPath) + } + return nil }