瀏覽代碼

speedup get cell value from shared string table

xuri 5 年之前
父節點
當前提交
c168233e70
共有 3 個文件被更改,包括 10 次插入4 次删除
  1. 3 4
      cell.go
  2. 2 0
      excelize.go
  3. 5 0
      rows.go

+ 3 - 4
cell.go

@@ -299,14 +299,13 @@ func (f *File) setCellString(value string) (t string, v string, ns xml.Attr) {
 // setSharedString provides a function to add string to the share string table.
 func (f *File) setSharedString(val string) int {
 	sst := f.sharedStringsReader()
-	for i, si := range sst.SI {
-		if si.T == val {
-			return i
-		}
+	if i, ok := f.sharedStringsMap[val]; ok {
+		return i
 	}
 	sst.Count++
 	sst.UniqueCount++
 	sst.SI = append(sst.SI, xlsxSI{T: val})
+	f.sharedStringsMap[val] = sst.UniqueCount - 1
 	return sst.UniqueCount - 1
 }
 

+ 2 - 0
excelize.go

@@ -38,6 +38,7 @@ type File struct {
 	Drawings         map[string]*xlsxWsDr
 	Path             string
 	SharedStrings    *xlsxSST
+	sharedStringsMap map[string]int
 	Sheet            map[string]*xlsxWorksheet
 	SheetCount       int
 	Styles           *xlsxStyleSheet
@@ -75,6 +76,7 @@ func newFile() *File {
 		sheetMap:         make(map[string]string),
 		Comments:         make(map[string]*xlsxComments),
 		Drawings:         make(map[string]*xlsxWsDr),
+		sharedStringsMap: make(map[string]int),
 		Sheet:            make(map[string]*xlsxWorksheet),
 		DecodeVMLDrawing: make(map[string]*decodeVmlDrawing),
 		VMLDrawing:       make(map[string]*vmlDrawing),

+ 5 - 0
rows.go

@@ -292,6 +292,11 @@ func (f *File) sharedStringsReader() *xlsxSST {
 			log.Printf("xml decode error: %s", err)
 		}
 		f.SharedStrings = &sharedStrings
+		for i := range sharedStrings.SI {
+			if sharedStrings.SI[i].T != "" {
+				f.sharedStringsMap[sharedStrings.SI[i].T] = i
+			}
+		}
 		f.addContentTypePart(0, "sharedStrings")
 		rels := f.relsReader("xl/_rels/workbook.xml.rels")
 		for _, rel := range rels.Relationships {