summaryrefslogtreecommitdiff
path: root/workbook.go
diff options
context:
space:
mode:
Diffstat (limited to 'workbook.go')
-rw-r--r--workbook.go147
1 files changed, 147 insertions, 0 deletions
diff --git a/workbook.go b/workbook.go
new file mode 100644
index 0000000..a2263b2
--- /dev/null
+++ b/workbook.go
@@ -0,0 +1,147 @@
+// Copyright 2016 - 2022 The excelize Authors. All rights reserved. Use of
+// this source code is governed by a BSD-style license that can be found in
+// the LICENSE file.
+//
+// Package excelize providing a set of functions that allow you to write to and
+// read from XLAM / XLSM / XLSX / XLTM / XLTX files. Supports reading and
+// writing spreadsheet documents generated by Microsoft Excelâ„¢ 2007 and later.
+// Supports complex components by high compatibility, and provided streaming
+// API for generating or reading data from a worksheet with huge amounts of
+// data. This library needs Go version 1.15 or later.
+
+package excelize
+
+import (
+ "bytes"
+ "encoding/xml"
+ "io"
+ "log"
+ "path/filepath"
+ "strconv"
+ "strings"
+)
+
+// WorkbookPrOption is an option of a view of a workbook. See SetWorkbookPrOptions().
+type WorkbookPrOption interface {
+ setWorkbookPrOption(pr *xlsxWorkbookPr)
+}
+
+// WorkbookPrOptionPtr is a writable WorkbookPrOption. See GetWorkbookPrOptions().
+type WorkbookPrOptionPtr interface {
+ WorkbookPrOption
+ getWorkbookPrOption(pr *xlsxWorkbookPr)
+}
+
+// setWorkbook update workbook property of the spreadsheet. Maximum 31
+// characters are allowed in sheet title.
+func (f *File) setWorkbook(name string, sheetID, rid int) {
+ content := f.workbookReader()
+ content.Sheets.Sheet = append(content.Sheets.Sheet, xlsxSheet{
+ Name: trimSheetName(name),
+ SheetID: sheetID,
+ ID: "rId" + strconv.Itoa(rid),
+ })
+}
+
+// getWorkbookPath provides a function to get the path of the workbook.xml in
+// the spreadsheet.
+func (f *File) getWorkbookPath() (path string) {
+ if rels := f.relsReader("_rels/.rels"); rels != nil {
+ rels.Lock()
+ defer rels.Unlock()
+ for _, rel := range rels.Relationships {
+ if rel.Type == SourceRelationshipOfficeDocument {
+ path = strings.TrimPrefix(rel.Target, "/")
+ return
+ }
+ }
+ }
+ return
+}
+
+// getWorkbookRelsPath provides a function to get the path of the workbook.xml.rels
+// in the spreadsheet.
+func (f *File) getWorkbookRelsPath() (path string) {
+ wbPath := f.getWorkbookPath()
+ wbDir := filepath.Dir(wbPath)
+ if wbDir == "." {
+ path = "_rels/" + filepath.Base(wbPath) + ".rels"
+ return
+ }
+ path = strings.TrimPrefix(filepath.Dir(wbPath)+"/_rels/"+filepath.Base(wbPath)+".rels", "/")
+ return
+}
+
+// workbookReader provides a function to get the pointer to the workbook.xml
+// structure after deserialization.
+func (f *File) workbookReader() *xlsxWorkbook {
+ var err error
+ if f.WorkBook == nil {
+ wbPath := f.getWorkbookPath()
+ f.WorkBook = new(xlsxWorkbook)
+ if _, ok := f.xmlAttr[wbPath]; !ok {
+ d := f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML(wbPath))))
+ f.xmlAttr[wbPath] = append(f.xmlAttr[wbPath], getRootElement(d)...)
+ f.addNameSpaces(wbPath, SourceRelationship)
+ }
+ if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML(wbPath)))).
+ Decode(f.WorkBook); err != nil && err != io.EOF {
+ log.Printf("xml decode error: %s", err)
+ }
+ }
+ return f.WorkBook
+}
+
+// workBookWriter provides a function to save workbook.xml after serialize
+// structure.
+func (f *File) workBookWriter() {
+ if f.WorkBook != nil {
+ output, _ := xml.Marshal(f.WorkBook)
+ f.saveFileList(f.getWorkbookPath(), replaceRelationshipsBytes(f.replaceNameSpaceBytes(f.getWorkbookPath(), output)))
+ }
+}
+
+// SetWorkbookPrOptions provides a function to sets workbook properties.
+//
+// Available options:
+// CodeName(string)
+func (f *File) SetWorkbookPrOptions(opts ...WorkbookPrOption) error {
+ wb := f.workbookReader()
+ pr := wb.WorkbookPr
+ if pr == nil {
+ pr = new(xlsxWorkbookPr)
+ wb.WorkbookPr = pr
+ }
+ for _, opt := range opts {
+ opt.setWorkbookPrOption(pr)
+ }
+ return nil
+}
+
+// setWorkbookPrOption implements the WorkbookPrOption interface.
+func (o CodeName) setWorkbookPrOption(pr *xlsxWorkbookPr) {
+ pr.CodeName = string(o)
+}
+
+// GetWorkbookPrOptions provides a function to gets workbook properties.
+//
+// Available options:
+// CodeName(string)
+func (f *File) GetWorkbookPrOptions(opts ...WorkbookPrOptionPtr) error {
+ wb := f.workbookReader()
+ pr := wb.WorkbookPr
+ for _, opt := range opts {
+ opt.getWorkbookPrOption(pr)
+ }
+ return nil
+}
+
+// getWorkbookPrOption implements the WorkbookPrOption interface and get the
+// code name of thw workbook.
+func (o *CodeName) getWorkbookPrOption(pr *xlsxWorkbookPr) {
+ if pr == nil {
+ *o = ""
+ return
+ }
+ *o = CodeName(pr.CodeName)
+}