github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/encoding/kmgExcel/TitleArrayToGrid.go (about) 1 package kmgExcel 2 3 import ( 4 "fmt" 5 ) 6 7 //transform from title array to grid 8 //titleArray should call Trim2DArray already 9 func TitleArrayToGrid(titleArray [][]string) (output []map[string]string, err error) { 10 titleArray = Trim2DArray(titleArray) 11 lenTitleArray := len(titleArray) 12 if lenTitleArray <= 1 { 13 return []map[string]string{}, nil 14 } 15 output = make([]map[string]string, lenTitleArray-1) 16 titles := titleArray[0] 17 lenTitles := len(titles) 18 for rowIndex := 1; rowIndex < lenTitleArray; rowIndex++ { 19 row := titleArray[rowIndex] 20 r := make(map[string]string) 21 lenRow := len(row) 22 //there can be some blank row of left of row 23 if lenRow > lenTitles { 24 return nil, fmt.Errorf( 25 "titleArrayToGrid not all row length less or equal than first row length,"+ 26 "rowIndex: %d thisRowLen:%d firstRowLen:%d", rowIndex, lenRow, lenTitles) 27 } 28 for cellIndex := 0; cellIndex < lenRow; cellIndex++ { 29 cell := row[cellIndex] 30 r[titles[cellIndex]] = cell 31 } 32 output[rowIndex-1] = r 33 } 34 return output, nil 35 } 36 37 //transform from grid to title array 38 //keys not in title will return an error 39 // key in title but not in element map ,value will be "" in titleArray 40 // len(grid)==0 will return a titleArray only have title in it. 41 func GridToTitleArrayWithTitle(grid []map[string]string, title []string) (titleArray [][]string, err error) { 42 if len(grid) == 0 { 43 return [][]string{title}, nil 44 } 45 titleArray = make([][]string, len(grid)+1) 46 lenTitle := len(title) 47 titleIndexMap := make(map[string]int, lenTitle) 48 titleArray[0] = title 49 for i, key := range title { 50 titleIndexMap[key] = i 51 } 52 for i, row := range grid { 53 titleArray[i+1] = make([]string, lenTitle) 54 for key, value := range row { 55 j, exist := titleIndexMap[key] 56 if !exist { 57 return nil, fmt.Errorf("[GridToTitleArray][i:%d] key[%s] in grid Row,but not in title", i, key) 58 } 59 titleArray[i+1][j] = value 60 } 61 } 62 return 63 }