Java 使用Mule 4转换Microsoft Excel.xls(而不是.xlsx)

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 这有可

我们需要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
  • 这有可能吗


    也许您可以建议另一种解决方案?

    是的,您可以将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时遇到了很多问题,比如(但是如果您有更好的解决方案,请告诉我!):

    • 无法将某某转换为对象
    • 文件结尾无效
    这非常有意义,因为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
    • Args:
      {arg0:payload as String}
    • Class:Java类的包和类名
    • 方法:调用的方法是transform(java.lang.String)
    它作为
    字符串
    传递,因为Java知道如何处理
    字符串
    对象,基本上我们隐藏了它是一个文件的事实

    Java从中执行以下操作(参见上面的Java文件):

    • 解码文件:
    • 将其读取到InputStream:
    • 创建Apache POI类:
    • 执行转换:
    在上面的示例中,我们只是将一个单元格的值作为字符串返回给Mule。但您也可以创建CSV类型的字符串,如
    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使用示例: