forked from free-lancers/electricity_bill_calc_service
		
	enhance(excel):识别器的匹配规则改为全部匹配。
This commit is contained in:
		| @@ -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}, | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user