You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@inlong.apache.org by do...@apache.org on 2023/04/10 06:04:51 UTC

[inlong] branch master updated: [INLONG-7792][Manager] Support export Excel template file of StreamSource (#7793)

This is an automated email from the ASF dual-hosted git repository.

dockerzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 0694b805c [INLONG-7792][Manager] Support export Excel template file of StreamSource (#7793)
0694b805c is described below

commit 0694b805cd27e2718b430213bebd89e3f4882aa0
Author: feat <fe...@outlook.com>
AuthorDate: Mon Apr 10 14:04:45 2023 +0800

    [INLONG-7792][Manager] Support export Excel template file of StreamSource (#7793)
---
 inlong-manager/manager-common/pom.xml              |   9 +
 .../common/tool/excel/ExcelCellDataTransfer.java   |  84 ++++
 .../manager/common/tool/excel/ExcelTool.java       | 352 ++++++++++++++
 .../common/tool/excel/annotation/ExcelEntity.java  |  36 ++
 .../common/tool/excel/annotation/ExcelField.java   |  43 ++
 .../inlong/manager/pojo/stream/StreamField.java    |  10 +-
 .../web/controller/InlongStreamController.java     |  32 ++
 licenses/inlong-manager/licenses/LICENSE-poi.txt   | 537 +++++++++++++++++++++
 licenses/inlong-manager/notices/NOTICE-poi.txt     |  27 ++
 pom.xml                                            |  11 +
 10 files changed, 1140 insertions(+), 1 deletion(-)

diff --git a/inlong-manager/manager-common/pom.xml b/inlong-manager/manager-common/pom.xml
index d609001a9..66cf73923 100644
--- a/inlong-manager/manager-common/pom.xml
+++ b/inlong-manager/manager-common/pom.xml
@@ -110,6 +110,15 @@
             <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
+        <!-- poi -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelCellDataTransfer.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelCellDataTransfer.java
new file mode 100644
index 000000000..2ba3c3e2c
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelCellDataTransfer.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.tool.excel;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public enum ExcelCellDataTransfer {
+
+    DATE {
+
+        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        String parse2Text(Object cellValue) {
+            if (cellValue == null) {
+                return null;
+            } else if (cellValue instanceof Date) {
+                Date date = (Date) cellValue;
+                return this.simpleDateFormat.format(date);
+            } else {
+                return String.valueOf(cellValue);
+            }
+        }
+
+        Object parseFromText(String cellValue) {
+            if (StringUtils.isNotBlank(cellValue)) {
+                Date date = null;
+                try {
+                    date = this.simpleDateFormat.parse(cellValue);
+                } catch (ParseException e) {
+                    LOGGER.error("Can not properly parse value in Date type: " + cellValue, e);
+                }
+                return date;
+            } else {
+                return cellValue;
+            }
+        }
+    },
+    NONE {
+
+        String parse2Text(Object o) {
+            return String.valueOf(o);
+        }
+
+        Object parseFromText(String s) {
+            return s;
+        }
+    };
+    protected static final Logger LOGGER = LoggerFactory.getLogger(ExcelCellDataTransfer.class);
+
+    private ExcelCellDataTransfer() {
+    }
+
+    /**
+     * Parse the given object to text.
+     */
+
+    abstract String parse2Text(Object o);
+
+    /**
+     * Parse the given text to object.
+     */
+    abstract Object parseFromText(String s);
+}
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelTool.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelTool.java
new file mode 100644
index 000000000..b3fc3434c
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelTool.java
@@ -0,0 +1,352 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.tool.excel;
+
+import lombok.Data;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.commons.lang3.tuple.Triple;
+import org.apache.inlong.manager.common.tool.excel.annotation.ExcelEntity;
+import org.apache.inlong.manager.common.tool.excel.annotation.ExcelField;
+import org.apache.inlong.manager.common.util.Preconditions;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRichTextString;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static org.apache.inlong.manager.common.util.Preconditions.expectTrue;
+
+/**
+ * Utility class for working with Excel files.
+ */
+public class ExcelTool {
+
+    private ExcelTool() {
+
+    }
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExcelTool.class);
+    private static final int DEFAULT_COLUMN_WIDTH = 10000;
+
+    /**
+     * Extracts the header row from a given class and returns it as a list of strings.
+     */
+    public static <E> List<String> extractHeader(Class<E> e1Class) {
+        List<String> list = new LinkedList<>();
+        Field[] fields = e1Class.getDeclaredFields();
+        if (fields.length > 0) {
+            for (Field field : fields) {
+                field.setAccessible(true);
+                ExcelField excel = field.getAnnotation(ExcelField.class);
+                if (excel != null) {
+                    String excelName = excel.name();
+                    list.add(excelName);
+                }
+            }
+            return !list.isEmpty() ? list : Collections.emptyList();
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    /**
+     * Writes the given content to an Excel document.
+     *
+     * @param contents the list of contents to write
+     * @param out      the output stream to write to
+     * @throws IOException if there is an error writing to the output stream
+     */
+    public static <T> void write(List<T> contents, OutputStream out) throws IOException {
+        Preconditions.expectNotEmpty(contents, "Content can not be empty!");
+        Class<?> clazz = contents.get(0).getClass();
+        List<Map<String, String>> maps = write2List(contents);
+        doWrite(maps, clazz, out);
+    }
+
+    public static <T> void doWrite(List<Map<String, String>> maps, Class<T> clazz, OutputStream out)
+            throws IOException {
+        List<String> heads = extractHeader(clazz);
+        if (heads.isEmpty()) {
+            throw new IllegalArgumentException(
+                    "At least one field must be marked as Excel Field by annotation @ExcelField in class " + clazz);
+        }
+        try (XSSFWorkbook hwb = new XSSFWorkbook()) {
+            XSSFSheet sheet = hwb.createSheet("Sheet 1");
+
+            for (int index = 0; index < heads.size(); index++) {
+                sheet.setColumnWidth(index, DEFAULT_COLUMN_WIDTH);
+            }
+            fillSheetHeader(sheet.createRow(0), heads);
+            // Fill content if data exist.
+            if (CollectionUtils.isNotEmpty(maps)) {
+                fillSheetContent(sheet, heads, maps);
+            }
+
+            hwb.write(out);
+        }
+        out.close();
+        LOGGER.info("Database export succeeded");
+    }
+
+    /**
+     * Fills the output stream with the provided class meta.
+     */
+    public static <T> void write(Class<T> clazz, OutputStream out) throws IOException {
+        Preconditions.expectNotNull(clazz, "Class can not be empty!");
+        doWrite(null, clazz, out);
+    }
+
+    /**
+     * Fills the content rows of a given sheet with the provided content maps and headers.
+     */
+    private static void fillSheetContent(XSSFSheet sheet, List<String> heads, List<Map<String, String>> contents) {
+        Optional.ofNullable(contents)
+                .ifPresent(c -> IntStream.range(0, c.size())
+                        .forEach(lineId -> {
+                            Map<String, String> line = contents.get(lineId);
+                            Row row = sheet.createRow(lineId + 1);
+                            IntStream.range(0, heads.size()).forEach(colId -> {
+                                String title = heads.get(colId);
+                                String originValue = line.get(title);
+                                String value = StringUtils.isNotBlank(originValue) ? originValue : "";
+                                Cell cell = row.createCell(colId);
+                                cell.setCellValue(value);
+                            });
+                        }));
+    }
+
+    private static void fillSheetHeader(XSSFRow row, List<String> heads) {
+        IntStream.range(0, heads.size()).forEach(index -> {
+            XSSFCell cell = row.createCell(index);
+            cell.setCellValue(new XSSFRichTextString(heads.get(index)));
+        });
+    }
+
+    /**
+     * Convert a list of objects to a list of maps, where each map represents an object's fields and values.
+     *
+     * @param objects The list of objects to be converted.
+     * @param <E>     The type of the objects to be converted.
+     * @return A list of maps, where each map represents an object's fields and values.
+     */
+    public static <E> List<Map<String, String>> write2List(List<E> objects) {
+        E firstInstance = objects.get(0);
+        Class<?> firstClass = firstInstance.getClass();
+        Field[] fields = firstClass.getDeclaredFields();
+        expectTrue(fields.length > 0, "No method was found in the class '" + firstClass.getSimpleName() + "'");
+
+        List<Triple<Field, String, ExcelCellDataTransfer>> fieldMeta = Arrays.stream(fields).map(field -> {
+            field.setAccessible(true);
+            return Pair.of(field, field.getAnnotation(ExcelField.class));
+        }).filter(p -> p.getRight() != null)
+                .map(p -> Triple.of(p.getLeft(), p.getRight().name(), p.getRight().x2oTransfer()))
+                .collect(Collectors.toList());
+
+        return objects.stream()
+                .map(obj -> fieldMeta.stream().map(fm -> {
+                    Object fieldValue;
+                    try {
+                        fieldValue = fm.getLeft().get(obj);
+                    } catch (IllegalAccessException e) {
+                        return null;
+                    }
+                    String value = fm.getRight().parse2Text(fieldValue);
+                    String name = fm.getMiddle();
+                    return Pair.of(name, value);
+                })
+                        .filter(Objects::nonNull)
+                        .collect(Collectors.toMap(Pair::getKey, Pair::getValue)))
+                .collect(Collectors.toList());
+    }
+
+    @Data
+    static class ClassFieldMeta implements Serializable {
+
+        /**
+         * The name of the field
+         */
+        private String name;
+
+        /**
+         * The name of the field in the Excel sheet
+         */
+        private String excelName;
+
+        /**
+         * The type of the field
+         */
+        private Class<?> fieldType;
+
+        /**
+         * The data transfer for the cell
+         */
+        private ExcelCellDataTransfer cellDataTransfer;
+
+        /**
+         * The field object
+         */
+        private transient Field filed;
+
+        /**
+         * The meta of class file.
+         */
+        public ClassFieldMeta() {
+            // build meta
+        }
+    }
+
+    /**
+     * The ClassMeta class represents the metadata of a class that is used to import data from an Excel sheet.
+     */
+    @Data
+    static class ClassMeta<T> {
+
+        /**
+         * The name of the class.
+         */
+        private String name;
+
+        /**
+         * The template class.
+         */
+        private Class<T> tClass;
+
+        /**
+         * The metadata of the fields in the class.
+         */
+        private List<ClassFieldMeta> classFieldMetas;
+
+        /**
+         * The mapping of field names to their metadata.
+         */
+        private Map<String, ClassFieldMeta> fieldNameMetaMap;
+
+        /**
+         * The mapping of Excel names to their metadata.
+         */
+        private Map<String, ClassFieldMeta> excelNameMetaMap;
+
+        /**
+         * Whether the fields have been sorted.
+         */
+        private boolean isSorted = false;
+
+        /**
+         * The mapping of positions to their metadata.
+         */
+        private Map<Integer, ClassFieldMeta> positionFieldMetaMap;
+
+        /**
+         * The method to set whether the Excel data is valid.
+         */
+        private Method excelDataValidMethod;
+
+        /**
+         * The method to set the validation information of the Excel data.
+         */
+        private Method excelDataValidateInfoMethod;
+
+        private ClassMeta() {
+        }
+
+        /**
+         * Create a ClassMeta object from a given template class.
+         */
+        public static <T> ClassMeta<T> of(Class<T> templateClass)
+                throws InstantiationException, IllegalAccessException, NoSuchMethodException {
+            ClassMeta<T> meta = new ClassMeta<>();
+            meta.setTClass(templateClass);
+            ExcelEntity excelEntity = templateClass.getAnnotation(ExcelEntity.class);
+            if (excelEntity != null) {
+                meta.name = excelEntity.name();
+            }
+
+            Field[] fields = templateClass.getDeclaredFields();
+            for (Field field : fields) {
+                ExcelField excelField = field.getAnnotation(ExcelField.class);
+                if (excelField != null) {
+                    ExcelCellDataTransfer excelCellDataTransfer = excelField.x2oTransfer();
+                    meta.addField(field.getName(), excelField.name(), field, field.getType(),
+                            excelCellDataTransfer);
+                }
+            }
+
+            Method excelDataValid = templateClass.getMethod("setExcelDataValid", Boolean.TYPE);
+            Method excelDataValidateInfo = templateClass.getMethod("setExcelDataValidate", String.class);
+            meta.setExcelDataValidMethod(excelDataValid);
+            meta.setExcelDataValidateInfoMethod(excelDataValidateInfo);
+            return meta;
+        }
+
+        private void addField(String name, String excelName, Field field, Class<?> fieldType,
+                ExcelCellDataTransfer cellDataTransfer) {
+            if (this.classFieldMetas == null) {
+                this.classFieldMetas = new ArrayList<>();
+            }
+
+            if (this.excelNameMetaMap == null) {
+                this.excelNameMetaMap = new HashMap<>();
+            }
+
+            if (this.fieldNameMetaMap == null) {
+                this.fieldNameMetaMap = new HashMap<>();
+            }
+
+            ClassFieldMeta fieldMeta = new ClassFieldMeta();
+            fieldMeta.setName(name);
+            fieldMeta.setExcelName(excelName);
+            fieldMeta.setFieldType(fieldType);
+            fieldMeta.setCellDataTransfer(cellDataTransfer);
+            fieldMeta.setFiled(field);
+            this.fieldNameMetaMap.put(name, fieldMeta);
+            this.excelNameMetaMap.put(excelName, fieldMeta);
+            this.classFieldMetas.add(fieldMeta);
+        }
+
+        /**
+         * Get the metadata of a field at a given position.
+         */
+        public ClassFieldMeta field(int position) {
+            return this.positionFieldMetaMap.get(position);
+        }
+
+    }
+}
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelEntity.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelEntity.java
new file mode 100644
index 000000000..2ef5a9d4a
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelEntity.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.tool.excel.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for Excel entity
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelEntity {
+
+    /**
+     * Name of the Excel entity
+     */
+    String name();
+}
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelField.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelField.java
new file mode 100644
index 000000000..3214504cb
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelField.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.tool.excel.annotation;
+
+import org.apache.inlong.manager.common.tool.excel.ExcelCellDataTransfer;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for Excel field
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelField {
+
+    /**
+     * Name of the field in Excel
+     */
+    String name();
+
+    /**
+     * Data transfer method from Excel to Object
+     */
+    ExcelCellDataTransfer x2oTransfer() default ExcelCellDataTransfer.NONE;
+}
diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/StreamField.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/StreamField.java
index fd86362da..45a8c06c6 100644
--- a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/StreamField.java
+++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/StreamField.java
@@ -23,6 +23,10 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.inlong.manager.common.tool.excel.annotation.ExcelEntity;
+import org.apache.inlong.manager.common.tool.excel.annotation.ExcelField;
+
+import java.io.Serializable;
 
 /**
  * Stream filed, including field name, field type, etc.
@@ -32,7 +36,8 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 @AllArgsConstructor
 @ApiModel("Stream field configuration")
-public class StreamField {
+@ExcelEntity(name = "StreamField excel template")
+public class StreamField implements Serializable {
 
     @ApiModelProperty("Field index")
     private Integer id;
@@ -43,12 +48,15 @@ public class StreamField {
     @ApiModelProperty(value = "inlong stream id", required = true)
     private String inlongStreamId;
 
+    @ExcelField(name = "Field name")
     @ApiModelProperty(value = "Field name", required = true)
     private String fieldName;
 
+    @ExcelField(name = "Field type")
     @ApiModelProperty(value = "Field type", required = true)
     private String fieldType;
 
+    @ExcelField(name = "Field comment")
     @ApiModelProperty("Field comment")
     private String fieldComment;
 
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
index ba39c6510..3e41371ff 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
@@ -22,7 +22,12 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpHeaders;
+import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
 import org.apache.inlong.manager.common.enums.OperationType;
+import org.apache.inlong.manager.common.exceptions.BusinessException;
+import org.apache.inlong.manager.common.tool.excel.ExcelTool;
 import org.apache.inlong.manager.common.validation.UpdateValidation;
 import org.apache.inlong.manager.pojo.common.PageResult;
 import org.apache.inlong.manager.pojo.common.Response;
@@ -38,6 +43,7 @@ import org.apache.inlong.manager.service.stream.InlongStreamProcessService;
 import org.apache.inlong.manager.service.stream.InlongStreamService;
 import org.apache.inlong.manager.service.user.LoginUserUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -46,11 +52,17 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 /**
  * Inlong stream control layer
  */
+@Slf4j
 @RestController
 @RequestMapping("/api")
 @Api(tags = "Inlong-Stream-API")
@@ -183,4 +195,24 @@ public class InlongStreamController {
         return Response.success(streamService.parseFields(parseFieldRequest));
     }
 
+    @RequestMapping(value = "/stream/fieldsImportTemplate", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+    @ApiOperation(value = "Download fields import template", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+    public void downloadFieldsImportTemplate(HttpServletResponse response) {
+        String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss"));
+        String fileName = String.format("InLong-stream-fields-template-%s.xlsx", date);
+        response.setHeader("Content-Disposition",
+                "attachment;filename=" + fileName);
+        response.setHeader(HttpHeaders.CONTENT_TYPE,
+                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+
+        try {
+            ServletOutputStream outputStream = response.getOutputStream();
+            ExcelTool.write(StreamField.class, outputStream);
+        } catch (IOException e) {
+            log.error("Can not properly download Excel file", e);
+            throw new BusinessException(ErrorCodeEnum.INVALID_PARAMETER,
+                    String.format("can not properly download template file: %s", e.getMessage()));
+        }
+    }
+
 }
diff --git a/licenses/inlong-manager/licenses/LICENSE-poi.txt b/licenses/inlong-manager/licenses/LICENSE-poi.txt
new file mode 100644
index 000000000..f86de8779
--- /dev/null
+++ b/licenses/inlong-manager/licenses/LICENSE-poi.txt
@@ -0,0 +1,537 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+APACHE POI SUBCOMPONENTS:
+
+Apache POI includes subcomponents with separate copyright notices and
+license terms. Your use of these subcomponents is subject to the terms
+and conditions of the following licenses:
+
+
+Office Open XML schemas (ooxml-schemas-1.*.jar)
+
+    The Office Open XML schema definitions used by Apache POI are
+    a part of the Office Open XML ECMA Specification (ECMA-376, [1]).
+    As defined in section 9.4 of the ECMA bylaws [2], this specification
+    is available to all interested parties without restriction:
+
+        9.4 All documents when approved shall be made available to
+            all interested parties without restriction.
+
+    Furthermore, both Microsoft and Adobe have granted patent licenses
+    to this work [3,4,5].
+
+    [1] http://www.ecma-international.org/publications/standards/Ecma-376.htm
+    [2] http://www.ecma-international.org/memento/Ecmabylaws.htm
+    [3] http://www.microsoft.com/openspecifications/en/us/programs/osp/default.aspx
+    [4] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/
+        Patent%20statements%20ok/ECMA-376%20Edition%202%20Microsoft%20Patent%20Declaration.pdf
+    [5] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/
+        Patent%20statements%20ok/ECMA-376%20Adobe%20Patent%20Declaration.pdf
+
+
+Bouncy Castle library (bcprov-*.jar, bcpg-*.jar, bcpkix-*.jar)
+
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to
+    deal in the Software without restriction, including without limitation the
+    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+    sell copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+    IN THE SOFTWARE.
+
+JUnit test library (junit-4.*.jar) & JaCoCo (*jacoco*)
+
+    Eclipse Public License - v 1.0
+
+    THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
+    LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+    CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+    1. DEFINITIONS
+
+    "Contribution" means:
+
+    a) in the case of the initial Contributor, the initial code and documentation
+       distributed under this Agreement, and
+    b) in the case of each subsequent Contributor:
+    i) changes to the Program, and
+    ii) additions to the Program;
+    where such changes and/or additions to the Program originate from and are
+    distributed by that particular Contributor. A Contribution 'originates' from
+    a Contributor if it was added to the Program by such Contributor itself or
+    anyone acting on such Contributor's behalf. Contributions do not include
+    additions to the Program which: (i) are separate modules of software
+    distributed in conjunction with the Program under their own license agreement,
+    and (ii) are not derivative works of the Program.
+
+    "Contributor" means any person or entity that distributes the Program.
+
+    "Licensed Patents" mean patent claims licensable by a Contributor which are
+    necessarily infringed by the use or sale of its Contribution alone or when
+    combined with the Program.
+
+    "Program" means the Contributions distributed in accordance with this Agreement.
+
+    "Recipient" means anyone who receives the Program under this Agreement,
+    including all Contributors.
+
+    2. GRANT OF RIGHTS
+
+    a) Subject to the terms of this Agreement, each Contributor hereby grants
+       Recipient a non-exclusive, worldwide, royalty-free copyright license to
+       reproduce, prepare derivative works of, publicly display, publicly
+       perform, distribute and sublicense the Contribution of such Contributor,
+       if any, and such derivative works, in source code and object code form.
+    b) Subject to the terms of this Agreement, each Contributor hereby grants
+       Recipient a non-exclusive, worldwide, royalty-free patent license under
+       Licensed Patents to make, use, sell, offer to sell, import and otherwise
+       transfer the Contribution of such Contributor, if any, in source code
+       and object code form. This patent license shall apply to the combination
+       of the Contribution and the Program if, at the time the Contribution is
+       added by the Contributor, such addition of the Contribution causes such
+       combination to be covered by the Licensed Patents. The patent license
+       shall not apply to any other combinations which include the Contribution.
+       No hardware per se is licensed hereunder.
+    c) Recipient understands that although each Contributor grants the licenses
+       to its Contributions set forth herein, no assurances are provided by any
+       Contributor that the Program does not infringe the patent or other
+       intellectual property rights of any other entity. Each Contributor
+       disclaims any liability to Recipient for claims brought by any other
+       entity based on infringement of intellectual property rights or
+       otherwise. As a condition to exercising the rights and licenses granted
+       hereunder, each Recipient hereby assumes sole responsibility to secure
+       any other intellectual property rights needed, if any. For example, if
+       a third party patent license is required to allow Recipient to distribute
+       the Program, it is Recipient's responsibility to acquire that license
+       before distributing the Program.
+    d) Each Contributor represents that to its knowledge it has sufficient
+       copyright rights in its Contribution, if any, to grant the copyright
+       license set forth in this Agreement.
+
+    3. REQUIREMENTS
+
+    A Contributor may choose to distribute the Program in object code form under
+    its own license agreement, provided that:
+
+    a) it complies with the terms and conditions of this Agreement; and
+    b) its license agreement:
+    i) effectively disclaims on behalf of all Contributors all warranties and
+       conditions, express and implied, including warranties or conditions of
+       title and non-infringement, and implied warranties or conditions of
+       merchantability and fitness for a particular purpose;
+    ii) effectively excludes on behalf of all Contributors all liability for
+       damages, including direct, indirect, special, incidental and
+       consequential damages, such as lost profits;
+    iii) states that any provisions which differ from this Agreement are
+       offered by that Contributor alone and not by any other party; and
+    iv) states that source code for the Program is available from such
+       Contributor, and informs licensees how to obtain it in a reasonable
+       manner on or through a medium customarily used for software exchange.
+
+    When the Program is made available in source code form:
+
+    a) it must be made available under this Agreement; and
+    b) a copy of this Agreement must be included with each copy of the Program.
+       Contributors may not remove or alter any copyright notices contained
+       within the Program.
+
+    Each Contributor must identify itself as the originator of its Contribution,
+    if any, in a manner that reasonably allows subsequent Recipients to identify
+    the originator of the Contribution.
+
+    4. COMMERCIAL DISTRIBUTION
+
+    Commercial distributors of software may accept certain responsibilities with
+    respect to end users, business partners and the like. While this license is
+    intended to facilitate the commercial use of the Program, the Contributor
+    who includes the Program in a commercial product offering should do so in a
+    manner which does not create potential liability for other Contributors.
+    Therefore, if a Contributor includes the Program in a commercial product
+    offering, such Contributor ("Commercial Contributor") hereby agrees to
+    defend and indemnify every other Contributor ("Indemnified Contributor")
+    against any losses, damages and costs (collectively "Losses") arising from
+    claims, lawsuits and other legal actions brought by a third party against
+    the Indemnified Contributor to the extent caused by the acts or omissions
+    of such Commercial Contributor in connection with its distribution of the
+    Program in a commercial product offering. The obligations in this section
+    do not apply to any claims or Losses relating to any actual or alleged
+    intellectual property infringement. In order to qualify, an Indemnified
+    Contributor must: a) promptly notify the Commercial Contributor in writing
+    of such claim, and b) allow the Commercial Contributor to control, and
+    cooperate with the Commercial Contributor in, the defense and any related
+    settlement negotiations. The Indemnified Contributor may participate in any
+    such claim at its own expense.
+
+    For example, a Contributor might include the Program in a commercial product
+    offering, Product X. That Contributor is then a Commercial Contributor. If
+    that Commercial Contributor then makes performance claims, or offers
+    warranties related to Product X, those performance claims and warranties are
+    such Commercial Contributor's responsibility alone. Under this section, the
+    Commercial Contributor would have to defend claims against the other
+    Contributors related to those performance claims and warranties, and if a
+    court requires any other Contributor to pay any damages as a result, the
+    Commercial Contributor must pay those damages.
+
+    5. NO WARRANTY
+
+    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON
+    AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
+    EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
+    CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
+    PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the
+    appropriateness of using and distributing the Program and assumes all risks
+    associated with its exercise of rights under this Agreement , including but
+    not limited to the risks and costs of program errors, compliance with
+    applicable laws, damage to or loss of data, programs or equipment, and
+    unavailability or interruption of operations.
+
+    6. DISCLAIMER OF LIABILITY
+
+    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+    CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
+    LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+    ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
+    EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
+    OF SUCH DAMAGES.
+
+    7. GENERAL
+
+    If any provision of this Agreement is invalid or unenforceable under
+    applicable law, it shall not affect the validity or enforceability of the
+    remainder of the terms of this Agreement, and without further action by the
+    parties hereto, such provision shall be reformed to the minimum extent
+    necessary to make such provision valid and enforceable.
+
+    If Recipient institutes patent litigation against any entity (including a
+    cross-claim or counterclaim in a lawsuit) alleging that the Program itself
+    (excluding combinations of the Program with other software or hardware)
+    infringes such Recipient's patent(s), then such Recipient's rights granted
+    under Section 2(b) shall terminate as of the date such litigation is filed.
+
+    All Recipient's rights under this Agreement shall terminate if it fails to
+    comply with any of the material terms or conditions of this Agreement and
+    does not cure such failure in a reasonable period of time after becoming
+    aware of such noncompliance. If all Recipient's rights under this Agreement
+    terminate, Recipient agrees to cease use and distribution of the Program as
+    soon as reasonably practicable. However, Recipient's obligations under this
+    Agreement and any licenses granted by Recipient relating to the Program
+    shall continue and survive.
+
+    Everyone is permitted to copy and distribute copies of this Agreement, but
+    in order to avoid inconsistency the Agreement is copyrighted and may only
+    be modified in the following manner. The Agreement Steward reserves the
+    right to publish new versions (including revisions) of this Agreement from
+    time to time. No one other than the Agreement Steward has the right to
+    modify this Agreement. The Eclipse Foundation is the initial Agreement
+    Steward. The Eclipse Foundation may assign the responsibility to serve as
+    the Agreement Steward to a suitable separate entity. Each new version of
+    the Agreement will be given a distinguishing version number. The Program
+    (including Contributions) may always be distributed subject to the version
+    of the Agreement under which it was received. In addition, after a new
+    version of the Agreement is published, Contributor may elect to distribute
+    the Program (including its Contributions) under the new version. Except as
+    expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+    rights or licenses to the intellectual property of any Contributor under
+    this Agreement, whether expressly, by implication, estoppel or otherwise.
+    All rights in the Program not expressly granted under this Agreement are
+    reserved.
+
+    This Agreement is governed by the laws of the State of New York and the
+    intellectual property laws of the United States of America. No party to this
+    Agreement will bring a legal action under this Agreement more than one year
+    after the cause of action arose. Each party waives its rights to a jury
+    trial in any resulting litigation.
+
+Hamcrest library (hamcrest-*.jar) & CuvesAPI / Curve API
+
+    BSD License
+
+    Copyright (c) 2000-2006, www.hamcrest.org
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are met:
+
+    Redistributions of source code must retain the above copyright notice, this
+    list of conditions and the following disclaimer. Redistributions in binary
+    form must reproduce the above copyright notice, this list of conditions and
+    the following disclaimer in the documentation and/or other materials
+    provided with the distribution.
+
+    Neither the name of Hamcrest nor the names of its contributors may be used
+    to endorse or promote products derived from this software without specific
+    prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+    POSSIBILITY OF SUCH DAMAGE.
+
+SLF4J library (slf4j-api-*.jar)
+
+    Copyright (c) 2004-2013 QOS.ch
+    All rights reserved.
+
+    Permission is hereby granted, free  of charge, to any person obtaining
+    a  copy  of this  software  and  associated  documentation files  (the
+    "Software"), to  deal in  the Software without  restriction, including
+    without limitation  the rights to  use, copy, modify,  merge, publish,
+    distribute,  sublicense, and/or sell  copies of  the Software,  and to
+    permit persons to whom the Software  is furnished to do so, subject to
+    the following conditions:
+
+    The  above  copyright  notice  and  this permission  notice  shall  be
+    included in all copies or substantial portions of the Software.
+
+    THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+    EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+    MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+    OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+inbot-utils (https://github.com/Inbot/inbot-utils)
+
+	The MIT License (MIT)
+
+	Copyright (c) 2015 Inbot
+
+	Permission is hereby granted, free of charge, to any person obtaining a copy
+	of this software and associated documentation files (the "Software"), to deal
+	in the Software without restriction, including without limitation the rights
+	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+	copies of the Software, and to permit persons to whom the Software is
+	furnished to do so, subject to the following conditions:
+
+	The above copyright notice and this permission notice shall be included in all
+	copies or substantial portions of the Software.
+
+	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+	SOFTWARE.
\ No newline at end of file
diff --git a/licenses/inlong-manager/notices/NOTICE-poi.txt b/licenses/inlong-manager/notices/NOTICE-poi.txt
new file mode 100644
index 000000000..f35157177
--- /dev/null
+++ b/licenses/inlong-manager/notices/NOTICE-poi.txt
@@ -0,0 +1,27 @@
+Apache POI
+Copyright 2003-2017 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (https://www.apache.org/).
+
+This product contains parts that were originally based on software from BEA.
+Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/> (dead link),
+which was acquired by Oracle Corporation in 2008.
+<http://www.oracle.com/us/corporate/Acquisitions/bea/index.html>
+<https://en.wikipedia.org/wiki/BEA_Systems>
+
+This product contains W3C XML Schema documents. Copyright 2001-2003 (c)
+World Wide Web Consortium (Massachusetts Institute of Technology, European
+Research Consortium for Informatics and Mathematics, Keio University)
+
+This product contains the Piccolo XML Parser for Java
+(http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.
+
+This product contains the chunks_parse_cmds.tbl file from the vsdump program.
+Copyright (C) 2006-2007 Valek Filippov (frob@df.ru)
+
+This product contains parts of the eID Applet project 
+<http://eid-applet.googlecode.com> and <https://github.com/e-Contract/eid-applet>.
+Copyright (c) 2009-2014
+FedICT (federal ICT department of Belgium), e-Contract.be BVBA (https://www.e-contract.be),
+Bart Hanssens from FedICT
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 98199c159..7ed289766 100644
--- a/pom.xml
+++ b/pom.xml
@@ -207,6 +207,7 @@
         <kudu.version>1.16.0</kudu.version>
         <tomcat.version>8.5.53</tomcat.version>
         <jedis.version>2.9.0</jedis.version>
+        <poi.version>3.16</poi.version>
     </properties>
 
     <dependencyManagement>
@@ -1546,6 +1547,16 @@
                 <artifactId>kubernetes-client</artifactId>
                 <version>${kubernetes.client.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>