如何使用DataWeave转换Excel文件 批量填充Country列为test值
Mule 4.4.0 EE 批量修改Excel Country列值实现方案
从你提供的工作表XML结构来看,不需要引入第三方依赖,直接用Mule自带的XML模块和DataWeave即可完成需求,具体实现如下:
核心逻辑说明
- 从表头行(
r="1"的行)可确认,Country列对应列标识为H,所有行中r属性以H开头的<c>单元格节点就是需要修改的目标节点 - 工作表根节点带默认命名空间
http://schemas.openxmlformats.org/spreadsheetml/2006/main,脚本中必须提前声明该命名空间,否则会出现节点匹配失败的问题 - 你提供的文件中所有单元格都是
inlineStr内联字符串类型,不需要处理共享字符串表,直接替换单元格内<t>标签的文本内容即可,不会破坏原有格式
核心实现代码
假设你已经通过解压xlsx压缩包拿到了目标工作表的XML内容,并存放在变量worksheetXml中,替换逻辑的DataWeave脚本如下:
%dw 2.0 output application/xml writeDeclaration=true // 声明Excel工作表默认命名空间 ns ss http://schemas.openxmlformats.org/spreadsheetml/2006/main --- worksheetXml mapObject (rootNode, rootKey) -> { (rootKey): rootNode mapObject (node, nodeKey) -> { (nodeKey): if (nodeKey as String == "ss#sheetData") do { // 遍历sheetData下的所有行 node mapObject (row, rowKey) -> { (rowKey): row mapObject (cell, cellKey) -> { (cellKey): if ( cellKey as String == "ss#c" and startsWith(cell.@"r", "H") ) do { // 匹配H列单元格,替换文本内容为test cell update { case ."ss#is"."ss#t" -> "test" } } else { cell } } } } else { node } } }
适配优化建议
- 如果你的表格后续可能调整列顺序,不要硬编码列号
H,可以先遍历第一行的单元格,动态查找文本值为Country的单元格对应的列标识,再用动态标识匹配数据行单元格,避免列顺序变动后逻辑失效 - 修改完XML内容后,将新的XML内容写回xlsx压缩包对应的工作表路径,覆盖原有文件即可,注意不要修改压缩包内其他文件的结构和顺序,否则会导致Excel文件损坏
- 小数据量场景也可以直接使用Mule Excel连接器读取为结构化数据,遍历每一行将Country字段设为
test后重新写出,代码会更简洁,但数据量超过1万行时直接处理XML的性能会明显优于连接器
内容的提问来源于stack exchange,提问作者Willy Kelly
相关产品推荐
相关产品推荐

