Initial commit
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
package statutils
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"golang.org/x/exp/slices"
|
||||
|
||||
"github.com/vicanso/go-charts/v2"
|
||||
"github.com/wcharczuk/go-chart/v2/drawing"
|
||||
|
||||
"github.com/golang/freetype"
|
||||
|
||||
"github.com/golang/freetype/truetype"
|
||||
)
|
||||
|
||||
//go:embed 微软雅黑.ttf
|
||||
var FontData []byte
|
||||
var Font *truetype.Font
|
||||
|
||||
func init() {
|
||||
f, err := freetype.ParseFont(FontData)
|
||||
if err == nil {
|
||||
Font = f
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Stat) Table(title string, div int64, compare *Stat, filePath string) error {
|
||||
if div == 0 {
|
||||
div = 1
|
||||
}
|
||||
rows := make([][]string, 0)
|
||||
if compare != nil {
|
||||
rows = append(rows, s.Android.Row("安卓", div, &compare.Android))
|
||||
rows = append(rows, s.Ios.Row("苹果", div, &compare.Ios))
|
||||
rows = append(rows, s.Light.Rows(div, &compare.Light)...)
|
||||
rows = append(rows, s.H5.Rows(div, &compare.H5)...)
|
||||
rows = append(rows, s.Total.Row("合计", div, &compare.Total))
|
||||
} else {
|
||||
rows = append(rows, s.Android.Row("安卓", div, nil))
|
||||
rows = append(rows, s.Ios.Row("苹果", div, nil))
|
||||
rows = append(rows, s.Light.Rows(div, nil)...)
|
||||
rows = append(rows, s.H5.Rows(div, nil)...)
|
||||
rows = append(rows, s.Total.Row("合计", div, nil))
|
||||
}
|
||||
|
||||
charts.SetDefaultWidth(810)
|
||||
bgColor := drawing.ColorWhite
|
||||
p, err := charts.TableOptionRender(charts.TableChartOption{
|
||||
Header: s.Total.Header(title),
|
||||
BackgroundColor: bgColor,
|
||||
HeaderBackgroundColor: drawing.ColorFromHex("808080"),
|
||||
RowBackgroundColors: []charts.Color{
|
||||
bgColor,
|
||||
},
|
||||
HeaderFontColor: drawing.ColorBlack,
|
||||
FontColor: drawing.ColorBlack,
|
||||
Padding: charts.Box{
|
||||
Top: 15,
|
||||
Right: 10,
|
||||
Bottom: 15,
|
||||
Left: 10,
|
||||
},
|
||||
Data: rows,
|
||||
Font: Font,
|
||||
TextAligns: []string{
|
||||
charts.AlignCenter,
|
||||
charts.AlignLeft,
|
||||
},
|
||||
CellStyle: func(tc charts.TableCell) *charts.Style {
|
||||
text := strings.TrimSpace(tc.Text)
|
||||
style := &charts.Style{
|
||||
Padding: charts.Box{
|
||||
Bottom: 5,
|
||||
},
|
||||
}
|
||||
if strings.Contains(text, "-") {
|
||||
style.FontColor = drawing.ColorRed
|
||||
} else if strings.Contains(text, "+") {
|
||||
style.FontColor = drawing.ColorGreen
|
||||
}
|
||||
|
||||
if slices.Contains([]int{1, 2, 3}, tc.Row) {
|
||||
style.FillColor = drawing.ColorFromHex("ec8f75")
|
||||
} else if slices.Contains([]int{4, 5, 6}, tc.Row) {
|
||||
style.FillColor = drawing.ColorFromHex("788fc7")
|
||||
} else if slices.Contains([]int{7, 8}, tc.Row) {
|
||||
style.FillColor = drawing.ColorFromHex("ced6d2")
|
||||
} else if slices.Contains([]int{9}, tc.Row) {
|
||||
style.FillColor = drawing.ColorFromHex("808080")
|
||||
}
|
||||
return style
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
buf, err := p.Bytes()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return WriteBytesToFile(buf, filePath)
|
||||
}
|
||||
|
||||
func WriteBytesToFile(buf []byte, filename string) error {
|
||||
err := os.WriteFile(filename, buf, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func CommonTable(headers []string, rows [][]string, tableWidth int, filePath string) error {
|
||||
charts.SetDefaultWidth(tableWidth)
|
||||
bgColor := drawing.ColorWhite
|
||||
p, err := charts.TableOptionRender(charts.TableChartOption{
|
||||
Header: headers,
|
||||
BackgroundColor: bgColor,
|
||||
HeaderBackgroundColor: drawing.ColorFromHex("808080"),
|
||||
RowBackgroundColors: []charts.Color{
|
||||
bgColor,
|
||||
},
|
||||
HeaderFontColor: drawing.ColorBlack,
|
||||
FontColor: drawing.ColorBlack,
|
||||
Padding: charts.Box{
|
||||
Top: 15,
|
||||
Right: 10,
|
||||
Bottom: 15,
|
||||
Left: 10,
|
||||
},
|
||||
Data: rows,
|
||||
Font: Font,
|
||||
TextAligns: []string{
|
||||
charts.AlignCenter,
|
||||
charts.AlignLeft,
|
||||
},
|
||||
CellStyle: func(tc charts.TableCell) *charts.Style {
|
||||
style := &charts.Style{
|
||||
Padding: charts.Box{
|
||||
Bottom: 5,
|
||||
},
|
||||
}
|
||||
if tc.Row%2 == 0 {
|
||||
style.FillColor = drawing.ColorFromHex("f8f8f8")
|
||||
} else {
|
||||
style.FillColor = drawing.ColorWhite
|
||||
}
|
||||
return style
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
buf, err := p.Bytes()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return WriteBytesToFile(buf, filePath)
|
||||
}
|
||||
Reference in New Issue
Block a user