|
- // Copyright 2016 - 2019 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 XLSX files. Support reads and writes XLSX file generated by
- // Microsoft Excel™ 2007 and later. Support save file without losing original
- // charts of XLSX. This library needs Go version 1.10 or later.
-
- package excelize
-
- import "encoding/xml"
-
- // calcChainReader provides a function to get the pointer to the structure
- // after deserialization of xl/calcChain.xml.
- func (f *File) calcChainReader() *xlsxCalcChain {
- if f.CalcChain == nil {
- var c xlsxCalcChain
- _ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML("xl/calcChain.xml")), &c)
- f.CalcChain = &c
- }
- return f.CalcChain
- }
-
- // calcChainWriter provides a function to save xl/calcChain.xml after
- // serialize structure.
- func (f *File) calcChainWriter() {
- if f.CalcChain != nil && f.CalcChain.C != nil {
- output, _ := xml.Marshal(f.CalcChain)
- f.saveFileList("xl/calcChain.xml", output)
- }
- }
-
- // deleteCalcChain provides a function to remove cell reference on the
- // calculation chain.
- func (f *File) deleteCalcChain(index int, axis string) {
- calc := f.calcChainReader()
- if calc != nil {
- calc.C = xlsxCalcChainCollection(calc.C).Filter(func(c xlsxCalcChainC) bool {
- return !((c.I == index && c.R == axis) || (c.I == index && axis == ""))
- })
- }
- if len(calc.C) == 0 {
- f.CalcChain = nil
- delete(f.XLSX, "xl/calcChain.xml")
- content := f.contentTypesReader()
- for k, v := range content.Overrides {
- if v.PartName == "/xl/calcChain.xml" {
- content.Overrides = append(content.Overrides[:k], content.Overrides[k+1:]...)
- }
- }
- }
- }
-
- type xlsxCalcChainCollection []xlsxCalcChainC
-
- // Filter provides a function to filter calculation chain.
- func (c xlsxCalcChainCollection) Filter(fn func(v xlsxCalcChainC) bool) []xlsxCalcChainC {
- results := make([]xlsxCalcChainC, 0)
- for _, v := range c {
- if fn(v) {
- results = append(results, v)
- }
- }
- return results
- }
|