golang如何操作excel文档

github上关注较多的两个libary是

需求

按日期生成计划表头,效果如下:

分析

  1. 日历时间处理

    根据年份计算月份天数;
    月份中每天星期几计算;

  2. 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
		}]
	}`)
}

参考

excelize中文文档

直接使用

package main

import "github.com/yoloz/gos/utils/excelUtil"

func main() {

	months := []int{10, 11, 12}
	excelUtil.GeneratePlan(2021, months, "plan.xlsx")
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值