Skip to content

Commit 8ec5b8a

Browse files
committed
修改格式和健壮性处理
1 parent 4a2dc21 commit 8ec5b8a

File tree

5 files changed

+59
-25
lines changed

5 files changed

+59
-25
lines changed

app-builder/plugins/aipp-file-extract-excel/src/main/java/modelengine/fit/jade/aipp/file/extract/ExcelFileExtractor.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import cn.idev.excel.read.listener.ReadListener;
1919
import cn.idev.excel.read.metadata.ReadSheet;
2020
import cn.idev.excel.util.DateUtils;
21+
import cn.idev.excel.util.StringUtils;
22+
import lombok.NonNull;
2123
import modelengine.fit.jober.aipp.service.OperatorService;
2224
import modelengine.fitframework.annotation.Component;
2325
import modelengine.fitframework.annotation.Fitable;
@@ -45,22 +47,20 @@
4547
* @since 2025-09-06
4648
*/
4749
@Component
48-
public class ExcelFileExtractor implements FileExtraction {
50+
public class ExcelFileExtractor implements FileExtractor {
4951
/**
5052
* 把单元格转换成格式化字符串。
5153
*
5254
* @param cell 表示单元格数据 {@link ReadCellData}。
5355
* @return 转换后的内容 {@link String}。
5456
*/
55-
private static String getCellValueAsString(ReadCellData<?> cell) {
57+
private static String getCellValueAsString(@NonNull ReadCellData<?> cell) {
5658
switch (cell.getType()) {
5759
case STRING:
5860
return cell.getStringValue();
5961
case NUMBER:
6062
DataFormatData fmt = cell.getDataFormatData();
61-
short formatIndex = fmt.getIndex();
62-
String formatString = fmt.getFormat();
63-
if (DateUtils.isADateFormat(formatIndex, formatString)) {
63+
if (DateUtils.isADateFormat(fmt.getIndex(), fmt.getFormat())) {
6464
double value = cell.getNumberValue().doubleValue();
6565
Date date = DateUtils.getJavaDate(value, true);
6666
return new SimpleDateFormat("yyyy-MM-dd").format(date);
@@ -82,13 +82,15 @@ private static String getCellValueAsString(ReadCellData<?> cell) {
8282
*/
8383
@Override
8484
@Fitable(id = "get-fileType-excel")
85-
public List<String> supportedFileType() {
85+
public List<String> supportedFileTypes() {
8686
return Arrays.asList(OperatorService.FileType.EXCEL.toString(), OperatorService.FileType.CSV.toString());
8787
}
8888

8989
/**
90+
* 判断文件路径是否有效
91+
*
9092
* @param fileUrl 表示文件路径 {@link String}。
91-
* @return 表示路径是否有效 {@link Boolean}。
93+
* @return 表示路径是否有效 {@code boolean}。
9294
*/
9395
private boolean isValidPath(String fileUrl) {
9496
try {
@@ -109,7 +111,7 @@ private boolean isValidPath(String fileUrl) {
109111
@Fitable(id = "extract-file-excel")
110112
public String extractFile(String fileUrl) {
111113
if (!isValidPath(fileUrl)) {
112-
throw new IllegalArgumentException("无效的文件路径: " + fileUrl);
114+
throw new IllegalArgumentException("Invalid FilePath" + fileUrl);
113115
}
114116
File file = Paths.get(fileUrl).toFile();
115117
StringBuilder excelContent = new StringBuilder();
@@ -129,7 +131,7 @@ public String extractFile(String fileUrl) {
129131
}
130132
excelContent.append('\n');
131133
} catch (IOException e) {
132-
throw new IllegalStateException("Excel文件读取失败", e);
134+
throw new IllegalStateException("Fail To Extract Excel File", e);
133135
} finally {
134136
if (reader != null) {
135137
reader.finish(); // 关闭资源
@@ -142,7 +144,7 @@ public String extractFile(String fileUrl) {
142144
* 读取监听器的内部类实现。
143145
*/
144146
private class ExcelReadListener implements ReadListener<Map<Integer, String>> {
145-
StringBuilder excelContent;
147+
private final StringBuilder excelContent;
146148

147149
ExcelReadListener(StringBuilder excelContent) {
148150
this.excelContent = excelContent;
@@ -159,8 +161,7 @@ public void invoke(Map<Integer, String> data, AnalysisContext context) {
159161
}
160162

161163
@Override
162-
public void doAfterAllAnalysed(AnalysisContext context) {
163-
}
164+
public void doAfterAllAnalysed(AnalysisContext context) {}
164165
}
165166

166167
/**
@@ -181,7 +182,7 @@ public CellDataTypeEnum supportExcelTypeKey() {
181182
@Override
182183
public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
183184
GlobalConfiguration globalConfiguration) {
184-
return getCellValueAsString(cellData);
185+
return (cellData != null) ? getCellValueAsString(cellData) : StringUtils.EMPTY;
185186
}
186187
}
187188
}

app-builder/plugins/aipp-file-extract-excel/src/test/java/modelengine/fit/jade/aipp/file/extract/ExcelFileExtractorTest.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class ExcelFileExtractorTest {
3838
void supportedFileType() {
3939
List<String> supportedTypes =
4040
Arrays.asList(OperatorService.FileType.EXCEL.toString(), OperatorService.FileType.CSV.toString());
41-
assertThat(this.excelFileExtractor.supportedFileType()).isEqualTo(supportedTypes);
41+
assertThat(this.excelFileExtractor.supportedFileTypes()).isEqualTo(supportedTypes);
4242
}
4343

4444
@Test
@@ -53,7 +53,23 @@ void validPath() {
5353
@DisplayName("测试 excel 文件提取成功")
5454
void extractFile() {
5555
File file = new File(this.getClass().getClassLoader().getResource("file/content.csv").getFile());
56-
assertThat(this.excelFileExtractor.extractFile(file.getAbsolutePath())).isEqualTo(
57-
"Sheet 1:\nThis is an excel test\n\n");
56+
assertThat(this.excelFileExtractor.extractFile(file.getAbsolutePath())).isEqualTo(expected);
5857
}
58+
59+
String expected = """
60+
Sheet 1:
61+
This is an excel test
62+
ID\tName\tAge\tJoinDate\tActive\tSalary\tDepartment\tNotes
63+
1\tJohn Doe\t25\t2023-01-15\tTRUE\t8000.50\tIT\tRegular employee
64+
2\tJane Smith\t30\t2022-05-20\tTRUE\t12000.00\tMarketing\tTeam leader
65+
3\tBob Johnson\t28\t2023-03-10\tFALSE\t7500.00\tSales\tLeft company
66+
4\tAlice Brown\t35\t2020-12-01\tTRUE\t15000.75\tIT\tSenior engineer
67+
5\tTom Wilson\t22\t2023-08-25\tTRUE\t6000.00\tHR\tIntern
68+
6\t\t40\t2019-06-15\tTRUE\t18000.00\tFinance\tDepartment manager
69+
7\tLucy Davis\t27\t2023-02-28\tFALSE\t7000.00\tOperations\tContract ended
70+
8\tMike Miller\t32\t2021-09-10\tTRUE\t13500.50\tIT\tProject lead
71+
9\tSarah Lee\t29\t2022-11-05\tTRUE\t9500.00\tMarketing\tMarketing specialist
72+
10\tDavid Zhang\t26\t2023-07-12\tTRUE\t8500.25\tSales\tSales representative
73+
74+
""";
5975
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,12 @@
11
This is an excel test
2+
ID,Name,Age,JoinDate,Active,Salary,Department,Notes
3+
1,John Doe,25,2023-01-15,TRUE,8000.50,IT,"Regular employee"
4+
2,Jane Smith,30,2022-05-20,TRUE,12000.00,Marketing,"Team leader"
5+
3,Bob Johnson,28,2023-03-10,FALSE,7500.00,Sales,"Left company"
6+
4,Alice Brown,35,2020-12-01,TRUE,15000.75,IT,"Senior engineer"
7+
5,Tom Wilson,22,2023-08-25,TRUE,6000.00,HR,"Intern"
8+
6,,40,2019-06-15,TRUE,18000.00,Finance,"Department manager"
9+
7,Lucy Davis,27,2023-02-28,FALSE,7000.00,Operations,"Contract ended"
10+
8,Mike Miller,32,2021-09-10,TRUE,13500.50,IT,"Project lead"
11+
9,Sarah Lee,29,2022-11-05,TRUE,9500.00,Marketing,"Marketing specialist"
12+
10,David Zhang,26,2023-07-12,TRUE,8500.25,Sales,"Sales representative"

app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/tool/FileExtractorContainer.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66

77
package modelengine.fit.jober.aipp.tool;
88

9-
import modelengine.fit.jade.aipp.file.extract.FileExtraction;
9+
import modelengine.fit.jade.aipp.file.extract.FileExtractor;
1010
import modelengine.fit.jober.aipp.service.OperatorService;
1111
import modelengine.fitframework.annotation.Component;
12+
import modelengine.fitframework.log.Logger;
1213

1314
import java.util.ArrayList;
1415
import java.util.HashMap;
@@ -24,20 +25,22 @@
2425
*/
2526
@Component
2627
public class FileExtractorContainer {
28+
private static final Logger log = Logger.get(FileExtractorContainer.class);
29+
2730
/**
2831
* 一种文件类型对应一个提取器集合。
2932
*/
30-
private final Map<String, List<FileExtraction>> fileExtractorMap;
33+
private final Map<String, List<FileExtractor>> fileExtractorMap;
3134

3235
/**
3336
* 初始化用框架注入提取器。
3437
*
35-
* @param extractors 文件提取器 {@link FileExtraction}。
38+
* @param extractors 文件提取器 {@link FileExtractor}。
3639
*/
37-
public FileExtractorContainer(List<FileExtraction> extractors) {
40+
public FileExtractorContainer(List<FileExtractor> extractors) {
3841
this.fileExtractorMap = new HashMap<>();
39-
for (FileExtraction fileExtractor : extractors) {
40-
for (String supportedFileType : fileExtractor.supportedFileType()) {
42+
for (FileExtractor fileExtractor : extractors) {
43+
for (String supportedFileType : fileExtractor.supportedFileTypes()) {
4144
this.fileExtractorMap.computeIfAbsent(supportedFileType, k -> new ArrayList<>()).add(fileExtractor);
4245
}
4346
}
@@ -51,10 +54,13 @@ public FileExtractorContainer(List<FileExtraction> extractors) {
5154
* @return 提取的字符串 {@link Optional<String>}。
5255
*/
5356
public Optional<String> extract(String fileUrl, OperatorService.FileType fileType) {
54-
List<FileExtraction> extractors = this.fileExtractorMap.get(fileType.toString());
57+
List<FileExtractor> extractors = this.fileExtractorMap.get(fileType.toString());
5558
if (extractors == null || extractors.isEmpty()) {
5659
return Optional.empty();
5760
}
61+
if (extractors.size() > 1) {
62+
log.warn("Multiple extractors found , using first: {}", extractors.get(0).getClass().getSimpleName());
63+
}
5864
return Optional.ofNullable(extractors.get(0)).map(extractor -> extractor.extractFile(fileUrl));
5965
}
6066
}

app-builder/services/aipp-file-extract-service/src/main/java/modelengine/fit/jade/aipp/file/extract/FileExtraction.java renamed to app-builder/services/aipp-file-extract-service/src/main/java/modelengine/fit/jade/aipp/file/extract/FileExtractor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* @author 黄政炫
1717
* @since 2025-09-06
1818
*/
19-
public interface FileExtraction {
19+
public interface FileExtractor{
2020
/**
2121
* 提取文件函数。
2222
*
@@ -32,5 +32,5 @@ public interface FileExtraction {
3232
* @return 表示返回的文件类型 {@link List<String>}。
3333
*/
3434
@Genericable(id = "modelengine.fit.jade.file.getFileType")
35-
List<String> supportedFileType();
35+
List<String> supportedFileTypes();
3636
}

0 commit comments

Comments
 (0)