summaryrefslogtreecommitdiff
path: root/calcchain.go
diff options
context:
space:
mode:
authorAplulu <aplulu.liv@gmail.com>2019-04-09 23:18:31 +0900
committerAplulu <aplulu.liv@gmail.com>2019-04-09 23:31:12 +0900
commit841ff4a03e2b30378f6bb2930752c8e9dcfe0dca (patch)
tree10eb908f7294dc18498b611f35a403d9d28b6e48 /calcchain.go
parent4e7d93a77796aa6814339d377a94d4b66226f1ce (diff)
Fix out of range panic when removing formula.
Fix file corruption issue when deleting a sheet containing a formula.
Diffstat (limited to 'calcchain.go')
-rw-r--r--calcchain.go22
1 files changed, 16 insertions, 6 deletions
diff --git a/calcchain.go b/calcchain.go
index 285a3e9..6fbdcd7 100644
--- a/calcchain.go
+++ b/calcchain.go
@@ -33,14 +33,12 @@ func (f *File) calcChainWriter() {
// deleteCalcChain provides a function to remove cell reference on the
// calculation chain.
-func (f *File) deleteCalcChain(axis string) {
+func (f *File) deleteCalcChain(index int, axis string) {
calc := f.calcChainReader()
if calc != nil {
- for i, c := range calc.C {
- if c.R == axis {
- calc.C = append(calc.C[:i], calc.C[i+1:]...)
- }
- }
+ 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
@@ -53,3 +51,15 @@ func (f *File) deleteCalcChain(axis string) {
}
}
}
+
+type xlsxCalcChainCollection []xlsxCalcChainC
+
+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
+}