2022-01-09 00:20:42 +08:00
|
|
|
// Copyright 2016 - 2022 The excelize Authors. All rights reserved. Use of
|
2019-02-22 22:17:38 +08:00
|
|
|
// this source code is governed by a BSD-style license that can be found in
|
|
|
|
// the LICENSE file.
|
|
|
|
//
|
2022-02-17 00:09:11 +08:00
|
|
|
// 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.
|
2019-02-22 22:17:38 +08:00
|
|
|
|
|
|
|
package excelize
|
|
|
|
|
2019-12-20 00:30:48 +08:00
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/xml"
|
|
|
|
"io"
|
|
|
|
"log"
|
|
|
|
)
|
2019-02-22 22:17:38 +08:00
|
|
|
|
|
|
|
// calcChainReader provides a function to get the pointer to the structure
|
|
|
|
// after deserialization of xl/calcChain.xml.
|
|
|
|
func (f *File) calcChainReader() *xlsxCalcChain {
|
2019-12-20 00:30:48 +08:00
|
|
|
var err error
|
|
|
|
|
2019-02-22 22:17:38 +08:00
|
|
|
if f.CalcChain == nil {
|
2019-12-20 00:30:48 +08:00
|
|
|
f.CalcChain = new(xlsxCalcChain)
|
2022-01-09 00:20:42 +08:00
|
|
|
if err = f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML(defaultXMLPathCalcChain)))).
|
2019-12-20 00:30:48 +08:00
|
|
|
Decode(f.CalcChain); err != nil && err != io.EOF {
|
|
|
|
log.Printf("xml decode error: %s", err)
|
|
|
|
}
|
2019-02-22 22:17:38 +08:00
|
|
|
}
|
2019-12-20 00:30:48 +08:00
|
|
|
|
2019-02-22 22:17:38 +08:00
|
|
|
return f.CalcChain
|
|
|
|
}
|
|
|
|
|
|
|
|
// calcChainWriter provides a function to save xl/calcChain.xml after
|
|
|
|
// serialize structure.
|
|
|
|
func (f *File) calcChainWriter() {
|
2019-04-22 16:59:41 +08:00
|
|
|
if f.CalcChain != nil && f.CalcChain.C != nil {
|
2019-02-22 22:17:38 +08:00
|
|
|
output, _ := xml.Marshal(f.CalcChain)
|
2022-01-09 00:20:42 +08:00
|
|
|
f.saveFileList(defaultXMLPathCalcChain, output)
|
2019-02-22 22:17:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// deleteCalcChain provides a function to remove cell reference on the
|
|
|
|
// calculation chain.
|
2022-09-18 00:07:15 +08:00
|
|
|
func (f *File) deleteCalcChain(index int, cell string) {
|
2019-02-22 22:17:38 +08:00
|
|
|
calc := f.calcChainReader()
|
|
|
|
if calc != nil {
|
2019-04-09 22:18:31 +08:00
|
|
|
calc.C = xlsxCalcChainCollection(calc.C).Filter(func(c xlsxCalcChainC) bool {
|
2022-09-18 00:07:15 +08:00
|
|
|
return !((c.I == index && c.R == cell) || (c.I == index && cell == "") || (c.I == 0 && c.R == cell))
|
2019-04-09 22:18:31 +08:00
|
|
|
})
|
2019-02-22 22:17:38 +08:00
|
|
|
}
|
|
|
|
if len(calc.C) == 0 {
|
|
|
|
f.CalcChain = nil
|
2022-01-09 00:20:42 +08:00
|
|
|
f.Pkg.Delete(defaultXMLPathCalcChain)
|
2019-02-22 22:17:38 +08:00
|
|
|
content := f.contentTypesReader()
|
2021-07-06 00:31:04 +08:00
|
|
|
content.Lock()
|
|
|
|
defer content.Unlock()
|
2019-02-22 22:17:38 +08:00
|
|
|
for k, v := range content.Overrides {
|
|
|
|
if v.PartName == "/xl/calcChain.xml" {
|
|
|
|
content.Overrides = append(content.Overrides[:k], content.Overrides[k+1:]...)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-04-09 22:18:31 +08:00
|
|
|
|
|
|
|
type xlsxCalcChainCollection []xlsxCalcChainC
|
|
|
|
|
2019-04-14 12:55:44 +08:00
|
|
|
// Filter provides a function to filter calculation chain.
|
2019-04-09 22:18:31 +08:00
|
|
|
func (c xlsxCalcChainCollection) Filter(fn func(v xlsxCalcChainC) bool) []xlsxCalcChainC {
|
2019-10-24 23:18:02 +08:00
|
|
|
var results []xlsxCalcChainC
|
2019-04-09 22:18:31 +08:00
|
|
|
for _, v := range c {
|
|
|
|
if fn(v) {
|
|
|
|
results = append(results, v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return results
|
|
|
|
}
|