ExcelModelErrorException: tools.excel.error.excel.vo.error

Excel导出错误解决
本文记录了一次在导出Excel过程中遇到的错误及其解决过程。作者发现修改实体类中的注解可能是导致问题的原因之一。

在导出Excel的时候出现了这个错误!

搜了很久也没解决。

      后来按着文档。后来从写了一边,唯一和上次不同的地方,就是在实体中加了两个注解,不知道是不是这里的错误,如果大家有出现这个错误可以这样试一试。

@ExcelModelConfig
@Entity

   

/* * 生成 insert table_name(xxx) value(xxx) on duplicate key update语句 */ func (impl *SaveOrUpdateTableLoader) generateSaveOrUpdateSqlExt(ctx *core.EtlContext, transResult *vo.TransformResult, incrConfig *vo.IncrementConfig) (*SqlResult, error) { /* * 解析transResult中的目标列meta信息。 */ var loadColumns []*LoadColumn if transResult.DataType.Kind() == reflect.Map { columns, err := getColumnMap(transResult, impl.loadColumnConfigMap) if err != nil { logrus.Errorf("saveOrUpdateLoad生成sql:从map数据集中解析load字段错误=>%s", err) return nil, err } dbConfig := ds.DbConfig{ Ip: impl.targetLoadConfig.TargetDs.DbIp, Port: uint32(impl.targetLoadConfig.TargetDs.DbPort), Account: impl.targetLoadConfig.TargetDs.DbUser, Password: impl.targetLoadConfig.TargetDs.DbPassword, DbName: impl.targetLoadConfig.TargetDs.DbName, } //DataType为map,解析数据列表中的key得到列名,且从数据库获取列类型信息 loadColumns, err = ParseDbColumn(ctx, impl.targetLoadConfig.TargetDs.DbType, dbConfig, impl.targetLoadConfig.TargetTable, columns, true) if err != nil { logrus.Errorf("saveOrUpdateLoad生成sql:解析map数据集中目标column的meta信息失败=>%s", err) return nil, err } } else { if transResult.DataType.Kind() != reflect.Struct { logrus.Warnf("saveOrUpdateLoad生成sql:解析trd中的目标column失败,当前trd的数据类型[%v]不为struct", transResult.DataType.Kind()) return nil, errors.New("当前trd的数据类型只支持struct") } //DataType为结构体类型,解析load标签和属性得到列信息 trdType := transResult.DataType fieldName := strings.TrimSpace(impl.targetLoadConfig.SourceField) if fieldName != "" { trdType = tools.FindFieldType(trdType, fieldName) if trdType == nil { logrus.Warnf("saveOrUpdateLoad生成sql:解析trd[%+v]中的SourceField[%s]失败", transResult.DataType, fieldName) return nil, errors.New("无法从trd中找到配置的属性") } } loadColumns = ParseLoadColumn(ctx, trdType, fieldName, impl.loadColumnConfigMap) } if len(loadColumns) == 0 { logrus.Warnf("saveOrUpdateLoad生成sql:当前trd的数据类型[%v]解析目标column的meta信息为空", transResult.DataType) return nil, errors.New("目标column的meta信息为空") } //设置字段跳过更新 for _, lc := range loadColumns { cfg := impl.loadColumnConfigMap[lc.ColumnName] if cfg != nil { if cfg.SkipUpdate { lc.SkipUpdate = true } } } dataSize := len(transResult.DataList) sr := &SqlResult{ sqlList: make([]string, 0, dataSize), paramList: make([][]any, 0, dataSize), } //解析配置中联合唯一的列 ukNames := parseUkNames(impl.targetLoadConfig.UkColumn) /* * 拼装insert信息:insert into table(xxxx) value(?,?) on duplicate key update a=?,b=? */ genCtx := &gen.GeneratorContext{ Ctx: ctx, FromCache: impl.FromCache, } dmlDefine := &DmlDefine{ Table: impl.targetLoadConfig.TargetTable, ColumnDefList: loadColumns, InsertNull: impl.targetLoadConfig.InsertNull, UpdateNull: impl.targetLoadConfig.UpdateNull, UkNameList: ukNames, } var maxIncrementValue reflect.Value //遍历数据的同时,得到数据中增量字段的最大值 for i := 0; i < dataSize; i++ { data := transResult.DataList[i] //transform结果的单条数据 //生成insert语句信息 insertStmt, err := GenerateInsert(genCtx, dmlDefine, data) if err != nil { logrus.Errorf("saveOrUpdateLoad生成sql:生成insert字句出错, 错误信息=>%s; 列定义信息=>%+v; 当前数据行=>%v;", err, dmlDefine, data) return nil, err } rowCache := insertStmt.Cache //生成update语句信息 updateStmt, err := GenerateOnDuplicateUpdate(genCtx, dmlDefine, data, rowCache) if err != nil { logrus.Errorf("saveOrUpdateLoad生成sql:生成OnDuplicateUpdate字句出错, 错误信息=>%s; 列定义信息=>%+v; 当前数据行=>%v;", err, dmlDefine, data) return nil, err } //计算增量字段最大的数据 if incrConfig != nil { var incrColumn *LoadColumn for _, col := range loadColumns { if col.FieldName == incrConfig.IncrementTransformField { incrColumn = col break } } if incrColumn != nil { ifValue := rowCache[incrColumn.ColumnName] pfv := reflect.ValueOf(ifValue) if !maxIncrementValue.IsValid() { maxIncrementValue = pfv } else { cv := tools.CompareAndGetMaxValue(maxIncrementValue, pfv) if cv.IsValid() { maxIncrementValue = cv } } } } //添加sql和参数返回结果 if updateStmt != nil { sql := fmt.Sprintf("%s%s", insertStmt.Sql, updateStmt.Sql) sr.sqlList = append(sr.sqlList, sql) size := len(insertStmt.ParamList) + len(updateStmt.ParamList) params := make([]any, 0, size) params = append(params, insertStmt.ParamList...) params = append(params, updateStmt.ParamList...) sr.paramList = append(sr.paramList, params) } else { sr.sqlList = append(sr.sqlList, insertStmt.Sql) sr.paramList = append(sr.paramList, insertStmt.ParamList) } } if incrConfig != nil && maxIncrementValue.IsValid() { v, _ := tools.BasicTypeToString(maxIncrementValue) sr.endPosition = &vo.Position{ Config: incrConfig, Value: v, } } return sr, nil } 这个逻辑生成的SQL语句是什么样子的
10-17
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值