Excel到EDI报文转换代码详解

EDI目前已广泛应用于电子、物流、汽车、零售等行业。

越来越多的交易伙伴要求建立EDI连接,通过EDI来对接上下游交易伙伴,收发业务单据。

当我们与新的交易伙伴建立EDI连接时,有多种实施方案可供选择,如果企业的单据量较少,预算也不多的话,Excel方案相对来说就比较适合了。

本文章主要给大家讲解当企业自主实施时,如何写将Excel转换为对应报文的代码。

以856发货通知为例:

一.搭建工作流

856属于X12报文,知行之桥系统的X12端口可以将X12报文转成对应的报文格式的XML文件,也可以将报文格式的XML文件转为对应的X12报文,即可以进行报文到XML文件的双向转换。 由X12端口生成的XML文件是固定格式的,所以我们只需要将Excel转换为目标XML文件,然后通过X12端口将该XML文件转换为对应报文即可。

根据上述需求,可搭建如下工作流:

Excel_Translate1.png

二.使用规范中的示例856报文通过X12端口生成目标XML文件

Excel_Translate2.png

 

Excel_Translate3.png

 下载示例报文和生成的XML文件

示例报文可参考如下解析进行阅读:

ISA*00**00**01*123456789*01*987654321*940613*1025*U*04010*000000333*0*P*
GS*PS*005346481*005346481*940613*1025*000000433*X*004010'
ST*856*0001'
BSN*00*123456*20240111*0810'
-123456 发货通知编号
-202401110810 发货通知创建日期
DTM*011*20240115*1115'
-202401151115 发货日期
HL*1**S'
-S 代表shipment层
MEA*PD*G*1000*KG'
-1000 毛重
-KG 重量单位
TD1*PLT71*2'
-PLT71 包装类型
-2 包装数量
TD5*B*92*1234*A'
-1234 SCAC代码
-A 运输方式 空运
TD3*AF**1234'
-AF 设备类型 空运
-1234 空运编号
REF*BM*123456'
-123456 提单号
HL*2*1*I'
-2 当前层级编号
-1 父层级编号
-I 代表item层
LIN**BP*ABC-12345-123'
-ABC-12345-123 买方物料号
SN1**100*EA*1055'
-100 出货数量
-EA 数量单位
-1055 迄今为止发货数量
PRF*PO123***20231121'
-PO123 订单号
-20231121 订单日期
CLD*2*50***EA'
-2 荷载数量
-50 装运的单位数量
REF*SE*2401111'
-2401111 序列号 
REF*SE*2401112'
CTT*2*100'
SE*49*000001048'
GE*1*000000433'
IEA*1*000000333'

三.根据实际业务需求设计Excel模版

根据客户提供的规范整理对应的Mapping,然后参考Mapping和目标XML文件设计856的Excel模版如下图:

Excel_Translate4.png

 下载示例模版

四.写转换代码

拿到目标XML文件,设计好Excel模版,就可以写代码了

1.进入Excel端口的文件目录,可以看到如下几个模版文件

Excel_Translate5.png

2.选择Sample_XLSX_To_XML_Template.xml文件打开,可以看到如下示例代码

代码前半部分从Excel中取值,后半部分将取到的业务值写入目标XML中。

Excel_Translate6.png

 下载示例代码

3.从Excel中进行取值

根据实际需求参考上方示例代码从Excel表中进行取值,如下图所示:

Excel_Translate7.png

map:shipment_type = "C3"  代表shipment_type取C列3行的值
map:pack_qty = "F6"   代表pack_qty取F列6行的值
 
map:buyer_item_no = "B11:B*"  buyer_item_no可能会有多行,需要当成数组处理,所以从B列11行开始取值
map:number_of_loads = "H11:H*"  number_of_loads从H列11行开始取值

其余业务字段亦按照如上规律进行取值。

4.将取到的值写入目标XML

首先需要将目标XML放入代码的后半部分,注意只需要用TransactionSet部分代替示例代码中的TransactionSet部分。

然后就可以根据规范或者整理好的Mapping将从Excel模版中取到的值写入目标XML的对应位置。

a.非数组字段取值方式: [data.字段名 | def | trim | xmlencode]

如下图所示:

Excel_Translate8.png

def、trim等格式化器可在如下网址中查询使用方法,然后根据实际需求使用

扩展阅读

注意:在Excel生成报文的代码中,每个字段取值时都必须使用xmlencode格式化器

Excel_Translate9.png

b.数组字段取值方式[data.字段名#[_index] | def | trim | xmlencode]

如下图所示

Excel_Translate10.png

对于数组数据,需要对数组字段值进行遍历读取,本代码使用enum关键字对buyer_item_no数组字段进行遍历,通过[_index]拿到下标,然后根据下标取出其它数组字段

<rsb:enum attr="data.buyer_item_no#">
  [data.字段名#[_index] | def | trim | xmlencode]
......
</rsb:enum>

扩展阅读:enum关键字的使用方法

本项目遍历的条件是该行的buyer_item_no值不为空。

Excel_Translate.jpg

HL01是层级编号,Item的层级编号从2开始递增,所以需要设置一个临时字段,每读取一行item,则自增一下:

<rsb:set attr="item.loop" value="1"/>
<rsb:set attr="item.loop" value="[item.loop | add(1)]"/>

c.以;隔开的序列号字段的取值

Excel_Translate11.png

先设置一个临时字段取出该行的序列号值,然后通过enum的separator参数取出

扩展阅读:enum关键字的使用方法

d.对于必填字段的检查

Excel_Translate12.png

<rsb:check value="">
   …
<rsb:else>
   <rsb:throw code="Miss value" desc="Miss "/>
</rsb:else>
</rsb:check>

扩展阅读:

check关键字
throw关键字
else关键字

e.对于非必填字段,如果没有值则需要跳过整个segment

Excel_Translate13.png

使用check关键字跳过即可

<arc:check attr="">
...
</arc:check>

f.对于生成的XML文件进行改名

可以将发货通知编号以及当前日期放在文件名上方便有问题时进行检查

Excel_Translate14.png

g.完整代码见如下附件

 下载示例代码

5.测试代码

打开Excel端口,选择转换模式为Template,然后上传写好的代码文件

Excel_Translate15.png

 

Excel_Translate16.png

在输入处上传要转换的856Excel文件并发送

Excel_Translate17.png

从X12端口的输出处即可拿到生成的报文文件

Excel_Translate18.png

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
EDI(Electronic Data Interchange)报文是一种基于ASCII字符集的电子数据交换标准格式。在Java中,我们可以使用EDI解析器库来处理EDI报文。常见的EDI解析器库包括Smooks和jPOS。 在解析EDI报文时,我们可以将其转换成Java对象来方便地进行后续处理。这里给出一个示例: 假设我们有以下EDI报文: ```EDI ISA*00* *00* *12*3456789012 *08*9876543210 *200101*1200*U*00401*000000001*0*T*:~ GS*PO*4405197800*9876543210*20010101*1319*1*X*004010~ ST*850*0001~ BEG*00*SA*08292233294**20010101~ N1*BY*ABC COMPANY~ N1*SE*DEF COMPANY~ PO1*1*10*EA*19.95*UK*1234567890*VP*ABC123~ CTT*1~ SE*7*0001~ GE*1*1~ IEA*1*000000001~ ``` 我们可以定义以下Java对象来表示这些数据: ``` public class EDI { private ISA isa; private GS gs; private List<ST> sts; // getters and setters } public class ISA { private String authorizationInformationQualifier; private String authorizationInformation; private String securityInformationQualifier; private String securityInformation; private String senderIDQualifier; private String senderID; private String receiverIDQualifier; private String receiverID; private String date; private String time; private String interchangeControlStandardsIdentifier; private String interchangeControlVersionNumber; private String interchangeControlNumber; private String acknowledgementRequested; private String usageIndicator; private String componentElementSeparator; // getters and setters } public class GS { private String functionalIdentifierCode; private String senderID; private String receiverID; private String date; private String time; private String groupControlNumber; private String transactionTypeCode; private String versionNumber; // getters and setters } public class ST { private String transactionSetIdentifierCode; private String transactionSetControlNumber; private String implementationConventionReference; // getters and setters } public class BEG { private String transactionSetPurposeCode; private String purchaseOrderTypeCode; private String purchaseOrderNumber; private String releaseNumber; private String date; private String contractNumber; // getters and setters } public class N1 { private String entityIdentifierCode; private String name; // getters and setters } public class PO1 { private String lineNumber; private String quantityOrdered; private String unitOfMeasure; private String unitPrice; private String basisOfUnitPrice; private String productIDQualifier; private String productID; private String vendorPartNumber; // getters and setters } public class CTT { private String numberOfLineItems; // getters and setters } ``` 然后我们可以使用Smooks或jPOS等EDI解析器库将EDI报文解析成这些Java对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知行EDI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值