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"),
})
}
}
go---生成表格
最新推荐文章于 2024-08-15 09:45:10 发布