From 875a176795a292e20040db07a4e626063f9f6031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Wed, 17 Aug 2022 15:32:30 +0800 Subject: [PATCH] =?UTF-8?q?enhance(excel):=E8=AF=86=E5=88=AB=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E5=8C=B9=E9=85=8D=E8=A7=84=E5=88=99=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=8C=B9=E9=85=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excel/abstract.go | 32 +++++++++++++++++++++----------- excel/meter_archive.go | 2 +- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/excel/abstract.go b/excel/abstract.go index 4b2a28b..77eb70c 100644 --- a/excel/abstract.go +++ b/excel/abstract.go @@ -2,6 +2,7 @@ package excel import ( "electricity_bill_calc/utils" + "encoding/json" "fmt" "io" "reflect" @@ -24,10 +25,14 @@ type ExcelAnalyzer[T any] struct { Regconizers []*ColumnRecognizer } +type AnalysisError struct { + Err error +} + type ExcelAnalysisError struct { - Row int `json:"row"` - Col int `json:"col"` - Err error `json:"error"` + Row int `json:"row"` + Col int `json:"col"` + Err AnalysisError `json:"error"` } func NewColumnRecognizer(tag string, patterns ...string) ColumnRecognizer { @@ -38,13 +43,18 @@ func NewColumnRecognizer(tag string, patterns ...string) ColumnRecognizer { } } +func (e AnalysisError) MarshalJSON() ([]byte, error) { + return json.Marshal(e.Err.Error()) +} + func (r *ColumnRecognizer) Recognize(cellValue string) bool { + matches := make([]bool, 0) for _, p := range r.Pattern { - if strings.Contains(cellValue, p) { - return true - } + matches = append(matches, strings.Contains(cellValue, p)) } - return false + return utils.Reduce(matches, true, func(acc, elem bool) bool { + return acc && elem + }) } func NewExcelAnalyzer[T any](file io.Reader, recognizers []*ColumnRecognizer) (*ExcelAnalyzer[T], error) { @@ -80,7 +90,7 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { rows, err := a.File.GetRows(a.ActivedSheet) if err != nil { - errs = append(errs, ExcelAnalysisError{Row: 0, Col: 0, Err: err}) + errs = append(errs, ExcelAnalysisError{Row: 0, Col: 0, Err: AnalysisError{Err: err}}) return make([]T, 0), errs } @@ -112,7 +122,7 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { case "decimal.Decimal": decimalValue, err := decimal.NewFromString(matchValue) if err != nil { - errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: fmt.Errorf("单元格内容应为纯数字内容。%w", err)}) + errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: AnalysisError{Err: fmt.Errorf("单元格内容应为纯数字内容。%w", err)}}) actualField.Set(reflect.ValueOf(decimal.Zero)) } else { actualField.Set(reflect.ValueOf(decimalValue)) @@ -125,7 +135,7 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { } else { decimalValue, err := decimal.NewFromString(matchValue) if err != nil { - errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: fmt.Errorf("单元格内容应为纯数字内容。%w", err)}) + errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: AnalysisError{Err: fmt.Errorf("单元格内容应为纯数字内容。%w", err)}}) actualField.Set(reflect.ValueOf((nullValue))) } else { actualField.Set(reflect.ValueOf(decimalValue)) @@ -137,7 +147,7 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { } else { v, err := strconv.Atoi(matchValue) if err != nil { - errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: fmt.Errorf("单元格内容应为不带小数的整数。%w", err)}) + errs = append(errs, ExcelAnalysisError{Row: rowIndex + 1, Col: recognizer.MatchIndex + 1, Err: AnalysisError{Err: fmt.Errorf("单元格内容应为不带小数的整数。%w", err)}}) actualField.SetInt(0) } else { actualField.SetInt(int64(v)) diff --git a/excel/meter_archive.go b/excel/meter_archive.go index f73aaf2..26296fb 100644 --- a/excel/meter_archive.go +++ b/excel/meter_archive.go @@ -13,7 +13,7 @@ var meter04kVExcelRecognizers = []*ColumnRecognizer{ {Pattern: []string{"电话"}, Tag: "phone", MatchIndex: -1}, {Pattern: []string{"倍率"}, Tag: "ratio", MatchIndex: -1}, {Pattern: []string{"序号"}, Tag: "seq", MatchIndex: -1}, - {Pattern: []string{"公用", "公用设备"}, Tag: "public", MatchIndex: -1}, + {Pattern: []string{"公用设备"}, Tag: "public", MatchIndex: -1}, {Pattern: []string{"摊薄"}, Tag: "dilute", MatchIndex: -1}, }