From 48753eb3f05cf344f5491fbc670836db32c31c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Sat, 10 Jun 2023 06:28:04 +0800 Subject: [PATCH] =?UTF-8?q?enhance(excel):=E5=A2=9E=E5=8A=A0=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E6=97=A5=E6=9C=9F=E4=B8=8E=E6=97=B6=E9=97=B4=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=86=85=E5=AE=B9=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excel/abstract.go | 65 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/excel/abstract.go b/excel/abstract.go index 2d98237..932a760 100644 --- a/excel/abstract.go +++ b/excel/abstract.go @@ -2,6 +2,7 @@ package excel import ( "electricity_bill_calc/tools" + "electricity_bill_calc/types" "encoding/json" "errors" "fmt" @@ -21,7 +22,7 @@ type ExcelTemplateGenerator interface { } type ColumnRecognizer struct { - Pattern []string + Pattern [][]string Tag string MatchIndex int MustFill bool @@ -43,7 +44,7 @@ type ExcelAnalysisError struct { Err AnalysisError `json:"error"` } -func NewColumnRecognizer(tag string, patterns ...string) ColumnRecognizer { +func NewColumnRecognizer(tag string, patterns ...[]string) ColumnRecognizer { return ColumnRecognizer{ Pattern: patterns, Tag: tag, @@ -65,9 +66,17 @@ func (e ExcelAnalysisError) Error() string { func (r *ColumnRecognizer) Recognize(cellValue string) bool { matches := make([]bool, 0) - for _, p := range r.Pattern { - matches = append(matches, strings.Contains(cellValue, p)) + for _, pG := range r.Pattern { + groupMatch := make([]bool, 0) + for _, p := range pG { + groupMatch = append(groupMatch, strings.Contains(cellValue, p)) + } + // 这句表示在每一个匹配组中,只要有一个匹配项,就算匹配成功 + matches = append(matches, lo.Reduce(groupMatch, func(acc, elem bool, index int) bool { + return acc || elem + }, false)) } + // 这句表示在尊有的匹配组中,必须全部的匹配组都完成匹配,才算匹配成功 return lo.Reduce(matches, func(acc, elem bool, index int) bool { return acc && elem }, true) @@ -187,6 +196,54 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { } else { actualField.SetBool(false) } + case "types.Date": + if len(matchValue) == 0 { + actualField.Set(reflect.ValueOf(types.NewEmptyDate())) + } else { + v, err := types.ParseDate(matchValue) + if err != nil { + errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: AnalysisError{Err: fmt.Errorf("单元格内容应为日期格式。%w", err)}}) + actualField.Set(reflect.ValueOf(types.NewEmptyDate())) + } else { + actualField.Set(reflect.ValueOf(v)) + } + } + case "*types.Date": + if len(matchValue) == 0 { + actualField.Set(reflect.ValueOf(nil)) + } else { + v, err := types.ParseDate(matchValue) + if err != nil { + errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: AnalysisError{Err: fmt.Errorf("单元格内容应为日期格式。%w", err)}}) + actualField.Set(reflect.ValueOf(nil)) + } else { + actualField.Set(reflect.ValueOf(&v)) + } + } + case "types.DateTime": + if len(matchValue) == 0 { + actualField.Set(reflect.ValueOf(types.NewEmptyDateTime())) + } else { + v, err := types.ParseDateTime(matchValue) + if err != nil { + errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: AnalysisError{Err: fmt.Errorf("单元格内容应为日期时间格式。%w", err)}}) + actualField.Set(reflect.ValueOf(types.NewEmptyDateTime())) + } else { + actualField.Set(reflect.ValueOf(v)) + } + } + case "*types.DateTime": + if len(matchValue) == 0 { + actualField.Set(reflect.ValueOf(nil)) + } else { + v, err := types.ParseDateTime(matchValue) + if err != nil { + errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: AnalysisError{Err: fmt.Errorf("单元格内容应为日期时间格式。%w", err)}}) + actualField.Set(reflect.ValueOf(nil)) + } else { + actualField.Set(reflect.ValueOf(&v)) + } + } } } }