精华内容
下载资源
问答
  • js代码-js下的excel公式

    2021-07-16 15:58:17
    js代码-js下的excel公式
  • 大多数Microsoft Excel公式函数JavaScript实现 用法 公式取决于以下开放源Javascript库:Numeric,NumeralJs和jStats。 包括以下内容,以便在浏览器中使用Formula.js: <!-- Numeric --> < script src =...
  • Excel公式开发的施工测量数据计算表V1.4.xls
  • excel常用函数公式及技巧搜集 从身份证号码中提取出生年月日 从身份证号码中提取出性别 从身份证号码中进行年龄判断 按身份证号号码计算至今天年龄 以2006年10月31日为基准日,按按身份证计算年龄(周岁)的公式 按...
  • Excel2010函数公式释义及示例大全 ,有目录可点击调转,非常适用白领和单位办公使用,每一个函数讲的非常详细且有例子说明告知如何使用
  • ruleJS, 解析excel公式的Javascript库 RuleJS和excel库一样,解析公式( 。演示工具) 。:如何运行npm安装grunt启动( 在浏览器 http://localhost:8080 中打开)许可证MIT许可证( 请参阅许可文件以获得全文)
  • 利用Excel公式进行月度季度相关日期计算.rar,本例内容包括:1、返回月末、季度末日期;2、求每季度止息日期;3、确定一个日期所属的季度、半年度。
  • C#NPOI获取EXCEL单元格公式计算值,测试日期、数字和字符串均没有问题,参数类型:ICell,没用不收费,请勿转发,个人原创。
  • 网上相关代码已经汗毛充栋了,但对于临时使用一次性使用来讲,写代码的效率显然是不高的。 ...自己根据代码整理了一个excel文档,见附件,可批量实现高德坐标点向百度坐标点的转换。 您值得下载!
  • Excel公式计算引擎 语法参考 。 而且这种语法具有左递归。 我们用来消除它。 在制品
  • 这是一份Excel公式与常用函数整理资料,方便大家学习与快速查询
  • 通过EXCEL公式,拼接Oracle数据库插入语句。开发过程造数测试或导入初始化数据的时候很方便。
  • 公式:Python中的Excel公式解释器。 释放: 1.1.0 日期: 2021-02-16 21:30:00 资料库: pypi-repo: docs: 维基: 下载: 捐: 关键字: excel,公式,解释器,编译器,调度 开发人员: 执照: EUPL...
  • 用于JavaScript的Excel公式实用程序是一个可用于漂亮地打印excel公式或将excel公式转换为JavaScript的库。 该库生成JavaScript不会自己执行。 您需要包含诸如以涵盖Excel中的所有功能。 ##使用npm安装npm install ...
  • Excel 公式解析引擎,用于支持公式输入编辑器的智能提示、单元格之间的公式依赖计算、公式的求值、语法校验。 本 SDK 可以与各类编辑器(或输入框)、表格组件配合使用。 支持公式的语法解析、单元格地址解析、...
  • 简易的酒店管理中Excel公式应用,可以根据入住的价格、日期、房间自动核算出每个房间的每个月的收入。
  • Excel 公式大全

    2018-04-07 12:05:46
    Excel 公式大全,快速编辑Excel中的数据,希望对大家的工作有帮助。
  • Excel公式向导,是一款Excel插件工具。它能够让你不懂公式,也能轻轻松松设计好公式,提高工作效率。本版本采用VSTO开发,支持32位和64位Office,支持Excel2007至2016各版本。(不支持Ex
  • 埃克塞洛 用Typescript编写的Excel公式语言解析器
  • Excel函数公式讲解,重点介绍了区域、公式、函数和数据分析工具。
  • python实现excel公式格式化

    万次阅读 多人点赞 2020-12-22 08:55:24
    有了这样的需求,小小明就有了解决问题的想法,说干就干于是一个比较牛逼的excel公式格式化的工具出现了。 效果体验 先看看效果吧: =IF(C11>100%*C4,IF(C11<=200%*C4,C11*50%-C4*15%,C11*60%-C4*35%),IF(C11&...

    小小明:

    image-20201214183728916

    之前跟一些小伙伴有个讨论:

    image-20201214091536248

    可以看到很多跟数据打交道的人,都面对过很复杂的excel公式嵌套层数特别多,肉眼观看很容易蒙圈。在这样的需求背景,小小明就为了解决大家的痛点,就做了一个牛逼的excel公式格式化的工具。

    效果体验

    先看看效果吧:

    =IF(C11>100%*C4,IF(C11<&
    展开全文
  • Formula.go Microsoft Excel公式函数的Golang实现。 受启发
  • C#实现EXCEL公式编辑

    2012-11-30 06:51:50
    C#实现EXCEL公式编辑 里面附带部分其他功能
  • Excel公式自动重算VBA代码,真正解决公式无法自动计算的问题。
  • NULL 博文链接:https://wjason.iteye.com/blog/1317323
  • EXCEL公式与函数

    2015-11-12 15:29:54
    EXCEL公式与函数课件,上课用的flash课件
  • Excel公式示例

    2015-11-11 20:39:28
    Excel公式示例.
  • Excel 公式编辑器是一款简单高效的公式编辑器,它涵盖了office excel 所有较新的函数。能够帮助使用者快速编写成熟可控的函数公式。其编辑器具有以下功能。软件功能:1、代码高亮显
  • Excel公式太复杂?我花一晚上做了个格式化工具

    万次阅读 多人点赞 2020-12-24 16:10:35
    """ 将excel公式字符串,按照一定的规则切割成数组 :param excel_func_text: 被切割的excel公式字符串 :return: 切割后的结果 """ excel_func_text = excel_func_text.replace('\n', '').replace('\r', '') ...

    作者:小小明

    作者简介:

    小小明,熟悉python、java、scala,了解go、c/c++。10年左右编码经验,逻辑思维能力良好,做过windows应用程序开发和大数据开发与运维,会大数据、web全栈开发、自动化办公、pandas数据处理,了解区块链开发、机器学习、 VBA、爬虫。

    之前在交流群跟一些小伙伴有个讨论:

    (凹凸数据公众号后台回复“进群”即可加群)

    大概就是很多跟数据打交道的人都需要面对过很复杂的excel,嵌套层数特别多,肉眼观看很容易蒙圈。有了这样的需求,小小明就有了解决问题的想法,说干就干于是一个比较牛逼的excel公式格式化的工具出现了。

    效果体验

    先看看效果吧:

    =IF(C11>100%*C4,IF(C11<=200%*C4,C11*50%-C4*15%,C11*60%-C4*35%),IF(C11<=C4*50%,C11*30%,C11*40%-C4*5%))
    

    的格式化结果是:

    =IF(
      C11>100%*C4,
      IF(
        C11<=200%*C4,
        C11*50%-C4*15%,
        C11*60%-C4*35%
      ),
      IF(
        C11<=C4*50%,
        C11*30%,
        C11*40%-C4*5%
      )
    )
    
    (SMA(MAX(CLOSE-DELAY(CLOSE,1),0),12,1)/SMA(ABS(CLOSE-DELAY(CLOSE,1)),12,1)*100-MIN(SMA(MAX(CLOSE-DELAY(
    CLOSE,1),0),12,1)/SMA(ABS(CLOSE-DELAY(CLOSE,1)),12,1)*100,12))/(MAX(SMA(MAX(CLOSE-DELAY(CLOSE,1),0),12,
    1)/SMA(ABS(CLOSE-DELAY(CLOSE,1)),12,1)*100,12)-MIN(SMA(MAX(CLOSE-DELAY(CLOSE,1),0),12,1)/SMA(ABS(
    CLOSE-DELAY(CLOSE,1)),12,1)*100,12))
    

    的格式化结果为:

    (
      SMA(MAX(CLOSE-DELAY(CLOSE,1),0),12,1)
      /
      SMA(ABS(CLOSE-DELAY(CLOSE,1)),12,1)
      *
      100-MIN(
        SMA(MAX(CLOSE-DELAY(CLOSE,1),0),12,1)
        /
        SMA(ABS(CLOSE-DELAY(CLOSE,1)),12,1)*100,
        12
      )
    )
    /
    (
      MAX(
        SMA(MAX(CLOSE-DELAY(CLOSE,1),0),12,1)
        /
        SMA(ABS(CLOSE-DELAY(CLOSE,1)),12,1)*100,
        12
      )
      -
      MIN(
        SMA(MAX(CLOSE-DELAY(CLOSE,1),0),12,1)
        /
        SMA(ABS(CLOSE-DELAY(CLOSE,1)),12,1)*100,
        12
      )
    )
    
    =IF(ROW()>COLUMN(),"",IF(ROW()=COLUMN(),$B15,ROUNDDOWN($B15*INDIRECT(SUBSTITUTE(ADDRESS(1,3+COLUMN()-ROW(),
    4),1,"")&56),0)))
    

    的格式化结果为:

    =IF(
      ROW()>COLUMN(),
      "",
      IF(
        ROW()=COLUMN(),
        $B15,
        ROUNDDOWN(
          $B15*INDIRECT(
            SUBSTITUTE(ADDRESS(1,3+COLUMN()-ROW(), 4),1,"")
            &
            56
          ),
          0
        )
      )
    )
    

    如果你已经心动了,可以进入下滑到文末,点击阅读原文!直接使用体验!但本人不保证服务器一直会续费,网址能够永久使用。

    不过接下来,将公布这套格式化程序的完整代码和开发思想,有技术能力的小伙伴可以考虑改进该代码。

    完整代码

    __author__ = 'xiaoxiaoming'
    
    from collections import deque
    import re
    
    
    class Node:
        def __init__(self, parent=None, tab_size=0):
            self.parent = parent
            self.tab_size = tab_size
            self.data = []
    
        def is_single_node(self):
            for e in self.data:
                if not isinstance(e, str):
                    return False
            return True
    
        def get_single_text(self):
            return "".join(self.data)
    
    
    def split_text_blocks(excel_func_text):
        """
        将excel公式字符串,按照一定的规则切割成数组
        :param excel_func_text: 被切割的excel公式字符串
        :return: 切割后的结果
        """
        excel_func_text = excel_func_text.replace('\n', '').replace('\r', '')
        excel_func_text = re.sub(" +", " ", excel_func_text)
        lines = []
        i, j = 0, 0
        while j < len(excel_func_text):
            c = excel_func_text[j]
            if (c == '(' and excel_func_text[j + 1] != ')') or c == ',':
                lines.append(excel_func_text[i:j + 1])
                i = j = j + 1
            elif c == ')' and excel_func_text[j - 1] != '(':
                if i < j:
                    lines.append(excel_func_text[i:j])
                    i = j  # 起始文件块置于)处
                # 以下代码查找,如果中间不包含(或),则将)和,之间的文本块加入到划分结果
                k = excel_func_text.find(",", j + 1)
                l = excel_func_text.find("(", j + 1, k)
                m = excel_func_text.find(")", j + 1, k)
                if k != -1 and l == -1 and m == -1:
                    lines.append(excel_func_text[i:k + 1])
                    i = j = k + 1
                elif j + 1 < len(excel_func_text) and excel_func_text[j + 1] != ')':
                    lines.append(")")
                    lines.append(excel_func_text[j + 1])
                    i = j = j + 2
                else:
                    lines.append(")")
                    i = j = j + 1
            elif c == '"':
                j = excel_func_text.find('"', j + 1) + 1
            else:
                j += 1
        return lines
    
    
    blank_char_count = 2
    
    
    def combine_node(root, text_max_length=60, max_combine_layer=3):
        """
        合并最内层的只有纯文本子节点的节点为单个文本节点
        :param root: 被合并的节点
        :param text_max_length: 合并后的文本长度不超过该参数,则应用该合并替换原节点
        :param max_combine_layer: 最大合并层数
        :return:
        """
        for _ in range(max_combine_layer):
            no_change = True
            stack = deque([root])
            while stack:
                node = stack.pop()
                tmp = {}
                for i, e in enumerate(node.data):
                    if isinstance(e, Node):
                        if e.is_single_node():
                            single_text = e.get_single_text()
                            if len(single_text) < text_max_length:
                                tmp[i] = single_text
                        else:
                            stack.append(e)
                for i, e in tmp.items():
                    node.data[i] = e
                if len(tmp) != 0:
                    no_change = False
            if no_change:
                break
    
    
    def node_next_line(node):
        for i, e in enumerate(node.data):
            if isinstance(e, str):
                if i == 0 or i == len(node.data) - 1:
                    tab = node.tab_size - 1
                else:
                    tab = node.tab_size
                yield f"{' ' * blank_char_count * tab}{e}"
            else:
                yield from node_next_line(e)
                
    
    def excel_func_format(excel_func_text, blank_count=2, combine_single_node=True, text_max_length=60,
                          max_combine_layer=3):
        """
        将excel公式格式化成比较容易阅读的格式
        :param excel_func_text: 被格式化的excel公式字符串
        :param blank_count: 最终显示的格式化字符串的1个tab用几个空格表示
        :param combine_single_node: 是否合并纯文本节点,该参数设置为True后面的参数才生效
        :param text_max_length: 合并后的文本长度不超过该参数,则应用该合并替换原节点
        :param max_combine_layer: 最大合并层数
        :return: 格式化后的字符串
        """
        global blank_char_count
        blank_char_count = blank_count
        blocks = split_text_blocks(excel_func_text)
        # print("\n".join(blocks))
        # print('-----------拆分结果-----------')
        tab_size = 0
        node = root = Node()
        for block in blocks:
            if block.endswith("("):
                tab_size += 1
                child_node = Node(node, tab_size)
                node.data.append(child_node)
                node = child_node
                node.data.append(block)
            elif block.startswith(")"):
                tab_size -= 1
                node.data.append(block)
                node = node.parent
            else:
                node.data.append(block)
        if combine_single_node:
            combine_node(root, text_max_length, max_combine_layer)
        result = [line for line in node_next_line(root)]
        return "\n".join(result)
    

    处理流程浅析

    下面都以如下公式作为示例:

    =IF(ROW()>COLUMN(),"",IF(ROW()=COLUMN(),$B15,ROUNDDOWN($B15*INDIRECT(SUBSTITUTE(ADDRESS(1,3+COLUMN()-ROW(),
    4),1,"")&56),0)))
    

    文本分块切分

    def split_text_blocks(excel_func_text):
        """
        将excel公式字符串,按照一定的规则切割成数组
        :param excel_func_text: 被切割的excel公式字符串
        :return: 切割后的结果
        """
        excel_func_text = excel_func_text.replace('\n', '').replace('\r', '')
        excel_func_text = re.sub(" +", " ", excel_func_text)
        lines = []
        i, j = 0, 0
        while j < len(excel_func_text):
            c = excel_func_text[j]
            if (c == '(' and excel_func_text[j + 1] != ')') or c == ',':
                lines.append(excel_func_text[i:j + 1])
                i = j = j + 1
            elif c == ')' and excel_func_text[j - 1] != '(':
                if i < j:
                    lines.append(excel_func_text[i:j])
                    i = j  # 起始文件块置于)处
                # 以下代码查找,如果中间不包含(或),则将)和,之间的文本块加入到划分结果
                k = excel_func_text.find(",", j + 1)
                l = excel_func_text.find("(", j + 1, k)
                m = excel_func_text.find(")", j + 1, k)
                if k != -1 and l == -1 and m == -1:
                    lines.append(excel_func_text[i:k + 1])
                    i = j = k + 1
                elif j + 1 < len(excel_func_text) and excel_func_text[j + 1] != ')':
                    lines.append(")")
                    lines.append(excel_func_text[j + 1])
                    i = j = j + 2
                else:
                    lines.append(")")
                    i = j = j + 1
            elif c == '"':
                j = excel_func_text.find('"', j + 1) + 1
            else:
                j += 1
        return lines
    
    s = """=IF(ROW()>COLUMN(),"",IF(ROW()=COLUMN(),$B15,ROUNDDOWN($B15*INDIRECT(SUBSTITUTE(ADDRESS(1,3+COLUMN()-ROW(),
            4),1,"")&56),0))) """
    
    blocks = split_text_blocks(s)
    for block in blocks:
        print(block)
    

    的运行结果为:

    =IF(
    ROW()>COLUMN(),
    "",
    IF(
    ROW()=COLUMN(),
    $B15,
    ROUNDDOWN(
    $B15*INDIRECT(
    SUBSTITUTE(
    ADDRESS(
    1,
    3+COLUMN()-ROW(),
     4
    ),
    1,
    ""
    )
    &
    56
    ),
    0
    )
    )
    )
    

    这端代码首先替换掉所有的换行符,将多个空格替换为单个空格,然后将左右括号和逗号作为切分点进行切分。

    但存在一些特殊情况,例如ROW()和COLUMN()括号内部没有任何内容,所有这种括号应该作为普通字符处理,另外被""包含的字符串可能包含括号,也应该作为普通字符。

    构建多叉树层次结构

    设计数据结构:

    class Node:
        def __init__(self, parent=None, tab_size=0):
            self.parent = parent
            self.tab_size = tab_size
            self.data = []
    

    parent存储父节点的指针,tab_size存储当前节点的层级,data存储当前节点的所有数据。

    构建代码:

    tab_size = 0
    node = root = Node()
    for block in blocks:
        if block.endswith("("):
            tab_size += 1
            child_node = Node(node, tab_size)
            node.data.append(child_node)
            node = child_node
            node.data.append(block)
        elif block.startswith(")"):
            tab_size -= 1
            node.data.append(block)
            node = node.parent
        else:
            node.data.append(block)
    

    构建完毕后,这段数据在内存中的结构(仅展示data)如下:

    遍历打印这颗多叉树

    def node_next_line(node):
        for i, e in enumerate(node.data):
            if isinstance(e, str):
                if i == 0 or i == len(node.data) - 1:
                    tab = node.tab_size - 1
                else:
                    tab = node.tab_size
                yield f"{' ' * 2 * tab}{e}"
            else:
                yield from node_next_line(e)
                
    result = [line for line in node_next_line(root)]
    print("\n".join(result))
    

    结果:

    =IF(
      ROW()>COLUMN(),
      "",
      IF(
        ROW()=COLUMN(),
        $B15,
        ROUNDDOWN(
          $B15*INDIRECT(
            SUBSTITUTE(
              ADDRESS(
                1,
                3+COLUMN()-ROW(),
                 4
              ),
              1,
              ""
            )
            &
            56
          ),
          0
        )
      )
    )
    

    合并最内层的节点

    显然将最内层的node5节点合并一下阅读性更好:

    首先给数据结构增加判断是否为纯文本节点的方法:

    class Node:
        def __init__(self, parent=None, tab_size=0):
            self.parent = parent
            self.tab_size = tab_size
            self.data = []
    
        def is_single_node(self):
            for e in self.data:
                if not isinstance(e, str):
                    return False
            return True
    
        def get_single_text(self):
            return "".join(self.data)
    

    下面是合并纯文本节点的实现,max_combine_layer决定了合并的最大次数,如果合并后长度超过text_max_length参数,则不应用这次合并:

    from collections import deque
    
    def combine_node(root, text_max_length=60, max_combine_layer=3):
        """
        合并最内层的只有纯文本子节点的节点为单个文本节点
        :param root: 被合并的节点
        :param text_max_length: 合并后的文本长度不超过该参数,则应用该合并替换原节点
        :param max_combine_layer: 最大合并层数
        :return:
        """
        for _ in range(max_combine_layer):
            no_change = True
            stack = deque([root])
            while stack:
                node = stack.pop()
                tmp = {}
                for i, e in enumerate(node.data):
                    if isinstance(e, Node):
                        if e.is_single_node():
                            single_text = e.get_single_text()
                            if len(single_text) < text_max_length:
                                tmp[i] = single_text
                        else:
                            stack.append(e)
                for i, e in tmp.items():
                    node.data[i] = e
                if len(tmp) != 0:
                    no_change = False
            if no_change:
                break
    

    合并一次:

    combine_node(root, 100, 1)
    result = [line for line in node_next_line(root)]
    print("\n".join(result))
    

    结果:

    =IF(
      ROW()>COLUMN(),
      "",
      IF(
        ROW()=COLUMN(),
        $B15,
        ROUNDDOWN(
          $B15*INDIRECT(
            SUBSTITUTE(
              ADDRESS(1,3+COLUMN()-ROW(), 4),
              1,
              ""
            )
            &
            56
          ),
          0
        )
      )
    )
    

    合并二次:

    combine_node(root, 100, 2)
    result = [line for line in node_next_line(root)]
    print("\n".join(result))
    

    结果:

    =IF(
      ROW()>COLUMN(),
      "",
      IF(
        ROW()=COLUMN(),
        $B15,
        ROUNDDOWN(
          $B15*INDIRECT(
            SUBSTITUTE(ADDRESS(1,3+COLUMN()-ROW(), 4),1,"")
            &
            56
          ),
          0
        )
      )
    )
    

    合并三次:

    combine_node(root, 100, 3)
    result = [line for line in node_next_line(root)]
    print("\n".join(result))
    

    结果:

    =IF(
      ROW()>COLUMN(),
      "",
      IF(
        ROW()=COLUMN(),
        $B15,
        ROUNDDOWN(
          $B15*INDIRECT(SUBSTITUTE(ADDRESS(1,3+COLUMN()-ROW(), 4),1,"")&56),
          0
        )
      )
    )
    

    合并三次后的内存情况:

    体验网址

    http://xiaoxiaoming.xyz:8088/excel

    不保证永久有效。

    展开全文
  • XLParser, 一种 99.9 % 兼容率的Microsoft Excel公式的C# 解析器 XLParser具有以下属性的C# Excel公式分析器:高XLParser已经在a 个真实世界公式上进行了测试,并拥有 99.9 % 成功解析率。compact 解析树XLParser被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,221
精华内容 20,088
关键字:

excel公式