From 30d0a2f40afadf7fef9e008bf2fa557b07560c54 Mon Sep 17 00:00:00 2001 From: Ri Xu Date: Sat, 24 Dec 2016 22:47:36 +0800 Subject: [PATCH] - New function `GetCellFormula` added; - Fix `GetCellValue` causes panic in some particular situation issues; - Go test updated --- cell.go | 75 ++++++++++++++++++++++++++++++++++++++---------- excelize_test.go | 3 ++ 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/cell.go b/cell.go index ef0a4f8..106b1f2 100644 --- a/cell.go +++ b/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[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 _, 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 { + if v.R != row { + continue + } + for _, f := range v.C { + if axis != f.R { + continue + } + if f.F != nil { + return f.F.Content } } } diff --git a/excelize_test.go b/excelize_test.go index e9ad669..35a395c 100644 --- a/excelize_test.go +++ b/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.