golang - 如何列出excel列名?

如圖所示,exel 列被列為 ABC ... AA AB AC ...。沒有關于如何在 go lang 中列出此內容的示例。在決議 excel 電子表格以獲取電子表格選項卡的范圍以獲取單元格值時,這是需要的
uj5u.com熱心網友回復:
我試圖搜索方便的函式來獲取excel列名但無法進入golang,所以創建了一個,希望這有助于其他人節省時間
package main
import "fmt"
func reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i 1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
// Function to print Excel column
// name for a given column number
//
func getColumnName(columnNumber int) string {
// To store result (Excel column name)
var columnName = ""
for ok := true; ok; ok = columnNumber > 0 {
// Find remainder
rem := columnNumber % 26
// If remainder is 0, then a
// 'Z' must be there in output
if rem == 0 {
columnName = "Z"
columnNumber = (columnNumber / 26) - 1
} else // If remainder is non-zero
{
columnName = string((rem - 1) int('A'))
columnNumber = columnNumber / 26
}
}
// Reverse the string
columnName = reverse(columnName)
return columnName
}
func main() {
for cm := 1; cm < 100; cm {
fmt.Println(getColumnName(cm))
}
}
uj5u.com熱心網友回復:
這是一個有效的解決方案。
func getColumnName(col int) string {
name := make([]byte, 0, 3) // max 16,384 columns (2022)
const aLen = 'Z' - 'A' 1 // alphabet length
for ; col > 0; col /= aLen 1 {
name = append(name, byte('A' (col-1)%aLen))
}
for i, j := 0, len(name)-1; i < j; i, j = i 1, j-1 {
name[i], name[j] = name[j], name[i]
}
return string(name)
}
https://go.dev/play/p/upjBQeE1x8I
OP (@mahbh2001) 發布了他自己問題的答案:https ://stackoverflow.com/a/71350368
以下是第getColumnName1 列到第 99 列的基準測驗結果:
rocka2q:
BenchmarkA2Q-4 758865 1498 ns/op 146 B/op 73 allocs/op
OP (mahbh2001):
BenchmarkOP-4 122714 9515 ns/op 1376 B/op 341 allocs/op
OP的代碼要慢得多。
uj5u.com熱心網友回復:
這是一個帶有錯誤處理程式的。這是從excelize修改的, 注意這不如@rocka2q 答案快。
package main
import (
"errors"
"fmt"
)
func main() {
for cm := 1; cm < 100; cm {
cmName, _ := ColumnNumberToName(cm)
fmt.Println(cmName)
}
}
func ColumnNumberToName(num int) (string, error) {
if num < 1 {
return "", fmt.Errorf("incorrect column number %d", num)
}
if num > 16384 {
return "", errors.New("column number exceeds maximum limit")
}
var col string
for num > 0 {
col = string(rune((num-1)%26 65)) col
num = (num - 1) / 26
}
return col, nil
}
或者你可以直接使用excelize函式:
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
)
func main() {
for cm := 1; cm < 100; cm {
cmName, _ := excelize.ColumnNumberToName(cm)
fmt.Println(cmName)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/438588.html
