From 381b95cadb9d45326e6f45f403443342eff50068 Mon Sep 17 00:00:00 2001
From: jsbjfkbsjk <2504892220@qq.com>
Date: Fri, 5 Sep 2025 11:46:14 +0800
Subject: [PATCH 1/8] =?UTF-8?q?=E6=8A=8A=E6=8F=90=E5=8F=96=E5=88=86?=
=?UTF-8?q?=E6=9E=90excel=E6=96=87=E4=BB=B6=E7=9A=84=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E5=81=9A=E4=BA=86=E6=8F=92=E4=BB=B6=E5=8C=96=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../plugins/aipp-file-extract-excel/pom.xml | 89 +++++++++++
.../aipp/file/extract/ExcelFileExtractor.java | 142 ++++++++++++++++++
.../src/main/resources/application.yml | 4 +
.../file/extract/ExcelFileExtractorTest.java | 39 +++++
.../src/test/resources/file/content.xlsx | Bin 0 -> 9434 bytes
.../plugins/aipp-file-extract-service/pom.xml | 57 +++++++
.../file/extract/AbstractFileExtractor.java | 27 ++++
.../aipp/file/extract/FileTypeConstant.java | 24 +++
app-builder/plugins/aipp-plugin/pom.xml | 10 ++
.../service/impl/OperatorServiceImpl.java | 76 ++--------
.../aipp/tool/FileExtractorContainer.java | 39 +++++
.../jober/aipp/tool/FileTypeConvertor.java | 29 ++++
.../aipp/service/OperatorServiceImplTest.java | 7 +-
app-builder/plugins/pom.xml | 2 +
common/dependency/pom.xml | 17 +++
15 files changed, 492 insertions(+), 70 deletions(-)
create mode 100644 app-builder/plugins/aipp-file-extract-excel/pom.xml
create mode 100644 app-builder/plugins/aipp-file-extract-excel/src/main/java/modelengine/fit/jade/aipp/file/extract/ExcelFileExtractor.java
create mode 100644 app-builder/plugins/aipp-file-extract-excel/src/main/resources/application.yml
create mode 100644 app-builder/plugins/aipp-file-extract-excel/src/test/java/modelengine/fit/jade/aipp/file/extract/ExcelFileExtractorTest.java
create mode 100644 app-builder/plugins/aipp-file-extract-excel/src/test/resources/file/content.xlsx
create mode 100644 app-builder/plugins/aipp-file-extract-service/pom.xml
create mode 100644 app-builder/plugins/aipp-file-extract-service/src/main/java/modelengine/fit/jade/aipp/file/extract/AbstractFileExtractor.java
create mode 100644 app-builder/plugins/aipp-file-extract-service/src/main/java/modelengine/fit/jade/aipp/file/extract/FileTypeConstant.java
create mode 100644 app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/tool/FileExtractorContainer.java
create mode 100644 app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/tool/FileTypeConvertor.java
diff --git a/app-builder/plugins/aipp-file-extract-excel/pom.xml b/app-builder/plugins/aipp-file-extract-excel/pom.xml
new file mode 100644
index 0000000000..5712a12111
--- /dev/null
+++ b/app-builder/plugins/aipp-file-extract-excel/pom.xml
@@ -0,0 +1,89 @@
+
+
+ 4.0.0
+
+ modelengine.fit.jade
+ app-builder-plugin-parent
+ 1.0.0-SNAPSHOT
+
+
+ aipp-file-extract-excel
+
+
+
+
+ org.fitframework
+ fit-api
+
+
+ org.fitframework
+ fit-util
+
+
+ cn.idev.excel
+ fastexcel
+
+
+ modelengine.fit.jade
+ aipp-file-extract-service
+
+
+ org.junit.jupiter
+ junit-jupiter
+
+
+ org.fitframework
+ fit-test-framework
+
+
+ org.assertj
+ assertj-core
+
+
+
+
+
+
+ org.fitframework
+ fit-build-maven-plugin
+ ${fit.version}
+
+
+ build-plugin
+
+ build-plugin
+
+
+
+ package-plugin
+
+ package-plugin
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ ${maven.antrun.version}
+
+
+ install
+
+
+
+
+
+
+ run
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-builder/plugins/aipp-file-extract-excel/src/main/java/modelengine/fit/jade/aipp/file/extract/ExcelFileExtractor.java b/app-builder/plugins/aipp-file-extract-excel/src/main/java/modelengine/fit/jade/aipp/file/extract/ExcelFileExtractor.java
new file mode 100644
index 0000000000..ac0e783ce5
--- /dev/null
+++ b/app-builder/plugins/aipp-file-extract-excel/src/main/java/modelengine/fit/jade/aipp/file/extract/ExcelFileExtractor.java
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
+ * This file is a part of the ModelEngine Project.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+package modelengine.fit.jade.aipp.file.extract;
+
+import cn.idev.excel.ExcelReader;
+import cn.idev.excel.FastExcel;
+import cn.idev.excel.context.AnalysisContext;
+import cn.idev.excel.converters.Converter;
+import cn.idev.excel.enums.CellDataTypeEnum;
+import cn.idev.excel.metadata.GlobalConfiguration;
+import cn.idev.excel.metadata.data.DataFormatData;
+import cn.idev.excel.metadata.data.ReadCellData;
+import cn.idev.excel.metadata.property.ExcelContentProperty;
+import cn.idev.excel.read.listener.ReadListener;
+import cn.idev.excel.read.metadata.ReadSheet;
+import cn.idev.excel.util.DateUtils;
+import modelengine.fitframework.annotation.Component;
+import modelengine.fitframework.annotation.Fitable;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+public class ExcelFileExtractor implements AbstractFileExtractor {
+
+ private static String getCellValueAsString(ReadCellData> cell) {
+ switch (cell.getType()) {
+ case STRING:
+ return cell.getStringValue();
+ case NUMBER:
+ DataFormatData fmt = cell.getDataFormatData();
+ short formatIndex = fmt.getIndex();
+ String formatString = fmt.getFormat();
+ if (DateUtils.isADateFormat(formatIndex, formatString)) {
+ double value = cell.getNumberValue().doubleValue();
+ Date date = DateUtils.getJavaDate(value, true);
+ return new SimpleDateFormat("yyyy-MM-dd").format(date);
+ } else {
+ BigDecimal num = cell.getNumberValue();
+ return num.stripTrailingZeros().toPlainString();
+ }
+ case BOOLEAN:
+ return Boolean.toString(cell.getBooleanValue());
+ default:
+ return "";
+ }
+ }
+
+ @Override
+ @Fitable(id = "get-fileType-excel")
+ public FileTypeConstant.FileType supportedFileType() {
+ return FileTypeConstant.FileType.EXCEL;
+ }
+
+ /**
+ * 从指定路径的 Excel 文件中提取内容,并返回为字符串形式。
+ * 实现方式:
+ * 基于 fast-excel 包,使用流式读取(ReadListener)逐行解析,避免一次性加载整表造成的内存开销。
+ * 每行数据会被转换为以制表符(\t)分隔的文本,并在行末追加换行符。
+ * 支持多 sheet 解析,会依次读取工作簿中的每一个 sheet。
+ *
+ * @param fileUrl 表示文件路径的 {@link String}.
+ * @return 表示文件内容的 {@link String}。
+ * @throws RuntimeException 当文件读取或解析失败时抛出
+ */
+ @Override
+ @Fitable(id = "extract-file-excel")
+ public String extractFile(String fileUrl) {
+ File file = Paths.get(fileUrl).toFile();
+ StringBuilder excelContent = new StringBuilder();
+ ReadListener