ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3884|回复: 37

[原创] 树形节点绘制

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2023-9-4 08:10 | 显示全部楼层 |阅读模式

TA的精华主题

TA的得分主题

发表于 2023-9-4 08:17 | 显示全部楼层
值得学习,先收着

TA的精华主题

TA的得分主题

发表于 2023-9-4 08:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
还没仔细研究,但是粗看代码很厉害,谢谢分享!

TA的精华主题

TA的得分主题

发表于 2023-9-4 08:54 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-9-4 09:00 来自手机 | 显示全部楼层
js不错。
'发个php的热闹热闹
<!DOCTYPE html>
<html>
<head>
<title>treePicker</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes, minimum-scale=1.0, maximum-scale=3.0">

<style>
.hidden{display:none;}
li:hover{background:yellow}
</style>
<script type="text/javascript">
window.onerror=function(msg){

alert(msg)

}
</script>
<script>
doCopy=function (text){
        if(isIE()){
        document.body.extend.doSomething(text)
       
        }else{

var Url2=document.getElementById("biao1");
Url2.value=text;
    Url2.select(); // 选择对象
    document.execCommand("Copy");        
       
        }
}

</script>
</head>
<body>

<input type=search id="filter" onblur="" onkeyup="doFilter()" ><input type=button value=筛选 onclick=doFilter()>
<?php
error_reporting(E_ERROR|E_PARSE);


$db=new \PDO("sqlite:".$_SERVER["DOCUMENT_ROOT"]."/EData/tooldb/sqlite**.db");
$tableName="tree_view_picker";
//header("Content-type: text/html; charset=utf-8");
/**********************
一个简单的目录递归函数
第一种实现办法:用dir返回对象
***********************/
function get_dir($directory){
        global $db,$tableName;

$sql="select Child from $tableName where Parent like '{$directory}'";
//echo $sql;
$result=$db->query($sql)->fetchAll();
//print_r($result);
return $result;

}
function tree($directory,$level=0)
{
        $mydir=get_dir($directory);
        if((!$mydir)) return;
        if($level>0){
       
        echo "<ul class=\"hidden\">\n";
        }else{
        echo "<ul>\n";
       
        }
       
        foreach($mydir as $file){

                        //echo "<li  onclick=\"opentree(this)\"><font color=\"#ff00cc\"><b>${file["Child"]}</b></font><input type=button value=Copy onclick=\"copyAndPaste('${file["Child"]}')\"></li>\n";
                        echo "<li ><b onclick=\"opentree(this)\">${file["Child"]}</b><input type=button value='Copy' onclick=\"doCopy('${file["Child"]}')\"></li>\n";
                        $level++;
                        tree($file["Child"],$level);
        } //while

        echo "</ul>\n";

} //funcion
//开始运行
//echo "<h2></h2>";
//tree("sdcard0");
//echo dirname(__FILE__);
tree("ROOT",0);



?>
<textarea cols="16" rows="1" id="biao1">选定的科目</textarea>
<script>
function isIE()
{
        if(!!window.ActiveXObject || "ActiveXObject" in window)
                return true;
        else
                return false;
}

</script>

<script>
if(!isIE()){
opentree=function (myNode){
//alert(myNode.parentNode.innerHTML)
        ul=myNode.parentNode.nextSibling.nextElementSibling;
        if(ul==null) return;
        if(ul.tagName!="UL") return;
//        ul=myNode.parentNode.nextSibling.nextElementSibling;
       
        var sh=ul.classList.contains('hidden');
        if(sh){
                ul.classList.remove('hidden');
       
        }else{
       
                ul.classList.add('hidden');
        }
       
       
}


}else{
opentree=function (myNode) {

    var ul = myNode.nextSibling;
   
    // Find the next sibling with tagName 'UL'
    while (ul && ul.tagName !== 'UL') {
        ul = ul.nextSibling;
    }
   
    if (ul) {
        // Check if class 'hidden' is present
        var sh = ul.className.indexOf('hidden') !== -1;
        
        if (sh) {
            // Remove class 'hidden'
            ul.className = ul.className.replace(/\bhidden\b/g, '');
        } else {
            // Add class 'hidden'
            ul.className += ' hidden';
        }
    }
}


}
</script>
<script>
function doFilter(){
//alert(document.getElementById("filter").value)
var _date = new Date();
  _date.setDate(_date.getDate()+30);
  document.cookie  = 'filter='+document.getElementById("filter").value+';expires='+_date.toGMTString();
iniFilter();
}
function iniFilter(){
var cookie_filter=document.cookie.split(";")[0];
var cookie_filter=cookie_filter.split("=")[1];
//document.getElementById("filter").value=cookie_filter
var links=document.getElementsByTagName("li");
for(i=0;i<links.length;i++){
//alert(links.getAttribute("class"))
//alert(links.className)
//console.log("links",links.innerText)
//console.log("pat",pat)
//var Reg=/show/;
var pat=document.getElementById("filter").value;
Reg = new RegExp(pat);

if(!Reg.exec(links.innerText)){
links.className="hidden test"
}//if
else{
links.className=""

}//elseif


}//for links
}// iniFilter
iniFilter();
</script>
</body>

</html>

Parent        Child
A001财务经理        A006出纳
A001财务经理        A002财务专员
root        A000总经理
A000总经理        A001财务经理
A001财务经理        A007出纳
A001财务经理        A004财务专员
A008销售经理        A010销售专员
A008销售经理        A009销售专员
A012生产经理        A013计划员
A008销售经理        A011销售专员
A012生产经理        A015计划员
A000总经理        A027成本经理
A021实习生        A028实习助理
A016计划员        A018计划助理
A012生产经理        A014计划员
A019计划助理        A021实习生
A019计划助理        A020见习生
A000总经理        A008销售经理
A001财务经理        A031会计
A031会计        A032会计助理
A001财务经理        A005财务专员
A000总经理        A012生产经理
A004财务专员        A024专员助理
A023见习生        A030见习助理
A031会计        A033会计助理
A030见习助理        A039临时工
A028实习助理        A040临时工
A016计划员        A019计划助理
A010销售专员        A026专员助理
A032会计助理        A034会计实习
A027成本经理        A036成本核查
A010销售专员        A022专员助理
A014计划员        A043计划助理
A025专员助理        A029实习生
A001财务经理        A003财务专员
A040临时工        A044临时工助理
A034会计实习        A038实习助理
A036成本核查        A041成本助理
A007出纳        A017专员助理
A022专员助理        A023见习生
A036成本核查        A037成本助理
A041成本助理        A042见习生
A027成本经理        A035成本统计
A012生产经理        A016计划员
A004财务专员        A025专员助理

https://b23.tv/MDvuS9D

TA的精华主题

TA的得分主题

发表于 2023-9-4 09:02 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个横向坐标是咋计算的?

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-4 09:12 来自手机 | 显示全部楼层
本帖最后由 今铭昔 于 2023-9-4 09:24 编辑
zpy2 发表于 2023-9-4 09:02
这个横向坐标是咋计算的?


根据递归深度(也是node的深度)depth。

Shape.Left = startLeft + node("depth") * gaps(1)

gaps(1)是父节点Shape.Left与其子节点Shape.Left的间隔宽度

我这里的注释有些小失误,gaps(0)是节点的纵向距离间隙,gaps(1)是左右图形Left的距离

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-9-4 10:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
建议搞一个可以向下绘制的,像组织架构图那种。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-4 12:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-9-4 12:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
代码设计的好,维护起来也方便,树图,常见的上下结构,左右结构,还有中心向外辐射结构。只需要结合平面坐标定位计算,就能自由切换了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 11:40 , Processed in 0.043489 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表