fix(excel):修复Excel文件解析时识别器不能保存列索引和无法对字符串指针赋值的问题。
This commit is contained in:
parent
1e2a7fbb75
commit
81533fcdf3
|
@ -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},
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user