forked from free-lancers/electricity_bill_calc_service
		
	enhance(excel):识别器的匹配规则改为全部匹配。
This commit is contained in:
		| @@ -2,6 +2,7 @@ package excel | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"electricity_bill_calc/utils" | 	"electricity_bill_calc/utils" | ||||||
|  | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| @@ -24,10 +25,14 @@ type ExcelAnalyzer[T any] struct { | |||||||
| 	Regconizers  []*ColumnRecognizer | 	Regconizers  []*ColumnRecognizer | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type AnalysisError struct { | ||||||
|  | 	Err error | ||||||
|  | } | ||||||
|  |  | ||||||
| type ExcelAnalysisError struct { | type ExcelAnalysisError struct { | ||||||
| 	Row int   `json:"row"` | 	Row int           `json:"row"` | ||||||
| 	Col int   `json:"col"` | 	Col int           `json:"col"` | ||||||
| 	Err error `json:"error"` | 	Err AnalysisError `json:"error"` | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewColumnRecognizer(tag string, patterns ...string) ColumnRecognizer { | 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 { | func (r *ColumnRecognizer) Recognize(cellValue string) bool { | ||||||
|  | 	matches := make([]bool, 0) | ||||||
| 	for _, p := range r.Pattern { | 	for _, p := range r.Pattern { | ||||||
| 		if strings.Contains(cellValue, p) { | 		matches = append(matches, strings.Contains(cellValue, p)) | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 	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) { | 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) | 	rows, err := a.File.GetRows(a.ActivedSheet) | ||||||
| 	if err != nil { | 	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 | 		return make([]T, 0), errs | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -112,7 +122,7 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { | |||||||
| 						case "decimal.Decimal": | 						case "decimal.Decimal": | ||||||
| 							decimalValue, err := decimal.NewFromString(matchValue) | 							decimalValue, err := decimal.NewFromString(matchValue) | ||||||
| 							if err != nil { | 							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)) | 								actualField.Set(reflect.ValueOf(decimal.Zero)) | ||||||
| 							} else { | 							} else { | ||||||
| 								actualField.Set(reflect.ValueOf(decimalValue)) | 								actualField.Set(reflect.ValueOf(decimalValue)) | ||||||
| @@ -125,7 +135,7 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { | |||||||
| 							} else { | 							} else { | ||||||
| 								decimalValue, err := decimal.NewFromString(matchValue) | 								decimalValue, err := decimal.NewFromString(matchValue) | ||||||
| 								if err != nil { | 								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))) | 									actualField.Set(reflect.ValueOf((nullValue))) | ||||||
| 								} else { | 								} else { | ||||||
| 									actualField.Set(reflect.ValueOf(decimalValue)) | 									actualField.Set(reflect.ValueOf(decimalValue)) | ||||||
| @@ -137,7 +147,7 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { | |||||||
| 							} else { | 							} else { | ||||||
| 								v, err := strconv.Atoi(matchValue) | 								v, err := strconv.Atoi(matchValue) | ||||||
| 								if err != nil { | 								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) | 									actualField.SetInt(0) | ||||||
| 								} else { | 								} else { | ||||||
| 									actualField.SetInt(int64(v)) | 									actualField.SetInt(int64(v)) | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ var meter04kVExcelRecognizers = []*ColumnRecognizer{ | |||||||
| 	{Pattern: []string{"电话"}, Tag: "phone", MatchIndex: -1}, | 	{Pattern: []string{"电话"}, Tag: "phone", MatchIndex: -1}, | ||||||
| 	{Pattern: []string{"倍率"}, Tag: "ratio", MatchIndex: -1}, | 	{Pattern: []string{"倍率"}, Tag: "ratio", MatchIndex: -1}, | ||||||
| 	{Pattern: []string{"序号"}, Tag: "seq", 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}, | 	{Pattern: []string{"摊薄"}, Tag: "dilute", MatchIndex: -1}, | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user