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

该博客介绍了如何使用PHP处理Excel数据,通过上传文件、读取内容,将数据整理为具有层级关系的二维数组。内容涉及编码转换、数据过滤、PHPExcel扩展的使用,以及如何重组数据形成树状结构,便于后续数据库存储和建立树形关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

}

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

### 如何在 Excel 中制作或使用树形图 要在 Excel 中创建或使用树形图,可以采用多种方法。以下是几种常见的技术及其具体实现方式: #### 方法一:通过手动设置分级显示数据 可以通过调整行缩进和分组的方式,在 Excel 中模拟树形图的效果。这种方法适合用于简单的层次结构展示。 - 首先按照层级关系排列好数据。 - 使用 `Alt` 键配合鼠标拖动来调整每一级的数据缩进程度[^4]。 - 接着利用 Excel 的“分类汇总”功能或者手动对不同级别的数据进行折叠/展开操作。 这种做法的优点在于不需要额外插件支持,并且可以直接编辑原始数据;缺点则是当数据量较大时维护起来较为复杂。 #### 方法二:借助条件格式化生成视觉上的状表示 如果希望得到更直观的图形化表现形式,则可以考虑运用Excel内置图表类型之一——状图(也叫Treemap),或者是依靠自定义形状加连线构建传统意义上的组织架构图样式。 对于前者而言只需要准备好相应的维度字段以及度量值之后便能快速生成一张反映各部分占比情况的地图视图[^2];而后者则可能需要用到SmartArt图形库中的"层次结构"类别下的模板来进行定制设计[^1]. 另外还有一种折衷方案就是应用VBA宏编程或是第三方加载项如Power Query & Power Pivot 来处理更加复杂的多层嵌套逻辑并最终呈现为交互式的仪表板界面供用户查询分析之用. #### 方法三:利用Python脚本自动化生成含图表的工作簿文件 当面临频繁更新的大规模数据集需求场景下, 可以尝试编写一段基于xlsxwriter库的小程序来自动生成带有指定样式的Excel文档连同其中所包含的各种统计报表一起打包导出给相关人员审阅.[^3] 下面给出一个简单例子演示如何向现有电子表格里插入柱状图对象: ```python import xlsxwriter workbook = xlsxwriter.Workbook('chart.xlsx') worksheet = workbook.add_worksheet() data = [[10, 20, 30], ['Category A', 'Category B', 'Category C']] for i in range(len(data)): worksheet.write_column(i, 0, data[i]) chart = workbook.add_chart({'type': 'column'}) chart.add_series({ 'categories': '=Sheet1!$B$1:$B$3', 'values': '=Sheet1!$A$1:$A$3' }) worksheet.insert_chart('D1', chart) workbook.close() ``` 以上代码片段展示了怎样创建一个新的Excel工作薄并将一组基本条目转化为垂直方向堆叠型别的直方图组件附加至特定单元格区域内.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值