go读取excel使用库github.com/Luxurioust/excelize
//打开文件
xlsx, err := excelize.OpenFile("./test.xlsx")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 获取excel数据
rows := xlsx.GetRows("Sheet1")
for iRow, row := range rows {
for iCol, colCell := range row {
fmt.Print(colCell, "\t")
}
fmt.Println()
}
发现日期字段的原始数据为:
20181229145705.png
但读取出来是这样的数字:
43355
43356
43357
43358
43359
43360
37152
确认excel这个数字表示当前日期距离1900-00-01的天数
解决办法:将这些天数换算成日期字符串。
增加一个函数convertToFormatDay
// excel日期字段格式化 yyyy-mm-dd
func convertToFormatDay(excelDaysString string)string{
// 2006-01-02 距离 1900-01-01的天数
baseDiffDay := 38719 //在网上工具计算的天数需要加2天,什么原因没弄清楚
curDiffDay := excelDaysString
b,_ := strconv.Atoi(curDiffDay)
// 获取excel的日期距离2006-01-02的天数
realDiffDay := b - baseDiffDay
//fmt.Println("realDiffDay:",realDiffDay)
// 距离2006-01-02 秒数
realDiffSecond := realDiffDay * 24 * 3600
//fmt.Println("realDiffSecond:",realDiffSecond)
// 2006-01-02 15:04:05距离1970-01-01 08:00:00的秒数 网上工具可查出
baseOriginSecond := 1136185445
resultTime := time.Unix(int64(baseOriginSecond + realDiffSecond), 0).Format("2006-01-02")
return resultTime
}
最终读取excel代码:
// 获取excel数据
rows := xlsx.GetRows("Sheet1")
for iRow, row := range rows {
for iCol, colCell := range row {
if iRow > 1 && iCol == 7 {//第3行开始 第8列为日期
fmt.Print(convertToFormatDay(colCell),"\t")
}else{
fmt.Print(colCell, "\t")
}
}
fmt.Println()
}
感觉有点恶心,先这么解决吧。
网友评论