summaryrefslogtreecommitdiff
path: root/calcchain.go
blob: 285a3e9ee92cd179d29345416bbe357eab91d215 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 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.8 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 {
		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(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:]...)
			}
		}
	}
	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:]...)
			}
		}
	}
}