Skip to content

Commit f66212d

Browse files
committed
Resolve qax-os#106, qax-os#294 performance optimization for add hyperlink
1 parent 1aed1d7 commit f66212d

File tree

6 files changed

+61
-31
lines changed

6 files changed

+61
-31
lines changed

comment.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ func (f *File) GetComments() (comments map[string][]Comment) {
5757
// given worksheet index.
5858
func (f *File) getSheetComments(sheetID int) string {
5959
var rels = "xl/worksheets/_rels/sheet" + strconv.Itoa(sheetID) + ".xml.rels"
60-
var sheetRels xlsxWorkbookRels
61-
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &sheetRels)
62-
for _, v := range sheetRels.Relationships {
63-
if v.Type == SourceRelationshipComments {
64-
return v.Target
60+
if sheetRels := f.workSheetRelsReader(rels); sheetRels != nil {
61+
for _, v := range sheetRels.Relationships {
62+
if v.Type == SourceRelationshipComments {
63+
return v.Target
64+
}
6565
}
6666
}
6767
return ""

excelize.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ type File struct {
4040
VMLDrawing map[string]*vmlDrawing
4141
WorkBook *xlsxWorkbook
4242
WorkBookRels *xlsxWorkbookRels
43+
WorkSheetRels map[string]*xlsxWorkbookRels
4344
XLSX map[string][]byte
4445
}
4546

@@ -84,6 +85,7 @@ func OpenReader(r io.Reader) (*File, error) {
8485
SheetCount: sheetCount,
8586
DecodeVMLDrawing: make(map[string]*decodeVmlDrawing),
8687
VMLDrawing: make(map[string]*vmlDrawing),
88+
WorkSheetRels: make(map[string]*xlsxWorkbookRels),
8789
XLSX: file,
8890
}
8991
f.CalcChain = f.calcChainReader()

file.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ func NewFile() *File {
4949
f.VMLDrawing = make(map[string]*vmlDrawing)
5050
f.WorkBook = f.workbookReader()
5151
f.WorkBookRels = f.workbookRelsReader()
52+
f.WorkSheetRels = make(map[string]*xlsxWorkbookRels)
5253
f.Sheet["xl/worksheets/sheet1.xml"] = f.workSheetReader("Sheet1")
5354
f.sheetMap["Sheet1"] = "xl/worksheets/sheet1.xml"
5455
f.Theme = f.themeReader()
@@ -99,9 +100,10 @@ func (f *File) WriteToBuffer() (*bytes.Buffer, error) {
99100
f.drawingRelsWriter()
100101
f.drawingsWriter()
101102
f.vmlDrawingWriter()
102-
f.workbookWriter()
103-
f.workbookRelsWriter()
104-
f.worksheetWriter()
103+
f.workBookWriter()
104+
f.workBookRelsWriter()
105+
f.workSheetWriter()
106+
f.workSheetRelsWriter()
105107
f.styleSheetWriter()
106108

107109
for path, content := range f.XLSX {

picture.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -177,27 +177,25 @@ func (f *File) addSheetRelationships(sheet, relType, target, targetMode string)
177177
name = strings.ToLower(sheet) + ".xml"
178178
}
179179
var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels"
180-
var sheetRels xlsxWorkbookRels
180+
sheetRels := f.workSheetRelsReader(rels)
181+
if sheetRels == nil {
182+
sheetRels = &xlsxWorkbookRels{}
183+
}
181184
var rID = 1
182185
var ID bytes.Buffer
183186
ID.WriteString("rId")
184187
ID.WriteString(strconv.Itoa(rID))
185-
_, ok = f.XLSX[rels]
186-
if ok {
187-
ID.Reset()
188-
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &sheetRels)
189-
rID = len(sheetRels.Relationships) + 1
190-
ID.WriteString("rId")
191-
ID.WriteString(strconv.Itoa(rID))
192-
}
188+
ID.Reset()
189+
rID = len(sheetRels.Relationships) + 1
190+
ID.WriteString("rId")
191+
ID.WriteString(strconv.Itoa(rID))
193192
sheetRels.Relationships = append(sheetRels.Relationships, xlsxWorkbookRelation{
194193
ID: ID.String(),
195194
Type: relType,
196195
Target: target,
197196
TargetMode: targetMode,
198197
})
199-
output, _ := xml.Marshal(sheetRels)
200-
f.saveFileList(rels, output)
198+
f.WorkSheetRels[rels] = sheetRels
201199
return rID
202200
}
203201

@@ -210,15 +208,16 @@ func (f *File) deleteSheetRelationships(sheet, rID string) {
210208
name = strings.ToLower(sheet) + ".xml"
211209
}
212210
var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels"
213-
var sheetRels xlsxWorkbookRels
214-
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &sheetRels)
211+
sheetRels := f.workSheetRelsReader(rels)
212+
if sheetRels == nil {
213+
sheetRels = &xlsxWorkbookRels{}
214+
}
215215
for k, v := range sheetRels.Relationships {
216216
if v.ID == rID {
217217
sheetRels.Relationships = append(sheetRels.Relationships[:k], sheetRels.Relationships[k+1:]...)
218218
}
219219
}
220-
output, _ := xml.Marshal(sheetRels)
221-
f.saveFileList(rels, output)
220+
f.WorkSheetRels[rels] = sheetRels
222221
}
223222

224223
// addSheetLegacyDrawing provides a function to add legacy drawing element to
@@ -441,8 +440,10 @@ func (f *File) getSheetRelationshipsTargetByID(sheet, rID string) string {
441440
name = strings.ToLower(sheet) + ".xml"
442441
}
443442
var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels"
444-
var sheetRels xlsxWorkbookRels
445-
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(rels)), &sheetRels)
443+
sheetRels := f.workSheetRelsReader(rels)
444+
if sheetRels == nil {
445+
sheetRels = &xlsxWorkbookRels{}
446+
}
446447
for _, v := range sheetRels.Relationships {
447448
if v.ID == rID {
448449
return v.Target

sheet.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,18 @@ func (f *File) workbookReader() *xlsxWorkbook {
8888
return f.WorkBook
8989
}
9090

91-
// workbookWriter provides a function to save xl/workbook.xml after serialize
91+
// workBookWriter provides a function to save xl/workbook.xml after serialize
9292
// structure.
93-
func (f *File) workbookWriter() {
93+
func (f *File) workBookWriter() {
9494
if f.WorkBook != nil {
9595
output, _ := xml.Marshal(f.WorkBook)
9696
f.saveFileList("xl/workbook.xml", replaceRelationshipsNameSpaceBytes(output))
9797
}
9898
}
9999

100-
// worksheetWriter provides a function to save xl/worksheets/sheet%d.xml after
100+
// workSheetWriter provides a function to save xl/worksheets/sheet%d.xml after
101101
// serialize structure.
102-
func (f *File) worksheetWriter() {
102+
func (f *File) workSheetWriter() {
103103
for path, sheet := range f.Sheet {
104104
if sheet != nil {
105105
for k, v := range sheet.SheetData.Row {
@@ -172,9 +172,9 @@ func (f *File) workbookRelsReader() *xlsxWorkbookRels {
172172
return f.WorkBookRels
173173
}
174174

175-
// workbookRelsWriter provides a function to save xl/_rels/workbook.xml.rels after
175+
// workBookRelsWriter provides a function to save xl/_rels/workbook.xml.rels after
176176
// serialize structure.
177-
func (f *File) workbookRelsWriter() {
177+
func (f *File) workBookRelsWriter() {
178178
if f.WorkBookRels != nil {
179179
output, _ := xml.Marshal(f.WorkBookRels)
180180
f.saveFileList("xl/_rels/workbook.xml.rels", output)
@@ -1003,3 +1003,28 @@ func (f *File) GetPageLayout(sheet string, opts ...PageLayoutOptionPtr) error {
10031003
}
10041004
return nil
10051005
}
1006+
1007+
// workSheetRelsReader provides a function to get the pointer to the structure
1008+
// after deserialization of xl/worksheets/_rels/sheet%d.xml.rels.
1009+
func (f *File) workSheetRelsReader(path string) *xlsxWorkbookRels {
1010+
if f.WorkSheetRels[path] == nil {
1011+
_, ok := f.XLSX[path]
1012+
if ok {
1013+
c := xlsxWorkbookRels{}
1014+
_ = xml.Unmarshal(namespaceStrictToTransitional(f.readXML(path)), &c)
1015+
f.WorkSheetRels[path] = &c
1016+
}
1017+
}
1018+
return f.WorkSheetRels[path]
1019+
}
1020+
1021+
// workSheetRelsWriter provides a function to save
1022+
// xl/worksheets/_rels/sheet%d.xml.rels after serialize structure.
1023+
func (f *File) workSheetRelsWriter() {
1024+
for path, r := range f.WorkSheetRels {
1025+
if r != nil {
1026+
v, _ := xml.Marshal(r)
1027+
f.saveFileList(path, v)
1028+
}
1029+
}
1030+
}

test/CalcChain.xlsx

100755100644
File mode changed.

0 commit comments

Comments
 (0)