需求來源
具體需求爲導出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秒的差距,因此兩種方式都是可以忽略時間正常執行。