Golang 數字轉換爲Excel列A-Z

需求來源

具體需求爲導出Excel時,數據只能行數與列數只能爲數字,因此在修改制定單元格時無法直觀的定位,要麼修改固定的單元格,要麼就只能通過特殊標識來循壞獲取單元格之後進行修改。或者通過Excel工具包中的AddRow或者AddCell來插入數據。
通過以下兩種方法(遞歸和for循環)可以做到以下格式的轉換
map[int]map[string]string
int =======> row
第二個map中的key是通過for拿取到的值,因此可以通過index int的方式獲取列索引。
獲取到列索引之後需要將索引轉換爲A-Z。

遞歸

var ExcelChar = []string{"", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
func ConvertNumToChar(num int) (string, error) {
	defer FuncExecTime("ConvertNumToChars", time.Now())
	if num < 27 {
		return ExcelChar[num], nil
	}
	k := num % 26
	if k == 0 {
		k = 26
	}
	v := (num - k) / 26
	col, err := ConvertNumToChar(v)
	if err != nil {
		return "", err
	}
	cols := col + ExcelChar[k]
	return cols, nil
}

for循環

var ExcelChar = []string{"", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
func ConvertNumToChars(num int) (string, error) {
   defer FuncExecTime("ConvertNumToChars", time.Now())
   var cols string
   v := num
   for v > 26 {
   	k := v % 26
   	if k == 0 {
   		k = 26
   	}
   	v = (v - k) / 26
   	cols = ExcelChar[k] + cols
   }
   if v < 27 {
   	cols = ExcelChar[v] + cols
   }
   return cols, nil
}
FuncExecTime爲計算方法執行時間
func FuncExecTime(methodname string, starttime time.Time) {
   endtime := time.Now()
   subtime := endtime.Sub(starttime).Nanoseconds()
   fmt.Println("方法", methodname, "的執行時間是:", subtime, "納秒,執行開始時間是:", starttime, ",結束時間是:", endtime)
}

測試結果

func main() {
	index := 191043099
	fmt.Println(util.ConvertNumToChar(index))
	index = 199039921
	fmt.Println(util.ConvertNumToChars(index))
}
// 方法 ConvertNumToChars 的執行時間是: 0 納秒,執行開始時間是: 2020-07-02 18:40:29.3156532 +0800 CST m=+0.011461701 ,結束時間是: 2020-07-02 18:40:29.3156532 +0800 CST m=+0.011461701
// 方法 ConvertNumToChars 的執行時間是: 23936600 納秒,執行開始時間是: 2020-07-02 18:40:29.3156532 +0800 CST m=+0.011461701 ,結束時間是: 2020-07-02 18:40:29.3395898 +0800 CST m=+0.035398301
// 方法 ConvertNumToChars 的執行時間是: 23936600 納秒,執行開始時間是: 2020-07-02 18:40:29.3156532 +0800 CST m=+0.011461701 ,結束時間是: 2020-07-02 18:40:29.3395898 +0800 CST m=+0.035398301
// 方法 ConvertNumToChars 的執行時間是: 23936600 納秒,執行開始時間是: 2020-07-02 18:40:29.3156532 +0800 CST m=+0.011461701 ,結束時間是: 2020-07-02 18:40:29.3395898 +0800 CST m=+0.035398301
// 方法 ConvertNumToChars 的執行時間是: 23936600 納秒,執行開始時間是: 2020-07-02 18:40:29.3156532 +0800 CST m=+0.011461701 ,結束時間是: 2020-07-02 18:40:29.3395898 +0800 CST m=+0.035398301
// 方法 ConvertNumToChars 的執行時間是: 23936600 納秒,執行開始時間是: 2020-07-02 18:40:29.3156532 +0800 CST m=+0.011461701 ,結束時間是: 2020-07-02 18:40:29.3395898 +0800 CST m=+0.035398301
// PBANCM <nil>
// 方法 ConvertNumToChars 的執行時間是: 0 納秒,執行開始時間是: 2020-07-02 18:40:29.3395898 +0800 CST m=+0.035398301 ,結束時間是: 2020-07-02 18:40:29.3395898 +0800 CST m=+0.035398301
// PSNMSO <nil>

結果

經過執行時間的對比,勉強可以看出for的執行效率時間是快於遞歸,但是這裏是可能是fmt的原因導致的這個差異。
從中可以看出,達到億級別的數字纔有不到1秒的差距,因此兩種方式都是可以忽略時間正常執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章