forked from free-lancers/electricity_bill_calc_service
		
	fix(excel):修复Excel文件解析时识别器不能保存列索引和无法对字符串指针赋值的问题。
This commit is contained in:
		| @@ -21,7 +21,7 @@ type ColumnRecognizer struct { | ||||
| type ExcelAnalyzer[T any] struct { | ||||
| 	File         *excelize.File | ||||
| 	ActivedSheet string | ||||
| 	Regconizers  []ColumnRecognizer | ||||
| 	Regconizers  []*ColumnRecognizer | ||||
| } | ||||
|  | ||||
| type ExcelAnalysisError struct { | ||||
| @@ -47,7 +47,7 @@ func (r *ColumnRecognizer) Recognize(cellValue string) bool { | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func NewExcelAnalyzer[T any](file io.Reader, recognizers []ColumnRecognizer) (*ExcelAnalyzer[T], error) { | ||||
| func NewExcelAnalyzer[T any](file io.Reader, recognizers []*ColumnRecognizer) (*ExcelAnalyzer[T], error) { | ||||
| 	excelFile, err := excelize.OpenReader(file) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @@ -60,7 +60,7 @@ func NewExcelAnalyzer[T any](file io.Reader, recognizers []ColumnRecognizer) (*E | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func (a *ExcelAnalyzer[T]) AddRecognizer(recognizer ColumnRecognizer) { | ||||
| func (a *ExcelAnalyzer[T]) AddRecognizer(recognizer *ColumnRecognizer) { | ||||
| 	a.Regconizers = append(a.Regconizers, recognizer) | ||||
| } | ||||
|  | ||||
| @@ -85,7 +85,7 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { | ||||
| 	} | ||||
|  | ||||
| 	elementType := reflect.TypeOf(bean) | ||||
| 	collections := reflect.MakeSlice(elementType, 0, 0) | ||||
| 	collections := reflect.MakeSlice(reflect.SliceOf(elementType), 0, 0) | ||||
| 	for rowIndex, cols := range rows { | ||||
| 		// 标题行,需要完成识别动作 | ||||
| 		if rowIndex == 0 { | ||||
| @@ -100,14 +100,14 @@ func (a *ExcelAnalyzer[T]) Analysis(bean T) ([]T, []ExcelAnalysisError) { | ||||
| 			if alias, ok := field.Tag.Lookup("excel"); ok { | ||||
| 				for _, recognizer := range a.Regconizers { | ||||
| 					if alias == recognizer.Tag && recognizer.MatchIndex != -1 { | ||||
| 						actualField := instance.FieldByName(field.Name) | ||||
| 						actualField := instance.Elem().FieldByName(field.Name) | ||||
| 						matchValue := cols[recognizer.MatchIndex] | ||||
| 						switch field.Type.String() { | ||||
| 						case "string": | ||||
| 							actualField.Set(reflect.ValueOf(matchValue)) | ||||
| 						case "*string": | ||||
| 							if len(matchValue) > 0 { | ||||
| 								actualField.Elem().Set(reflect.ValueOf(&matchValue)) | ||||
| 								actualField.Set(reflect.ValueOf(&matchValue)) | ||||
| 							} | ||||
| 						case "decimal.Decimal": | ||||
| 							decimalValue, err := decimal.NewFromString(matchValue) | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import ( | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| var meter04kVExcelRecognizers = []ColumnRecognizer{ | ||||
| var meter04kVExcelRecognizers = []*ColumnRecognizer{ | ||||
| 	{Pattern: []string{"表号"}, Tag: "code", MatchIndex: -1}, | ||||
| 	{Pattern: []string{"户名"}, Tag: "name", MatchIndex: -1}, | ||||
| 	{Pattern: []string{"户址"}, Tag: "address", MatchIndex: -1}, | ||||
| @@ -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