1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package xlsx
- type RefTable struct {
- indexedStrings []string
- knownStrings map[string]int
- isWrite bool
- }
- // NewSharedStringRefTable() creates a new, empty RefTable.
- func NewSharedStringRefTable() *RefTable {
- rt := RefTable{}
- rt.knownStrings = make(map[string]int)
- return &rt
- }
- // MakeSharedStringRefTable() takes an xlsxSST struct and converts
- // it's contents to an slice of strings used to refer to string values
- // by numeric index - this is the model used within XLSX worksheet (a
- // numeric reference is stored to a shared cell value).
- func MakeSharedStringRefTable(source *xlsxSST) *RefTable {
- reftable := NewSharedStringRefTable()
- reftable.isWrite = false
- for _, si := range source.SI {
- if len(si.R) > 0 {
- newString := ""
- for j := 0; j < len(si.R); j++ {
- newString = newString + si.R[j].T
- }
- reftable.AddString(newString)
- } else {
- reftable.AddString(si.T)
- }
- }
- return reftable
- }
- // makeXlsxSST() takes a RefTable and returns and
- // equivalent xlsxSST representation.
- func (rt *RefTable) makeXLSXSST() xlsxSST {
- sst := xlsxSST{}
- sst.Count = len(rt.indexedStrings)
- sst.UniqueCount = sst.Count
- for _, ref := range rt.indexedStrings {
- si := xlsxSI{}
- si.T = ref
- sst.SI = append(sst.SI, si)
- }
- return sst
- }
- // Resolvesharedstring() looks up a string value by numeric index from
- // a provided reference table (just a slice of strings in the correct
- // order). This function only exists to provide clarity or purpose
- // via it's name.
- func (rt *RefTable) ResolveSharedString(index int) string {
- return rt.indexedStrings[index]
- }
- // AddString adds a string to the reference table and return it's
- // numeric index. If the string already exists then it simply returns
- // the existing index.
- func (rt *RefTable) AddString(str string) int {
- if rt.isWrite {
- index, ok := rt.knownStrings[str]
- if ok {
- return index
- }
- }
- rt.indexedStrings = append(rt.indexedStrings, str)
- index := len(rt.indexedStrings) - 1
- rt.knownStrings[str] = index
- return index
- }
- func (rt *RefTable) Length() int {
- return len(rt.indexedStrings)
- }
|