这是按照问题中的建议实现的。
完成的示例流程如下所示:
添加 Mule Java 模块依赖项和用于处理 Microsoft xls 文件的 Apache POI:
<dependency>
<groupId>org.mule.module</groupId>
<artifactId>mule-java-module</artifactId>
<version>1.2.5</version>
<classifier>mule-plugin</classifier>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
该文件随后被配置了 no mime 类型或编码的On New or Updated 文件阅读器读取。这是因为我们试图避免 Mule 知道有关文件类型的任何信息。当然可以以任何方式接收该文件 - 例如通过 FTP。
此时,payload 看起来就像一堆 gobbledygook(原始 xls 文件)。
源(文件阅读器)之后紧接着是一个将有效负载转换为纯文本并对其进行 base64 编码的转换:
%dw 2.0
import * from dw::core::Binaries
output text/plain
---
toBase64(payload as Binary)
这样做是因为最初我们在将原始文件传递给 Java 时遇到了很多麻烦,例如(但是,如果您有更好的解决方案,请告诉我!):
这很有意义,因为 Java 不知道我们传递的是什么,也不知道如何将其转换为特定的对象类型。
接下来,我们使用 Mule 的 Java 'New' 事件来实例化 Java 类。类本身看起来像:
public class Transformer {
public String transform(String file) {
String cellValue = "";
try {
// Decode base64:
byte[] decoded = Base64.getDecoder().decode(file);
// Steam decoded file to an input stream (as if we were reading it from disk)
InputStream targetStream = new ByteArrayInputStream(decoded);
// Create the .xls Apache POI object
HSSFWorkbook workbook = new HSSFWorkbook(targetStream);
// Process the rows/cells etc...
HSSFSheet sheet = workbook.getSheetAt(0);
// For example...
cellValue = sheet.getRow(0).getCell(0).getStringCellValue();
} catch (Exception e) {
System.out.println("FAIL" + e.getMessage());
}
return cellValue;
}
}
接下来,我们使用 Mule 的 Java Invoke 事件将有效负载传递给此方法,配置如下:
- 实例:vars.instanceName
- 参数:
{arg0: payload as String}
- 类:Java类的包和类名
- 方法:调用的方法,我们的是transform(java.lang.String)
它作为String 传递,因为Java 知道如何处理String 对象,基本上我们隐藏了它是一个文件的事实。
从那里 Java 执行以下操作(请参阅上面的 Java 文件):
- 解码文件:
- 将其读取到 InputStream:
- 创建 Apache POI 类:
- 执行转换:
在上面的示例中,我们只是将一个单元格的值作为字符串返回给 Mule。但是您也可以创建一个 CSV 类型的字符串,例如 a,b,c\nd,e,f(\n 表示换行),然后使用 Transform 事件将其转换为 CSV:
%dw 2.0
output application/java
---
write( (read(payload,"application/csv",{"header" : false})),"application/csv",{"quoteValues" : "false","header" : false})
会输出这样的 csv 文件:
a,b,c
d,e,f
你有它。 Mule 现在可以处理 Microsoft Excel xls 文件。