EZDML 数据建模

超轻量级的免费数据建模工具

0%

EZDML导入导出Excel功能详解

EZDML之前支持批量导出到Excel,最近EZDML又增加了批量导入Excel的功能,这里简单说明一下。

批量导入Excel

这里所谓批量,就是一次能导入多个表的意思。大概要求格式是:表名独占一行,注释(可选)占一行,列头占一行,然后是字段属性内容(一行一个字段,注释可多行),每个表之间至少有一行空行。

新版EZDML在模型菜单下增加了“导入Excel…”命令:

点击后弹出一个对话框:

左边是要粘贴Excel内容,我们打开一个Excel示例文件,这个是我之前用EZDML导出来的,我们直接全选并复制:

然后粘贴到EZDML的导入文本框中:

由于都是自家的格式,因此EZDML能自动识别所有内容,直接“确定”就可以了,程序弹出提示:

再次“确定”,就可以完成导入:

导入第三方文档

上面导入的是EZDML自己的格式,左手导右手,没什么挑战性。而大部分情况我们可能是拿到的是别人提供的数据字典文档,甚至有时就是接口文档,因此下面我们来导一个实际一点复杂一点的。

这里我们以艺龙的接口为例,这个接口是公开的,假设我要导入的是下面这个链接的文档:

https://open.elong.com/doc/info/cn-api-meta-hotel_data_rp

输入参数我们不管,我们要导入的是响应结果:

从Hotel节点开始选中内容,直到最后一个表格,右键复制内容:

打开Excel新建空白表格,粘贴(注意这一步不可省略,我们需要Excel中转一下):

在Excel中再次全选、复制,并到EZDML的导入Excel文本框中粘贴:

这次大家可能会发现有点不一样了,有些列EZDML并没有正确地识别出来,比如第一列和第二列就错了,我们点一下“C1”:

我们选择“字段名”,将第一列设置为字段名;同样地,我们把第二列改成逻辑名:

点击“确定”,弹出确认框:

可以看到,表名都有一个“节点”的后缀,这个我们一会处理。先点确定:

这个GuaranteeRule节点大宽了,原因是有个字段的逻辑名太长,我们改一下,把多出来的内容移到注释里:

再看就差不多了,只是“节点”这个后缀有点不顺眼:

在模型图上右键执行脚本,切换到JAVASCRIPT(点新建直到标题显示JAVASCRIPT),输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Java Script

for(var i=0; i<allModels.count; i++)
{
var md=allModels.getItem(i);
for(var j=0; j<md.tables.count; j++)
{
var tb = md.tables.getItem(j);
if(tb.name.indexOf('节点') > 0){
tb.name=tb.name.substring(0,tb.name.indexOf('节点'));
curOut.add('table renamed: '+ tb.name);
}
}
}

运行:

回到模型图,刷新,表名里的节点就去掉了:

扩展属性导入

如上所述,批量导入时,EZDML能自动识别大部分的内容,如字段名、逻辑名、数据类型、大小、精度、可为空、必填、唯一、约束、缺省值、注释。如果识别失败或错误,也可以手工辅助更正。

但自动识别的内容毕竟有限,如果还有其它属性(如是否只读等)需要导入,或者对自动识别的效果不满意,这时我们可在导入时勾选“保存值内容到字段参数”:

确定导入后,我们得到表内容,表面上跟之前没什么区别:

我们选中member的username字段,右键运行脚本,切换到JAVASCRIPT(点新建直到标题显示JavaScript),执行以下脚本:

1
alert(curField.paramList.text); 

我们可以看到,原始内容一字不落地全保存下来了。这样,我们就可以根据需要写脚本来赋值了,比如我们运行以下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Java Script
for(var i=0; i<allModels.count; i++) //遍历所有模型
{
var md=allModels.getItem(i);
for(var j=0; j<md.tables.count; j++) //遍历所有表
{
var tb = md.tables.getItem(j);
for(var k=0; k<tb.metaFields.count; k++) //遍历字段
{
var fd = tb.metaFields.getItem(k);
if(fd.getParam('C5')=='Y'){ //判断导入列C5的值“是否只读”
fd.editorReadOnly=true;
curOut.add(' Field readOnly: '+tb.name+'.'+fd.nameCaption);
}
}
}
}

运行结果:

这时我们会看到,相应的字段属性确实已经有值了:

通过这种方法,我们可以方便地导入任意属性列。

表字段Excel粘贴

可能有人也注意到了表属性中也有一个“从Excel粘贴”的右键菜单:

这个粘贴跟上面的批量导入稍有区别,它的作用是把Excel的内容按单元格式位置一个一个地粘贴到字段列表的表格中,等于是代替用户批量输入了。并且是严格地从当前选中的行、列开始,不一定是第一行,也不一定是第一列,你可以从中间任一单元格开始粘贴。

比如我想把上图Rid开始的5个字段的数据类型修改为浮点,长度为(12,2),则我们可以在Excel中批量录入以下内容,并复制:

然后我们点一下RID的数据类型单元格(把当前焦点移到第三行第三列),执行右键“从Excel粘贴”:

弹出一个确认窗口:

点“确定”,就可以看到效果了:

结合下一节的复制Excel文本功能,先把内容复制到Excel,在Excel里批量改好,再粘贴回来,我们就可以轻松实现对表字段任意内容的批量修改了。

复制Excel文本

表属性右键菜单有个“复制Excel文本”,

这个就是简单快速地复制一下,我们可以粘贴到Excel看看:

如果希望批量复制Excel文本,可在模型图中多选表对象,然后右键菜单执行“批量复制|Excel文本”:

这样就可以把多个表的Excel文本一起复制到剪贴板了。

批量导出Excel

顺便再说下批量导出Excel。一般我们是在模型图中选中要导出的表(不选则导出全部),然后右键导出:

弹出导出框,在保存文件类型中选择Excel:

保存成功弹出提示:

确定打开,这时会有一个警告:

点是即可:

这个导出的格式其实是HTML来的,导出时是通过HTML模板来生成的,这个模板是位于EZDML/Templates下的export_xls_ch.ps_,我们打开看下:

嗯,跟JSP、ASP很类似,很小,总共才200行,前面100行都是样式。

不过,是PASCAL语法;又不过,我们一般只需要小修改,并不需要完全掌握PASCAL。我们翻到150行左右,读懂这一段你就可以随便改了:

当然了,EZDML保存的DMJ文件内容是JSON格式文本,你也可以可以自己用其它工具编程处理:

OK,关于Excel我们暂时就说这么多了。