Java 使用Mule 4转换Microsoft Excel.xls(而不是.xlsx)
我们需要Mule 4.3将旧的MS Excel 2003文件转换为CSV格式。我们无法控制源系统,因此无法以其他格式接收文件 在此处,它声明它们不支持旧格式,并且似乎也没有在线解决方案: 仅支持.xlsx文件(Excel 2007)。Mule不支持xls文件 但是我想知道我们是否可以这样做:Java 使用Mule 4转换Microsoft Excel.xls(而不是.xlsx),java,mule,transformation,xls,mule4,Java,Mule,Transformation,Xls,Mule4,我们需要Mule 4.3将旧的MS Excel 2003文件转换为CSV格式。我们无法控制源系统,因此无法以其他格式接收文件 在此处,它声明它们不支持旧格式,并且似乎也没有在线解决方案: 仅支持.xlsx文件(Excel 2007)。Mule不支持xls文件 但是我想知道我们是否可以这样做: a,b,c d,e,f 将输入读取为没有关联格式的“blob” 立即将其交给Mule 4 Java模块 Java模块将使用Java插件进行转换 将转换后的有效负载作为CSV传递回dataweave 这有可
a,b,c
d,e,f
也许您可以建议另一种解决方案?是的,您可以将InputStream传递给Java模块方法调用,并使用Apache POI(也可以读取xls和xlsx)进行流到csv的转换。这是问题中提出的 完成的样本流如下所示: 添加Mule Java模块依赖项和Apache POI以处理Microsoft xls文件:
<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>
之所以这样做,是因为最初我们在将原始文件传递给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
- Args:
{arg0:payload as String}
- Class:Java类的包和类名
- 方法:调用的方法是transform(java.lang.String)
字符串
传递,因为Java知道如何处理字符串
对象,基本上我们隐藏了它是一个文件的事实
Java从中执行以下操作(参见上面的Java文件):
- 解码文件:
- 将其读取到InputStream:
- 创建Apache POI类:
- 执行转换:
a、b、c\nd、e、f
(\n表示新行),然后使用转换事件将其转换为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文件。谢谢@maciej。我们无法使用InputStream,而是将其作为纯文本编码。您可以在此处的invoke Java组件中找到InputStream使用示例: