时间:2021.09.28
环境:Windows
目的:Go读取Excel表格内容
说明:融合了读取加密文档、输出颜色和内容控制、倒计时退出等功能,对于读取Excel只做简单的操作
作者:Zhong QQ交流群:121160124 欢迎加入!
首先新建一个xlsx格式的Excel文档 设置密码加密 适当输入一些内容
新建mian.go文件 内容如下
package main
import (
"bufio"
"fmt"
"os"
"strings"
"syscall"
"unsafe"
"time"
"strconv"
"unicode"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/gookit/color"
)
func main() {
is_true := true
c := 0
var f *excelize.File
for is_true {
if c > 2 {
color.Error.Println("阿西吧!超过规定密码输入次数!")
time.Sleep(time.Second * 3)
return
}
sss_code := Prompt("请输入18位密码")
//读取加密的文档
_f, err := excelize.OpenFile("sss.xlsx", excelize.Options{Password: sss_code})
if err != nil {
color.Warn.Println("密码不正确或Excel文件不存在!\n")
c++
} else {
is_true = false
f = _f
}
}
// 内容
color.Secondary.Println("数据信息:\n\n")
// 获取 Sheet1 上所有单元格
rows, err := f.GetRows("Sheet1")
if err != nil {
fmt.Println(err)
return
}
k := 0 // 行计数
for _, row := range rows {
j := 0 // 列计数
for _, colCell := range row {
tb := 25
c := HansNum(colCell)
tb = tb - c
// 如果是第一行
if k == 0 {
color.Style{color.OpBold, color.FgRed}.Printf("%-"+strconv.Itoa(tb)+"s", colCell)
// 如果是其它行的第一列
} else if j == 0 {
color.Style{color.FgCyan, color.OpBold}.Printf("%-"+strconv.Itoa(tb)+"s", colCell)
j++
} else if j == 1 {
color.Style{color.OpBold, color.FgBlue}.Printf("%-"+strconv.Itoa(tb)+"s", colCell)
j++
} else if j == 2 {
if len(colCell) >= 3 {
first_char := colCell[0:1]
middle_char := colCell[1:len(colCell)-1]
lase_char := colCell[len(colCell)-1]
color.Printf("<fg=11aa23>%s</><bg=255,255,255,1>%s</><fg=11aa23>%s</>", string(first_char), string(middle_char), string(lase_char))
} else {
color.Style{color.FgCyan, color.OpBold}.Printf("%-"+strconv.Itoa(tb)+"s", colCell)
}
j++
} else {
fmt.Printf("%-"+strconv.Itoa(tb)+"s", colCell)
}
}
//fmt.Println()
color.Yellowln("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -")
//fmt.Println()
k++
}
//定时退出程序
n := 180
color.Info.Println("\n\nTips: 鼠标左键查看内容与锁定程序 右键复制内容与释放程序\n")
tick := time.Tick(1 * time.Second)
for exit_program := n; exit_program > 0; exit_program-- {
color.Red.Printf("\r%ds 后将自动退出程序 ... ", exit_program)
<-tick
}
}
var getStdHandle, getConsoleMode, setConsoleMode *syscall.LazyProc
func init() {
lib := syscall.NewLazyDLL("Kernel32.dll")
getStdHandle = lib.NewProc("GetStdHandle")
getConsoleMode = lib.NewProc("GetConsoleMode")
setConsoleMode = lib.NewProc("SetConsoleMode")
}
func Prompt(msg string) string {
color.Info.Println(msg + ": \n")
handle, _, _ := getStdHandle.Call(uintptr(^uint(10) + 1))
var mode uint
getConsoleMode.Call(handle, uintptr(unsafe.Pointer(&mode)))
newMode := mode & ^uint(4)
setConsoleMode.Call(handle, uintptr(newMode))
passwd, err := bufio.NewReader(os.Stdin).ReadString('\n')
setConsoleMode.Call(handle, uintptr(mode))
if err != nil {
panic(err)
}
return strings.TrimSpace(passwd)
}
// 检查是否是中文
func HansNum(str string) (count int) {
for _, v := range str {
if unicode.Is(unicode.Han, v) {
count++
}
}
return
}
关注微信公众号 加入QQ交流群 121160124