文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Excel导入数据,数据带有层级,最终生成树形结构数据

2023-09-03 08:08

关注

Excel数据表示例:

科室1

科室1.1

科室1.2

科室1.2.1

科室1.2.2

科室1.2.3

科室1.3

科室2

科室2.1

科室2.2

科室2.2.1

科室2.2.1.1

科室2.2.1.1

 

方法主要思想:类似于指针的一个思想

导入数据:引用扩展或者包,根据实际情况来决定

PHP 两种方式:

  1.  先上传文件,再打开文件     

set_time_limit(0);

$file = fopen($_FILES['file']['tmp_name'], 'r');

$data = eval('return ' . iconv('gbk', 'utf-8', var_export($data, true)) . ';');//编码转换                

$data = array_filter($data); //数据处理,处理成合格的格式

  1.  扩展(PHPExcel)解析获取内容

//文件数据

$fileObjArr=””;  

//文件存放目录

$saveFolderName = "";

 //拼接路径(相对路径)

$fileName = $importTime.$fileSufName;

//拼接路径(绝对路径)

$urlpre = $_SERVER['DOCUMENT_ROOT']."/upload/".$saveFolderName."/";

//上传文件

!is_dir($urlpre)&&mkdir($urlpre,0777,true);

$saveurl = $urlpre.$fileName;

move_uploaded_file($fileObjArr['myfile']['tmp_name'], $saveurl);

set_time_limit(0);

$excelpath = $saveurl;

//引入扩展

$this->load->library("PHPExcel/PHPExcel");

$this->load->library("PHPExcel/PHPExcel/IOFactory");

$objReader = IOFactory::createReader('Excel2007');

//需要使用xlsx格式的表格

$objPHPExcel = $objReader->load($excelpath);

//读取表格数据后,删除服务器表格文件

unlink($excelpath);

// 只读取数据,忽略所有空白行

$objReader->setReadDataOnly(true);

$sheet = $objPHPExcel->getSheet(0);

//取得总行数

$highestRow = $sheet->getHighestRow();

$highestColumn = $sheet->getHighestColumn();

//取得总列数

$highestColumn = PHPExcel_Cell::columnIndexFromString($highestColumn);

//初始化容器

$cellValue ='';

//从第二行开始读取数据

for ($j=1; $j<=$highestRow; $j++) {    

//从A列开始读取数据

  for ($k=0; $k<$highestColumn; $k++) {

         $columnIndex = PHPExcel_Cell::stringFromColumnIndex($k);

         $cellValue .= $sheet->getCell($columnIndex.$j)->getValue().',';//读取单元格

        }

 }

//转换成数组

$celldata = explode(',',$cellValue);

//切成数据块

$datas = array_chunk($celldata,$highestColumn);

经过上述方法的处理得到的数据,实际上是一个二维数组

一维Key值

二维Key值:0

二维Key值:1

二维Key值:2

二维Key值:3

0

科室1

/

/

/

1

/

科室1.1

/

/

2

/

科室1.2

/

/

3

/

/

科室1.2.1

/

4

/

/

科室1.2.2

/

5

/

/

科室1.2.3

/

6

/

科室1.3

/

/

7

科室2

/

/

/

8

/

科室2.1

/

/

9

/

科室2.2

/

/

10

/

/

科室2.2.1

/

11

/

/

/

科室2.2.1.1

12

/

/

/

科室2.2.1.2

表1.1

数组展示:

array(4) {

  [0]=>string(7) "科室1"

  [1]=>string(0) ""

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(9) "科室1.1"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(9) "科室1.2"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(11) "科室1.2.1"

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(11) "科室1.2.2"

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(11) "科室1.2.3"

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(9) "科室1.3"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(7) "科室2"

  [1]=>string(0) ""

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=> string(9) "科室2.1"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(9) "科室2.2"

  [2]=>string(0) ""

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(11) "科室2.2.1"

  [3]=>string(0) ""

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(0) ""

  [3]=>string(13) "科室2.2.1.1"

}

array(4) {

  [0]=>string(0) ""

  [1]=>string(0) ""

  [2]=>string(0) ""

  [3]=>string(13) "科室2.2.1.2"

}

数据重组:

Key值

name

level

parent_key(参考1.1表一维Key值)

0

科室1

1

0

1

科室1.1

2

0

2

科室1.2

2

0

3

科室1.2.1

3

2

4

科室1.2.2

3

2

5

科室1.2.3

3

2

6

科室1.3

2

0

7

科室2

1

0

8

科室2.1

2

7

9

科室2.2

2

7

10

科室2.2.1

3

9

11

科室2.2.1.1

4

10

12

科室2.2.1.2

4

10

表1.2

数据展示:

array(13) {

  [0]=>

  array(3) {

    ["name"]=>string(7) "科室1"

    ["parent_key"]=>int(0)

    ["level"]=>int(1)

  }

  [1]=>

  array(3) {

    ["name"]=>string(9) "科室1.1"

    ["parent_key"]=>int(0)

    ["level"]=>int(2)

  }

  [2]=>

  array(3) {

    ["name"]=>string(9) "科室1.2"

    ["parent_key"]=>int(0)

    ["level"]=>int(2)

  }

  [3]=>

  array(3) {

    ["name"]=>string(11) "科室1.2.1"

    ["parent_key"]=>int(2)

    ["level"]=>int(3)

  }

  [4]=>

  array(3) {

    ["name"]=>string(11) "科室1.2.2"

    ["parent_key"]=>int(2)

    ["level"]=>int(3)

  }

  [5]=>

  array(3) {

    ["name"]=>string(11) "科室1.2.3"

    ["parent_key"]=>int(2)

    ["level"]=>int(3)

  }

  [6]=>

  array(3) {

    ["name"]=>string(9) "科室1.3"

    ["parent_key"]=>int(0)

    ["level"]=>int(2)

  }

  [7]=>

  array(3) {

    ["name"]=>string(7) "科室2"

    ["parent_key"]=>int(0)

    ["level"]=>int(1)

  }

  [8]=>

  array(3) {

    ["name"]=>string(9) "科室2.1"

    ["parent_key"]=>int(7)

    ["level"]=>int(2)

  }

  [9]=>

  array(3) {

    ["name"]=>string(9) "科室2.2"

    ["parent_key"]=>int(7)

    ["level"]=>int(2)

  }

  [10]=>

  array(3) {

    ["name"]=>string(11) "科室2.2.1"

    ["parent_key"]=> int(9)

    ["level"]=>int(3)

  }

  [11]=>

  array(3) {

    ["name"]=>string(13) "科室2.2.1.1"

    ["parent_key"]=>int(10)

    ["level"]=>int(4)

  }

  [12]=>

  array(3) {

    ["name"]=>string(13) "科室2.2.1.2"

    ["parent_key"]=> int(10)

    ["level"]=>int(4)

  }

}

如表1.2现在所有的数据已经整理成为具有层级关系的数组(二维数组包含树结构),数据入库,获取插入数据的主键id,方便数据库表里面建立树形关系(id,fid:  子级数据fid = 父级数据的id)

//初始化容器

$array = [];

//1.循环插入数据(边插入边取值:数据已经是  树根->末尾树叶   结构,所以可以采用这种方法)

//2.循环插入数据(可以先插入一级,再插入二级数据,递归调用,直到最后节点,具体情况采用不同的方法)

foreach ($arr as $key=>$v){

    $_data = [

     'fid'=>$v['level']==1 ? 0 : ($array[$v['parent_key']]['id']?$array[$v['parent_key']]['id']:0),

        'name'=>$v['name'],

        'level'=>$v['level']

         ];

    $this->db->insert('表名',$_data);

    $v['id'] = $this->db->insert_id();

    $array[] = $v;

}

如此操作,数据入表后就是整理好的树形结构

来源地址:https://blog.csdn.net/masterphp/article/details/128042077

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯