数据导出组件
数据导出组件(DataExport)用于将数据导出为 Excel 文件并返回下载结果。
概述
数据导出组件把上游传入的数据(通常是查询集合的结果)生成为 Excel 文件。组件只需配置导出文件类型与文件名,实际导出的字段与格式由上游数据决定。
组件要求紧跟在返回 List<ObjectData> 的组件之后,因为它直接从上游结果(context.CmpResult)读取待导出的数据,并据此推断导出列与文件内容。
配置项
| 配置项 | 说明 |
|---|---|
| 文件类型 | 导出文件的类型,必填,目前支持 Excel |
| 文件名 | 导出文件的名称 |
| 输出到最终结果 | 开启后该组件结果作为接口返回值 |
文件类型取值
值(ExportFileType) | 说明 |
|---|---|
Excel | Excel 文件(缺省,目前唯一取值) |
执行流程
导出列来源
组件按以下优先级确定导出哪些列、以及 sheet 名称:
| 优先级 | 触发条件 | 列来源 |
|---|---|---|
| 1 | 上下文含导入结果标记 | DicParam["ChameleonImportResultCode"] 中的列 |
| 2 | 上下文含导出列参数 | DicParam["ChameleonExportColumns"] 中的列 |
| 3 | 请求含 metaViewId | 视图列表(MetaView)未隐藏的列表项 |
| 4 | 请求含 metaFormId | 表单(MetaForm)布局中未隐藏的字段 |
| 5 | 其它(非页面进入) | 上游数据出现的字段与对象字段的交集 |
使用场景
- 报表导出
- 业务数据备份
- 数据交付
下一步
属性明细
以下内容面向技术实现与 AI 检索,说明数据导出组件的节点元数据。
所有节点
meta的取值均以字符串形式存储,数值、布尔值也以字符串表达(如"true")。
节点元数据
数据导出组件由 FlowCmpType.DataExport 标识:
| 属性名 | 类型 | 含义 | 取值/存储值 |
|---|---|---|---|
type | string | 组件类型 | 固定为 "DataExport" |
ExportFileType | string | 导出文件类型 | "Excel"(缺省) |
FileName | string | 导出文件名 | 例:"订单明细" |
IsFinalResult | string(bool) | 是否输出到最终结果 | "true" / "false" |
order | string | 同级排序 | 例:"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"]:上游数据操作对象,用于兜底推断对象。
执行步骤
- 校验(
_VerifyAsync):ExportFileType不可为空且必须在支持列表内,否则分别抛「模板未找到」/「模板类型不支持」。校验通过后进入下游校验链。 - 确定导出列:按「导出列来源」优先级依次尝试,得到
columns(FieldData列表:Code+Text)与sheetName、mainMetaObjectId。若最终对象 ID 仍为空,则用上游对象 ID 兜底。 - 生成文件:仅在
IsFinalResult = "true"时生成,同时写入context.TransferResult.List = list。 - 交付结果:区分「异步任务内」与「同步请求」两种交付方式(见下方「输出与上下文」)。
导出列与文件生成
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.List | IsFinalResult = "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)。
异常与校验
| 场景 | 提示 |
|---|---|
| 未配置文件类型 | 模板未找到 |
| 文件类型不在支持列表 | 模板类型不支持 |
| 生成阶段遇到不支持的类型 | 导出类型不支持 |