Browse Source

- New function `GetCellFormula` added;
- Fix `GetCellValue` causes panic in some particular situation issues;
- Go test updated

Ri Xu 9 năm trước cách đây
mục cha
commit
30d0a2f40a
2 tập tin đã thay đổi với 63 bổ sung15 xóa
  1. 60 15
      cell.go
  2. 3 0
      excelize_test.go

+ 60 - 15
cell.go

@@ -7,6 +7,7 @@ import (
 )
 
 // GetCellValue provide function get value from cell by given sheet index and axis in XLSX file.
+// The value of the merged cell is not available currently.
 func (f *File) GetCellValue(sheet string, axis string) string {
 	axis = strings.ToUpper(axis)
 	var xlsx xlsxWorksheet
@@ -15,24 +16,68 @@ func (f *File) GetCellValue(sheet string, axis string) string {
 	name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml`
 	xml.Unmarshal([]byte(f.readXML(name)), &xlsx)
 	rows := len(xlsx.SheetData.Row)
+	if rows > 1 {
+		lastRow := xlsx.SheetData.Row[rows-1].R
+		if lastRow >= rows {
+			rows = lastRow
+		}
+	}
+	if rows <= xAxis {
+		return ``
+	}
+	for _, v := range xlsx.SheetData.Row {
+		if v.R != row {
+			continue
+		}
+		for _, r := range v.C {
+			if axis != r.R {
+				continue
+			}
+			switch r.T {
+			case "s":
+				shardStrings := xlsxSST{}
+				xlsxSI := 0
+				xlsxSI, _ = strconv.Atoi(r.V)
+				xml.Unmarshal([]byte(f.readXML(`xl/sharedStrings.xml`)), &shardStrings)
+				return shardStrings.SI[xlsxSI].T
+			case "str":
+				return r.V
+			default:
+				return r.V
+			}
+		}
+	}
+	return ``
+}
+
+// GetCellFormula provide function get formula from cell by given sheet index and axis in XLSX file.
+func (f *File) GetCellFormula(sheet string, axis string) string {
+	axis = strings.ToUpper(axis)
+	var xlsx xlsxWorksheet
+	row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis))
+	xAxis := row - 1
+	name := `xl/worksheets/` + strings.ToLower(sheet) + `.xml`
+	xml.Unmarshal([]byte(f.readXML(name)), &xlsx)
+	rows := len(xlsx.SheetData.Row)
+	if rows > 1 {
+		lastRow := xlsx.SheetData.Row[rows-1].R
+		if lastRow >= rows {
+			rows = lastRow
+		}
+	}
 	if rows <= xAxis {
 		return ``
 	}
-	for _, v := range xlsx.SheetData.Row[xAxis].C {
-		if xlsx.SheetData.Row[xAxis].R == row {
-			if axis == v.R {
-				switch v.T {
-				case "s":
-					shardStrings := xlsxSST{}
-					xlsxSI := 0
-					xlsxSI, _ = strconv.Atoi(v.V)
-					xml.Unmarshal([]byte(f.readXML(`xl/sharedStrings.xml`)), &shardStrings)
-					return shardStrings.SI[xlsxSI].T
-				case "str":
-					return v.V
-				default:
-					return v.V
-				}
+	for _, v := range xlsx.SheetData.Row {
+		if v.R != row {
+			continue
+		}
+		for _, f := range v.C {
+			if axis != f.R {
+				continue
+			}
+			if f.F != nil {
+				return f.F.Content
 			}
 		}
 	}

+ 3 - 0
excelize_test.go

@@ -29,6 +29,9 @@ func TestExcelize(t *testing.T) {
 	f1.SetCellStr("SHEET3", "b230", "10")
 	f1.SetCellStr("SHEET10", "b230", "10")
 	f1.SetActiveSheet(2)
+	f1.GetCellFormula("Sheet1", "B19") // Test get cell formula with given rows number.
+	f1.GetCellFormula("Sheet2", "B20") // Test get cell formula with illegal sheet index.
+	f1.GetCellFormula("Sheet1", "B20") // Test get cell formula with illegal rows number.
 	// Test read cell value with given illegal rows number.
 	f1.GetCellValue("Sheet2", "a-1")
 	// Test read cell value with given lowercase column number.