forked from p30928647/excelize
- New function `GetCellFormula` added;
- Fix `GetCellValue` causes panic in some particular situation issues; - Go test updated
This commit is contained in:
parent
a16d2ec83b
commit
30d0a2f40a
75
cell.go
75
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue