Excel多级结构转成树结构形式

时间:2024-10-14 12:23:24

第一步:Excel文件的形式如下

第二步:转换成树结构可选形式

第三步:具体怎么实现?

(1)、需要借助数据库中表来存储这些字段,一张表(aa)存Excel文件中的所有数据,一张作为处理表(bb)作为中转,把处理好的数据再放到存储表(aa)中。

(2)、具体操作

a、如果没有建表语句,那就从库中熟悉的表中来复制表结构;

--4*2=8列表,字段长度足够就可以(这里是100),c表示code即id,n表示name即名称
create table aa as select casedjrxm c1,casedjrxm n1,casedjrxm c2,casedjrxm n2,casedjrxm c3,casedjrxm n3,casedjrxm c4,casedjrxm n4 from ywcl_case where 1=2;
--2列临时表
create table bb as select casedjrxm c,casedjrxm n from ywcl_case where 1=2;

b、直接使用建表语句

CREATE TABLE "aa"
(
"c1" VARCHAR2(50),
"c2" VARCHAR2(50),
"c3" VARCHAR2(50),
"c4" VARCHAR2(50),
"c5" VARCHAR2(50),
"c6" VARCHAR2(50),
"n1" VARCHAR2(50),
"n2" VARCHAR2(50),
"n3" VARCHAR2(50),
"n4" VARCHAR2(50),
"n5" VARCHAR2(50),
"n6" VARCHAR2(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "aa" IS 'aa';

CREATE TABLE "BB"
(
"id" VARCHAR2(50),
"c" VARCHAR2(50),
"n" VARCHAR2(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "BB" IS 'BB';

c、把Excel文件中的数据要插入到已经建好的表(aa)中

="insert into aa(n1,n2,n3,n4) values('"&A2&"','"&B2&"','"&C2&"','"&D2&"');"

以这种方式把Excel文件的数据全部获取到,然后在数据库中执行;

select * from aa;可以查询到已成功插入的全部数据。

d、对aa表中的数据进行处理,目前给到的数据只有文字,而没有编码的,所以需要给每一级都创建一个id。处理数据sql命令如下

一、处理第一级的父节点

truncate table bb;
--一级插入临时表
insert into bb(n) select distinct n1 from aa;
--以行数补齐3位做id
update bb set c=LPAD(rownum, 3, '0');
--回填
update aa set c1=(select c from bb where n=n1);

commit;

二、处理第二、三、四级节点,有两种方式

-----------方式1:不区分下级节点顺序-------
/*
delete from bb;
--二级插入临时表
insert into bb(n) select distinct n1||n2 from aa where n2 is not null;
--以行数补齐3位做id
update bb set c=LPAD(rownum, 3, '0');
--回填
update aa set c2=(select c from bb where n=n1||n2);
commit;

delete from bb;
--三级级插入临时表
insert into bb(n) select distinct n1||n2||n3 from aa where n3 is not null;
--以行数补齐3位做id
update bb set c=LPAD(rownum, 3, '0');
--回填
update aa set c3=(select c from bb where n=n1||n2||n3);
commit;

delete from bb;
--四级级插入临时表
insert into bb(n) select distinct n1||n2||n3||n4 from aa where n4 is not null;
--以行数补齐3位做id
update bb set c=LPAD(rownum, 3, '0');
--回填
update aa set c4=(select c from bb where n=n1||n2||n3||n4);
commit;
*/
-----------方式1:不区分下级节点顺序-------

-----------方式2:区分下级节点顺序:即每个下级都是从001开始-------
begin
for t
    in(select distinct n1 from aa where n2 is not null)
    loop
      delete from bb;
      --二级插入临时表
      insert into bb(n) select distinct n2 from aa where n1=t.n1;
      --以行数补齐3位做id
      update bb set c=LPAD(rownum, 3, '0');
      --回填
      update aa set c2=(select c from bb where n=n2) where n1=t.n1;
      commit;
    end loop;
end;

begin
for t
    in(select distinct n1||n2 n1 from aa where n3 is not null)
    loop
      delete from bb;
      --三级插入临时表
      insert into bb(n) select distinct n3 from aa where n1||n2=t.n1;
      --以行数补齐3位做id
      update bb set c=LPAD(rownum, 3, '0');
      --回填
      update aa set c3=(select c from bb where n=n3) where n1||n2=t.n1;
      commit;
    end loop;
end;

begin
for t
    in(select distinct n1||n2||n3 n1 from aa where n4 is not null)
    loop
      delete from bb;
      --四级插入临时表
      insert into bb(n) select distinct n4 from aa where n1||n2||n3=t.n1;
      --以行数补齐3位做id
      update bb set c=LPAD(rownum, 3, '0');
      --回填
      update aa set c4=(select c from bb where n=n4) where n1||n2||n3=t.n1;
      commit;
    end loop;
end;
-----------方式2:区分下级节点顺序:即每个下级都是从001开始-------

三、不管是使用哪种方式处理的数据最后得到的数据都有自己的id。

e、Excel所有数据已全部入库,那就需要处理成树结构的形式,树结构的形式js代码如下

 {id:'001',pId:'-1',name:'新一代信息技术产业',allname:'新一代信息技术产业',"chkDisabled":true},
    {id:'001001',pId:'001',name:'下一代信息网络产业',allname:'新一代信息技术产业->下一代信息网络产业',"chkDisabled":true},
    {id:'001002',pId:'001',name:'电子核心产业',allname:'新一代信息技术产业->电子核心产业',"chkDisabled":true},
    {id:'001003',pId:'001',name:'人工智能',allname:'新一代信息技术产业->人工智能',"chkDisabled":true},
    {id:'001001001',pId:'001001',name:'网络设备制造',allname:'新一代信息技术产业->下一代信息网络产业->网络设备制造',"chkDisabled":false},
    {id:'001001002',pId:'001001',name:'新型计算机及信息终端设备制造',allname:'新一代信息技术产业->下一代信息网络产业->新型计算机及信息终端设备制造',"chkDisabled":false},
    {id:'001001003',pId:'001001',name:'信息安全设备制造',allname:'新一代信息技术产业->下一代信息网络产业->信息安全设备制造',"chkDisabled":false},

 特别注意一下:"chkDisabled":flase表示的是最后一个节点 是可选的,如果是true,那说明有下一级节点,本节点不可选。

这种形式的格式怎么生成,看下面的sql

---- 数据库操作完成后 要生成代码中识别的形式
select '{'||a||','||b||','||c||','||d||','||e||'},' from (
select distinct 'id:'||''''||c1||'''' a,'pId:'||''''||-1||'''' b,'name:'||''''||n1||'''' c,'allname:'||''''||n1||'''' d,'"chkDisabled":'||'true' e from aa 
union all
select distinct 'id:'||''''||c1||c2||'''' a,'pId:'||''''||c1||'''' b,'name:'||''''||n2||'''' c,'allname:'||''''||n1||'->'||n2||'''' d,'"chkDisabled":'||'true' e from aa 
union all
select distinct 'id:'||''''||c1||c2||c3||'''' a,'pId:'||''''||c1||c2||'''' b,'name:'||''''||n3||'''' c,'allname:'||''''||n1||'->'||n2||'->'||n3||'''' d,'"chkDisabled":'||'false' e from aa where n4 =''
union all
select distinct 'id:'||''''||c1||c2||c3||'''' a,'pId:'||''''||c1||c2||'''' b,'name:'||''''||n3||'''' c,'allname:'||''''||n1||'->'||n2||'->'||n3||'''' d,'"chkDisabled":'||'true' e from aa where n4 <>''
union all
select 'id:'||''''||c1||c2||c3||c4||'''' a,'pId:'||''''||c1||c2||c3||'''' b,'name:'||''''||n4||'''' c,'allname:'||''''||n1||'->'||n2||'->'||n3||'->'||n4||'''' d,'"chkDisabled":'||'false' e from aa where n4 <>''
 order by b,a )

 验证按照js中的形式来执行sql,sql中直接处理一对单引号括起来的值,在数据库中4个单引号才是一个单引号。