0

我有一个 Excel 数据,例如

Name    Roll_No     Place
Mahesh  112         Hyd
Manish  118         Pune
Somesh  119         Lon
Abc     110         xyz

现在,如果我要通过 Mule 根据卷号获取学生的姓名。mule 中的 flowVar 将具有类似 112 的 Roll_No,因此相应的名称将是 Mahesh。

我在最新的 mule 版本中对 DataWeave 进行了同样的尝试。下面是一段代码。

   <?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd">
    <flow name="excelcheckFlow">
        <file:inbound-endpoint path="C:\Users\rmishra\Desktop\PoCs" responseTimeout="10000" doc:name="File"/>
        <logger message="-----------Read the content------#[payload]" level="INFO" doc:name="Logger"/>
        <dw:transform-message metadata:id="74fc2359-be73-475f-a800-71ab941497ee" doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
payload map ((payload01 , indexOfPayload01) -> {



    Name: payload01.Name,


    Roll_No: payload01.Roll_No,

    Place: payload01.Place
})]]></dw:set-payload>
        </dw:transform-message>
        <logger message="-----------#[payload.get(0).Name]-----#[payload.get(1).Name]---------" level="INFO" doc:name="Logger"/>
    </flow>
</mule>

它给我一个错误。

4

4 回答 4

1

Dataweave 尚不支持从 Excel (xls) 直接转换。所以,你有一些选择:

  1. 如果您之前能够将 excel 文件转换/保存为 .csv 格式,则可以将 Dataweave 与 csv 输入一起使用:

https://docs.mulesoft.com/mule-user-guide/v/3.7/using-dataweave-in-studio#configuring-the-csv-reader

  1. 如果您无法做到这一点,请在文件连接器使用 Java 自定义转换器将数据(使用 POI 库)转换为 java 数组后,然后使用 Dataweave。(相当复杂的解决方案)

  2. 使用 DataMapper 进行转换(考虑到 DataMapper 在 Mule 的未来版本中将完全弃用,因此,当 Dataweave 在未来版本中具有此功能时,您将不得不迁移此转换)

于 2016-01-11T19:26:21.913 回答
0

我按照 Davo 的建议创建了自定义转换器,并成功地将 excel 转换为 ArrayList,然后我必须将 ArrayList 转换为 json,然后再传递给 dataweave 进行转换。

我是 Java 新手,任何改进我的答案的评论和建议将不胜感激。

@Override
public Object transformMessage(MuleMessage muleMessage, String outputEncoding) throws TransformerException 
{

    Map<String,String> keys = new HashMap<>();
    ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
    Map<String,ArrayList<Map<String, String>>> outList = new HashMap<>();
    int i = 0, j = 0;

    try  {

        InputStream inp = (InputStream) muleMessage.getPayload();
        Workbook wb = WorkbookFactory.create(inp);
        Sheet sheet = wb.getSheetAt(0);

        //Iterate through each rows one by one
        Iterator<Row> rowIterator = sheet.iterator();
        while (rowIterator.hasNext())
        {
            i++;

            Row row = rowIterator.next();
            //For each row, iterate through all the columns
            Iterator<Cell> cellIterator = row.cellIterator();

            if (i == 1)
            {
                j = 0;
                while (cellIterator.hasNext()) 
                {
                    Cell cell = cellIterator.next();
                    keys.put("f"+j, cell.getStringCellValue());
                    j++;
                }
            }
            else 
            {
                Map<String,String> map = new HashMap<>();

                j = 0;
                while (cellIterator.hasNext()) 
                {
                    Cell cell = cellIterator.next();

                    String k = keys.get("f"+j);
                    String v = cell.getStringCellValue(); 
                    map.put(k, v);
                    j++;
                }

                list.add(map);
            }
        }

        inp.close();

    } catch (Exception e) {
        e.printStackTrace();
    } finally {

    }

    outList.put("root",list);
    return outList;

}
于 2016-05-30T02:13:27.277 回答
0

对DataWeave(数据转换处理器)的Excel(XLSX 文件)支持已随带 3.8.2 运行时的新 Anypoint Studio 6.1.2 版本一起发布。

请在此处查看如何使用它:DataWeave 中的 Excel 格式

以及下面的发行说明:
https ://docs.mulesoft.com/release-notes/anypoint-studio-6.1-with-3.8.2-runtime-update-site-2-release-notes

于 2016-10-27T12:18:08.010 回答
0

问题可能出在您的记录器上。您是否尝试过在 Datawieve 和 Logger 之间进行“对象字符串”转换?

于 2016-01-11T17:10:00.913 回答