跳到主要内容

数据导出组件

数据导出组件(DataExport)用于将数据导出为 Excel 文件并返回下载结果。

概述​

数据导出组件把上游传入的数据(通常是查询集合的结果)生成为 Excel 文件。组件只需配置导出文件类型与文件名,实际导出的字段与格式由上游数据决定。

组件要求紧跟在返回 List<ObjectData> 的组件之后,因为它直接从上游结果(context.CmpResult)读取待导出的数据,并据此推断导出列与文件内容。

配置项​

配置项说明
文件类型导出文件的类型,必填,目前支持 Excel
文件名导出文件的名称
输出到最终结果开启后该组件结果作为接口返回值

文件类型取值​

值(ExportFileType)说明
ExcelExcel 文件(缺省,目前唯一取值)

执行流程​

导出列来源​

组件按以下优先级确定导出哪些列、以及 sheet 名称:

优先级触发条件列来源
1上下文含导入结果标记DicParam["ChameleonImportResultCode"] 中的列
2上下文含导出列参数DicParam["ChameleonExportColumns"] 中的列
3请求含 metaViewId视图列表(MetaView)未隐藏的列表项
4请求含 metaFormId表单(MetaForm)布局中未隐藏的字段
5其它(非页面进入)上游数据出现的字段与对象字段的交集

使用场景​

  • 报表导出
  • 业务数据备份
  • 数据交付

下一步​

属性明细​

以下内容面向技术实现与 AI 检索,说明数据导出组件的节点元数据。

所有节点 meta 的取值均以字符串形式存储,数值、布尔值也以字符串表达(如 "true")。

节点元数据​

数据导出组件由 FlowCmpType.DataExport 标识:

属性名类型含义取值/存储值
typestring组件类型固定为 "DataExport"
ExportFileTypestring导出文件类型"Excel"(缺省)
FileNamestring导出文件名例:"订单明细"
IsFinalResultstring(bool)是否输出到最终结果"true" / "false"
orderstring同级排序例:"13"

元数据存储示例​

{
"ID": "export1",
"type": "DataExport",
"ExportFileType": "Excel",
"FileName": "订单明细",
"IsFinalResult": "true",
"order": "13"
}

服务端执行逻辑​

执行时机与场景​

数据导出组件继承自 InterfaceComponentManagerBase,运行在平台接口链路中。它与数据导入是反向关系:导入负责「文件 → 数据」,导出负责「数据 → 文件」。

除手工在流程中配置外,数据导入组件在产生失败明细时也会内部以快捷方式拉起本组件,复用同一套 Excel 生成逻辑来输出导入失败明细(详见数据导入)。

输入参数(meta 键)​

meta 键说明
ExportFileType必填,不可为空,且必须在支持列表内(["EXCEL"],不区分大小写)
FileName文件名前缀;实际下载名会追加时间戳
IsFinalResult是否把导出结果写入最终结果

执行时还会读取上下文与请求:

  • context.CmpResult:待导出数据,类型 List<ObjectData>(非该类型时按空列表处理)。
  • context.DicParam["ChameleonImportResult"]:导入结果标记,存在时按导入列导出。
  • context.DicParam["ChameleonImportResultCode"]:形如 Code1|显示名1,Code2|显示名2 的导入列。
  • context.DicParam["ChameleonExportColumns"]:显式指定导出列,格式同上。
  • 请求 query 中的 metaViewId、metaFormId:页面进入时用于确定 sheet 名与导出列。
  • context.DicParam["ChameleonMetaObjectId"]:上游数据操作对象,用于兜底推断对象。

执行步骤​

  1. 校验(_VerifyAsync):ExportFileType 不可为空且必须在支持列表内,否则分别抛「模板未找到」/「模板类型不支持」。校验通过后进入下游校验链。
  2. 确定导出列:按「导出列来源」优先级依次尝试,得到 columns(FieldData 列表:Code + Text)与 sheetName、mainMetaObjectId。若最终对象 ID 仍为空,则用上游对象 ID 兜底。
  3. 生成文件:仅在 IsFinalResult = "true" 时生成,同时写入 context.TransferResult.List = list。
  4. 交付结果:区分「异步任务内」与「同步请求」两种交付方式(见下方「输出与上下文」)。

导出列与文件生成​

Excel 生成逻辑(ExportAsExcel)使用 NPOI 生成 .xlsx:

  • 第 0 行隐藏,写入各列的字段编码(Code),供导入回填映射使用;
  • 第 1 行为表头,写入列显示名(Text);若列编码为 ImportErrorMessage,表头加 * 前缀并使用红色字体,标识出错的列;
  • 数据从第 2 行开始逐行写入。

字段值的特殊处理:

  • 文件上传类型字段:单元格写入超链接,地址为 {请求源}/Common/FileList/{metaObjectId}/{数据ID}/{字段编码},文本为「查看附件」;若缺少对象信息或值则为空。
  • 超长文本:单列文本超过 30000 字符时截断至 30000。
  • 列宽使用常量 DefaultExportExcelColWidth(18)。

生成完成后写入 context.DicParam["DownloadFileName"] = "{FileName}{yyyyMMddHHmmss}.xlsx"。

输出与上下文​

输出项条件说明
context.TransferResult.ListIsFinalResult = "true"导出用的数据列表
context.DicParam["DownloadFileName"]生成文件后下载文件名(含时间戳)
context.Result同步链路值为 MemoryStream 文件流,作为接口返回值
context.TinyTaskContext 的文件 ID异步任务链路文件上传后由 SetFileId 写入,前端据此自动下载

异步任务链路下文件以阅后即焚(BurnAfterReading)方式上传,并通过任务上下文交付文件 ID,供前端自动下载。

权限校验​

组件本身不做操作权限或 MOU 校验:导出列与数据均来自上游组件,数据侧的权限已由上游(如查询集合)在取数时完成。

性能、批次与限制​

  • 支撑的类型目前仅 EXCEL,Content-Type 为 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet。
  • 单列文本上限 30000 字符,超出截断。
  • 异步任务内生成的文件为阅后即焚,下载一次即失效;同步链路直接返回内存流。
  • 数据量限制由上游查询组件控制(导出业务上限见常量 ExportCountLimit = 100000)。

异常与校验​

场景提示
未配置文件类型模板未找到
文件类型不在支持列表模板类型不支持
生成阶段遇到不支持的类型导出类型不支持