zoukankan      html  css  js  c++  java
  • 用AutoHotkey实现 iThoughts 思维导图节点文本一键转到Excel

    iThoughts 复制节点,获取数据的格式是:

    11
        21
        22
            31
            32
    12
    

    目的是转成Excel的表格格式:

    11 21
    11 22 31
    11 22 32
    12

    核心就是用 AutoHotkey 实现字符串的转换,

    并把数据转为 Excel 识别的数组 arrA,

    再用 vba 把 arrA写入当前单元格即可

    F9::
    clipboard := ""
    send("{ctrl down}c{ctrl up}")
    if !ClipWait(1)
        return
    arrA := indent2table(clipboard, true)
    ;根据 arrA 的尺寸获取 Excel 表对应的区域 rng
    rng := ComObjActive("Excel.application").ActiveCell.resize(arrA.MaxIndex(1)+1,arrA.MaxIndex(2)+1)
    ;rng.NumberFormat := "@"
    rng.value := arrA
    rng.EntireColumn.AutoFit() ;自动列宽
    WinActivate("ahk_class XLMAIN")
    return
    
    indent2table(strAll, toArrayA:=false)
    {
        cnt := 4 ;每级空格的数量
        arrLine := [] ;这是临时的,匹配完整一行后才会添加到arrRes
        arrRes := [] ;结果,每项为数组
        cs := 0 ;最大列号
        loop parse, strAll, "`n", "`r"
        {
            ;过滤空行
            if !strlen(trim(A_LoopField))
                continue
            ;去掉右边的空白
            sLine := rtrim(A_LoopField)
            ;行首有空白字符
            if (sLine ~= "^s")
            {
                ;获取等级(没空白为1)
                level := ((strlen(sLine) - strlen(ltrim(sLine))) // cnt) + 1
                ;清空左空白
                sLine := ltrim(sLine)
                ;NOTE 处理逻辑
                lenLast := arrLine.length()
                if (level == lenLast + 1) ;上一行的下级
                    arrLine.push(sLine)
                else
                {
                    ;添加结果并记录最大列号 cs NOTE 用 clone
                    arrRes.push(arrLine.clone())
                    if (arrLine.length() > cs)
                        cs := arrLine.length()
                    ;设置 arrLine[level]
                    arrLine[level] := sLine
                    ;清空 arrLine[level] 及后面的内容
                    if (lenLast > level)
                    {
                        loop(lenLast - level)
                            arrLine.pop()
                    }
                }
            }
            else ;第1级
            {
                ;添加结果并记录最大列号 cs
                if arrLine.length()
                {
                    arrRes.push(arrLine.clone())
                    if (arrLine.length() > cs)
                        cs := arrLine.length()
                }
                ;重置 arrLine
                arrLine := [sLine]
            }
        }
        ;添加最后一个结果
        arrRes.push(arrLine)
        if !toArrayA
            return arrRes
        ;转成 arrayA 供Excel写入
        rs := arrRes.length()
        arrA := ComObjArray(12, rs, cs)
        loop(rs)
        {
            r := A_Index
            for _, v in arrRes[r]
                arrA[r-1,A_Index-1] := v
        }
        return arrA
    }
  • 相关阅读:
    MapReduce的DBInputFormat使用
    HDFS NameNode与DataNode介绍
    Hadoop的SequenceFile读实例
    Hadoop的SequenceFile读写实例
    MapReduce工作流程详解
    hadoop使用yarn运行mapreduce的过程
    MapReduce的WordCount
    Hadoop的SequenceFile写实例
    Spring的拦截器和监听器
    Hadoop简介
  • 原文地址:https://www.cnblogs.com/hyaray/p/12820005.html
Copyright © 2011-2022 走看看