浏览代码

Function `GetCellValue()` performance improvement by avoid repeating deserialization, relate issue #70.

Ri Xu 8 年之前
父节点
当前提交
e05867a033
共有 4 个文件被更改,包括 24 次插入23 次删除
  1. 1 3
      cell.go
  2. 12 13
      excelize.go
  3. 10 6
      rows.go
  4. 1 1
      styles.go

+ 1 - 3
cell.go

@@ -1,7 +1,6 @@
 package excelize
 package excelize
 
 
 import (
 import (
-	"encoding/xml"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 )
 )
@@ -48,10 +47,9 @@ func (f *File) GetCellValue(sheet, axis string) string {
 			}
 			}
 			switch r.T {
 			switch r.T {
 			case "s":
 			case "s":
-				shardStrings := xlsxSST{}
+				shardStrings := f.sharedStringsReader()
 				xlsxSI := 0
 				xlsxSI := 0
 				xlsxSI, _ = strconv.Atoi(r.V)
 				xlsxSI, _ = strconv.Atoi(r.V)
-				xml.Unmarshal([]byte(f.readXML("xl/sharedStrings.xml")), &shardStrings)
 				return f.formattedValue(r.S, shardStrings.SI[xlsxSI].T)
 				return f.formattedValue(r.S, shardStrings.SI[xlsxSI].T)
 			case "str":
 			case "str":
 				return f.formattedValue(r.S, r.V)
 				return f.formattedValue(r.S, r.V)

+ 12 - 13
excelize.go

@@ -15,15 +15,16 @@ import (
 
 
 // File define a populated XLSX file struct.
 // File define a populated XLSX file struct.
 type File struct {
 type File struct {
-	checked      map[string]bool
-	ContentTypes *xlsxTypes
-	Path         string
-	Sheet        map[string]*xlsxWorksheet
-	SheetCount   int
-	Styles       *xlsxStyleSheet
-	WorkBook     *xlsxWorkbook
-	WorkBookRels *xlsxWorkbookRels
-	XLSX         map[string]string
+	checked       map[string]bool
+	ContentTypes  *xlsxTypes
+	Path          string
+	SharedStrings *xlsxSST
+	Sheet         map[string]*xlsxWorksheet
+	SheetCount    int
+	Styles        *xlsxStyleSheet
+	WorkBook      *xlsxWorkbook
+	WorkBookRels  *xlsxWorkbookRels
+	XLSX          map[string]string
 }
 }
 
 
 // OpenFile take the name of an XLSX file and returns a populated XLSX file
 // OpenFile take the name of an XLSX file and returns a populated XLSX file
@@ -145,8 +146,7 @@ func (f *File) setDefaultTimeStyle(sheet, axis string) {
 // deserialization by given worksheet index.
 // deserialization by given worksheet index.
 func (f *File) workSheetReader(sheet string) *xlsxWorksheet {
 func (f *File) workSheetReader(sheet string) *xlsxWorksheet {
 	name := "xl/worksheets/" + strings.ToLower(sheet) + ".xml"
 	name := "xl/worksheets/" + strings.ToLower(sheet) + ".xml"
-	worksheet := f.Sheet[name]
-	if worksheet == nil {
+	if f.Sheet[name] == nil {
 		var xlsx xlsxWorksheet
 		var xlsx xlsxWorksheet
 		xml.Unmarshal([]byte(f.readXML(name)), &xlsx)
 		xml.Unmarshal([]byte(f.readXML(name)), &xlsx)
 		if f.checked == nil {
 		if f.checked == nil {
@@ -159,9 +159,8 @@ func (f *File) workSheetReader(sheet string) *xlsxWorksheet {
 			f.checked[name] = true
 			f.checked[name] = true
 		}
 		}
 		f.Sheet[name] = &xlsx
 		f.Sheet[name] = &xlsx
-		worksheet = f.Sheet[name]
 	}
 	}
-	return worksheet
+	return f.Sheet[name]
 }
 }
 
 
 // SetCellInt provides function to set int type value of a cell by given
 // SetCellInt provides function to set int type value of a cell by given

+ 10 - 6
rows.go

@@ -30,7 +30,7 @@ func (f *File) GetRows(sheet string) [][]string {
 		f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpace(string(output)))
 		f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpace(string(output)))
 	}
 	}
 	decoder := xml.NewDecoder(strings.NewReader(f.readXML(name)))
 	decoder := xml.NewDecoder(strings.NewReader(f.readXML(name)))
-	d, _ := readXMLSST(f)
+	d := f.sharedStringsReader()
 	var inElement string
 	var inElement string
 	var r xlsxRow
 	var r xlsxRow
 	var row []string
 	var row []string
@@ -146,11 +146,15 @@ func (f *File) GetRowHeight(sheet string, row int) float64 {
 	return defaultRowHeightPixels
 	return defaultRowHeightPixels
 }
 }
 
 
-// readXMLSST read xmlSST simple function.
-func readXMLSST(f *File) (*xlsxSST, error) {
-	shardStrings := xlsxSST{}
-	err := xml.Unmarshal([]byte(f.readXML("xl/sharedStrings.xml")), &shardStrings)
-	return &shardStrings, err
+// sharedStringsReader provides function to get the pointer to the structure
+// after deserialization of xl/sharedStrings.xml.
+func (f *File) sharedStringsReader() *xlsxSST {
+	if f.SharedStrings == nil {
+		var sharedStrings xlsxSST
+		xml.Unmarshal([]byte(f.readXML("xl/sharedStrings.xml")), &sharedStrings)
+		f.SharedStrings = &sharedStrings
+	}
+	return f.SharedStrings
 }
 }
 
 
 // getValueFrom return a value from a column/row cell, this function is inteded
 // getValueFrom return a value from a column/row cell, this function is inteded

+ 1 - 1
styles.go

@@ -225,7 +225,7 @@ func parseTime(i int, v string) string {
 }
 }
 
 
 // stylesReader provides function to get the pointer to the structure after
 // stylesReader provides function to get the pointer to the structure after
-// deserialization of workbook.
+// deserialization of xl/styles.xml.
 func (f *File) stylesReader() *xlsxStyleSheet {
 func (f *File) stylesReader() *xlsxStyleSheet {
 	if f.Styles == nil {
 	if f.Styles == nil {
 		var styleSheet xlsxStyleSheet
 		var styleSheet xlsxStyleSheet