go---生成表格

package sheet

import (
    "encoding/csv"
    "fmt"
    "os"
    "time"

    "github.com/getsentry/raven-go"
    "github.com/sirupsen/logrus"

    // 以下需要倒入自己写的包,这里略去
)

// GenDailyReportCSV .
func GenDailyReportCSV(date time.Time) error {
    err, _ := raven.CapturePanic(func() { genDailyReportCSV(date) }, nil)

    if err != nil {
        e, ok := err.(error)
        if !ok {
            return fmt.Errorf("%v", err)
        }
        return e
    }

    return nil
}

func genDailyReportCSV(date time.Time) {

    // 从数据库获取数据
    Reports, err := reports.GetReportsFromDatabase(date, date)
    if err != nil {
        logrus.Errorf("GetReports Fail: %+v", err)
        panic(err)
    }

    // 生成表格
    fileDaily, err := os.Create(fmt.Sprintf("%s/%s-daily.csv", FilesRoot, date.Format("2006-01-02")))
    if err != nil {
        logrus.Fatal("Cannot create file", err)
        panic(err)
    }
    defer fileDaily.Close()

    // 开始必须写入的3个字节,BOM,否则 excel 读出的是乱码
    _, err = fileDaily.Write([]byte{0xEF, 0xBB, 0xBF})
    if err != nil {
        logrus.Fatal("Cannot create file", err)
        panic(err)
    }

    wd := csv.NewWriter(fileDaily)
    defer wd.Flush()   // defer 非常有必要,在程序退出时执行

    // 表头
    wd.Write([]string{
        "employee_id",
        "type",
        "min_time",
        "max_time",
    })

    // 表中的数据
    for _, report := range *Reports {
        // 判断该枚举类型是否存在
        reportType, ok := models.ReportTypesName[report.Type]
        if !ok {
            continue
        }

        // 判断时间是否合理
        minTime := report.LoginTime
        maxTime := report.LogoutTime
        if minTime.IsZero() || maxTime.IsZero() || minTime.After(maxTime) {
            continue
        }

        // 数据检查合理后,将其写入表
        wd.Write([]string{
            fmt.Sprintf("%d", report.EmployeeID),
            reportType,
            minTime.Format("2006-01-02T15:04:05Z07:00"),
            maxTime.Format("2006-01-02T15:04:05Z07:00"),
        })
    }
}

猜你喜欢

转载自blog.csdn.net/u012319493/article/details/81197700