docker版jxTMS使用指南:导入数据

时间:2021-09-06 01:13:49

本文讲解docker版jxTMS的如何导入excel文件中的数据,整个系列的文章请查看:docker版jxTMS使用指南

请按前文所述先做好相关的准备工作,然后sftp登录后,进入docTemplate目录,将【入库单.xls】下载到本地,为了便于明确,我们给其改个名字:本地入库单.xls。

打开【本地入库单.xls】,在型号、名称两列中随便输入一些文字,如:

docker版jxTMS使用指南:导入数据

保存【本地入库单.xls】

在web文件中增加一个导入界面:

//导入数据
web importData type div;
web importDataT1 parent importData type table title='导入Excel文件',width=900,alone=true;
with importDataT1 row 0 col c0 web n type text text='上传excel:',width=200;
with importDataT1 row 0 col c1 web n type fileInput width=700;
with importDataT1 row 1 col c0 web n type button width=80,text='导入',motion=cmd,demand=importData;

保存web文件

然后在op.py文件中增加:

@biz.Demand('disp','importData')
@biz.OPDescr
def op1(json):
	#在快捷栏中添加一个新的快捷入口【演示->导入数据】
    json.setShortcut('演示'.decode('utf-8'),'导入数据'.decode('utf-8'))

保存op.py文件

然后在capa.py文件中增加:

@myModule.event('cmd', 'importData')
def importData(self, db, ctx):
    with jxExcel(self.importFilepath,'entryBill') as e:
        #
        #如何导入一个数据表
        #
        #设置内部行号的4行是表头行,即各列列名所在行
        e.head(4)
        #从内部行号的5行【excel内部行号从0开始】的行开始逐行遍历直至空行结束
        rs=e.rows(5)
        for r in rs:
            #处理每一行
            #型号格中读到的作为字符串
            ty=e.getCellStringValue(r,'型号'.decode('utf-8'))
            if not utils.valid(ty):
                #型号为空,则结束本表的导入
                break
            #在日志中打印一个提示在导入哪个型号
            jx.log('import Type:{}',ty)

            jo = pyORM.create(db,'demoData')
            jo.Type = ty
            jo.Name = e.getCellStringValue(r,'名称'.decode('utf-8'))
            db.update(jo, 'Type', 'Name');

然后保存capa.py,上传web、capa.py、op.py,并热机刷新

注:热机刷新时要保持观察实时日志,但日志可能刷新的太快,所以最好再拉上去看一看有没有报错。上面这段代码我是从其它文件中复制过来然后改了改上传的,结果刷新完发现快捷栏中连一级菜单项【演示】都没有了,这才查了一下日志发现是某行【记得要减去50才是capa.py文件中的行号】在报对齐错误,这很大可能是不同文件、不同编辑器中对TAB的处理不一样所导致的

然后刷新页面以重新登录。

注:由于我们在op.py文件中添加了新的快捷栏入口,所以必须重新登录才能看到刚添加的快捷栏中的入口

然后点击快捷栏【演示->导入数据】,并将【本地入库单.xls】拖入【导入excel文件】后的文件上传区:

docker版jxTMS使用指南:导入数据

然后点击【导入】按钮。

这时可以从实时日志中看到importData事件已经执行,我们可以点击快捷栏【演示->列表演示数据】,就会看到我们刚刚导入的数据了,同时还可以看到分页的效果:

docker版jxTMS使用指南:导入数据

web和op.py中的新增内容都比较好理解,包括文件控件,大家只要对照文末参考资料中的编程手册中的相关内容阅读一下就好了。我主要讲解一下importData事件响应函数中对导入数据的处理。

with jxExcel(self.importFilepath,'entryBill') as e:

fileInput控件所导入的文件,是临时存放到一个临时目录下的,存放路径放到self.importFilepath中,大家只要提供给with jxExcel语句,并附以想要打开的excel文件中的sheet名即可打开该表单。

excel文件有两种数据定位方式,一种是类似签收人、签收时间这样的单值数据,我们就可以直接用格子号来定位;一种就是表单数据,也就是我们这个示例所演示的。

表单数据有一个表头,说明各列的语义,而:

e.head(4)

就是指示4行就是表头行。

注:excel文件中行号从0开始计数,所以大家在excel中看到的行号要减去1

设置完表头行,就需要指出表单的开始行:

rs=e.rows(5)

注:刚用head指示了4行是表头行,好像再用rows指示5行开始都是表单数据有些多余,但笔者还是担心万一真有人出于美观之类的考虑中间插了空行呢?!

然后用一个for循环来遍历表单,由于表单是不定长的,所以以某个关键列空值为遍历结束条件。

指示表头行的目的非常简单,就是在遍历各行时,直接用表头行中各列的语义来定位行中该列所在格子,这将大大简化导入时的编程,尤其是还可以应付调整各列顺序的情况:

ty=e.getCellStringValue(r,'型号'.decode('utf-8'))

注:excel中格子中的数据是有格式的,最麻烦的就是数字,看起来是123456789,但实际上作为数字格式其都是用科学计数法进行的保存:1.23456789e8,而很多时候我们都是将其作为文本来保存的,例如:手机号。所以需要大家仔细核对导入的数据是否是需要的数据,如果不对则需要调整excel文件中该类的数据格式,如此反复直到得到自己需要的数据

excel文件的其它操作请参考下面的相关资料。

参考资料:

jxTMS设计思想

jxTMS编程手册

下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

如何用jxTMS开发一个功能

下面的系列文章讲述了jxTMS的一些基本开发能力:

jxTMS的HelloWorld