12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // Copyright 2016 - 2020 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 (
- "bytes"
- "encoding/xml"
- "io"
- "log"
- )
- // calcChainReader provides a function to get the pointer to the structure
- // after deserialization of xl/calcChain.xml.
- func (f *File) calcChainReader() *xlsxCalcChain {
- var err error
- if f.CalcChain == nil {
- f.CalcChain = new(xlsxCalcChain)
- if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML("xl/calcChain.xml")))).
- Decode(f.CalcChain); err != nil && err != io.EOF {
- log.Printf("xml decode error: %s", err)
- }
- }
- 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 {
- var results []xlsxCalcChainC
- for _, v := range c {
- if fn(v) {
- results = append(results, v)
- }
- }
- return results
- }
|