github上关注较多的两个libary是
-
github.com/tealeg/xlsx
然而xlsx:NOT ACTIVELY MAINTAINED -
github.com/xuri/excelize/v2
excelize社区文档支持很不错
需求
按日期生成计划表头,效果如下:
分析
-
日历时间处理
根据年份计算月份天数;
月份中每天星期几计算; -
excel表头生成
使用excelize生成表头,左边列内容固定,右边按日期递增;
添加样式;
实现
日历时间
//判断是否为闰年
func IsLeapYear(year int) bool {
return year%400 == 0 || (year%4 == 0 && year%100 != 0)
}
//获取哪年哪月总天数
func GetMonthDay(year int, month int) (int, error) {
switch month {
case 1, 3, 5, 7, 8, 10, 12:
return 31, nil
case 2:
isLeapYear := IsLeapYear(year)
if isLeapYear {
return 29, nil
} else {
return 28, nil
}
case 4, 6, 9, 11:
return 30, nil
default:
return -1, fmt.Errorf("input month %d is error", month)
}
}
生成excel表头
位置axis中列是英文字母,行是数字如:B2,CD3,日期递增列可以通过数字列值计算出对应的字母excelize.ColumnNumberToName(37) // returns "AK", nil
for _, month := range months {
if days, err = calendarUtil.GetMonthDay(year, month); err != nil {
log.Fatal(err)
}
if startWeek, err = calendarUtil.GetWeekday(year, month, 1); err != nil {
log.Fatal(err)
}
if mstartcol, err = excelize.ColumnNumberToName(colIndex); err != nil {
log.Fatal(err)
}
weekIndex = 1
for day := 1; day <= days; day++ {
week := (int(startWeek) + day - 1) % 7
if week == 0 || day == days {
if wendcol, err = excelize.ColumnNumberToName(colIndex); err != nil {
log.Fatal(err)
}
f.SetCellValue(sheetName, wstartcol+"3", fmt.Sprintf("第%d周", weekIndex))
f.MergeCell(sheetName, wstartcol+"3", wendcol+"3")
weekIndex++
}
if week == 1 || day == 1 {
if wstartcol, err = excelize.ColumnNumberToName(colIndex); err != nil {
log.Fatal(err)
}
}
weekday := string([]rune(calendarUtil.Weekday_zh(time.Weekday(week)))[2:])
if colName, err = excelize.ColumnNumberToName(colIndex); err != nil {
log.Fatal(err)
}
f.SetCellValue(sheetName, colName+"4", weekday)
f.SetCellValue(sheetName, colName+"5", day)
colIndex++
}
style
func leftBorderStyle(file *excelize.File) (int, error) {
return file.NewStyle(`{
"border": [
{
"type": "left",
"color": "#000000",
"style": 2
}]
}`)
}
参考
直接使用
package main
import "github.com/yoloz/gos/utils/excelUtil"
func main() {
months := []int{10, 11, 12}
excelUtil.GeneratePlan(2021, months, "plan.xlsx")
}