enhance(excel):识别器的匹配规则改为全部匹配。
This commit is contained in:
parent
97f8ef65d8
commit
875a176795
|
@ -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"`
|
||||
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))
|
||||
|
|
|
@ -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},
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user