从mule子esb操作Excel中的数据

我有一个像数据的excel

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

现在,如果我有一个通过mule子根据卷号获取学生的名字。 在mule中的stream量variables将具有像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> 

这是给我一个错误。

Dataweave不支持直接从Excel(xls)转换。 所以,你在这里有一些select:

  1. 如果您可以将以前的.csv格式的excel文件转换/保存,则可以使用带有csvinput的Dataweave:

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

  1. 如果你不能这样做,文件连接器使用Java自定义转换器将数据(使用POI库)转换为Java数组,然后使用Dataweave。 (相当复杂的解决scheme)

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

这个问题可能归结于你的logging器。 你有没有尝试过在你的Datawieve和你的Logger之间进行“Object-String”转换?

我按照Davo的build议创build了自定义转换器,并成功将excel转换为ArrayList,然后在将ArrayList转换为json之前,将其转换为dataweave进行转换。

我是新来的Java,任何意见和build议,以改善我的答案将不胜感激。

 @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; } 

DataWeave (数据转换处理器)的Excel(XLSX文件)支持已经在新的Anypoint Studio 6.1.2版本w / 3.8.2 Runtime中发布。

请参阅如何在DataWeave中使用Excel格式

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