日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python實(shí)現(xiàn)excel公式格式化的示例代碼

瀏覽:110日期:2022-07-01 13:51:25

之前跟一些小伙伴有個(gè)討論:

python實(shí)現(xiàn)excel公式格式化的示例代碼

大概就是很多跟數(shù)據(jù)打交道的朋友都面對(duì)過(guò)很復(fù)雜的excel公式,有時(shí)嵌套層數(shù)特別多,肉眼觀看很容易蒙圈。有了這樣的需求,我就有了解決問(wèn)題的想法,說(shuō)干就干,于是一個(gè)比較牛逼的excel公式格式化的工具就出現(xiàn)了。

效果體驗(yàn)

先看看效果吧:

=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%))

的格式化結(jié)果是:

=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% ))

python實(shí)現(xiàn)excel公式格式化的示例代碼

(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))

的格式化結(jié)果為:

( 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)))

的格式化結(jié)果為:

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

python實(shí)現(xiàn)excel公式格式化的示例代碼

(文末有體驗(yàn)網(wǎng)址)

不過(guò)接下來(lái),將公布這套格式化程序的完整代碼和開發(fā)思想,有技術(shù)能力的小伙伴可以考慮改進(jìn)該代碼。

完整代碼

__author__ = ’xiaoxiaoming’from collections import dequeimport reclass 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公式字符串,按照一定的規(guī)則切割成數(shù)組 :param excel_func_text: 被切割的excel公式字符串 :return: 切割后的結(jié)果 ''' 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 # 起始文件塊置于)處 # 以下代碼查找,如果中間不包含(或),則將)和,之間的文本塊加入到劃分結(jié)果 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 linesblank_char_count = 2def combine_node(root, text_max_length=60, max_combine_layer=3): ''' 合并最內(nèi)層的只有純文本子節(jié)點(diǎn)的節(jié)點(diǎn)為單個(gè)文本節(jié)點(diǎn) :param root: 被合并的節(jié)點(diǎn) :param text_max_length: 合并后的文本長(zhǎng)度不超過(guò)該參數(shù),則應(yīng)用該合并替換原節(jié)點(diǎn) :param max_combine_layer: 最大合并層數(shù) :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: breakdef 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個(gè)tab用幾個(gè)空格表示 :param combine_single_node: 是否合并純文本節(jié)點(diǎn),該參數(shù)設(shè)置為True后面的參數(shù)才生效 :param text_max_length: 合并后的文本長(zhǎng)度不超過(guò)該參數(shù),則應(yīng)用該合并替換原節(jié)點(diǎn) :param max_combine_layer: 最大合并層數(shù) :return: 格式化后的字符串 ''' global blank_char_count blank_char_count = blank_count blocks = split_text_blocks(excel_func_text) # print('n'.join(blocks)) # print(’-----------拆分結(jié)果-----------’) 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公式字符串,按照一定的規(guī)則切割成數(shù)組 :param excel_func_text: 被切割的excel公式字符串 :return: 切割后的結(jié)果 ''' 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 # 起始文件塊置于)處 # 以下代碼查找,如果中間不包含(或),則將)和,之間的文本塊加入到劃分結(jié)果 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 liness = '''=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)

的運(yùn)行結(jié)果為:

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

這端代碼首先替換掉所有的換行符,將多個(gè)空格替換為單個(gè)空格,然后將左右括號(hào)和逗號(hào)作為切分點(diǎn)進(jìn)行切分。

但存在一些特殊情況,例如ROW()和COLUMN()括號(hào)內(nèi)部沒(méi)有任何內(nèi)容,所有這種括號(hào)應(yīng)該作為普通字符處理,另外被''包含的字符串可能包含括號(hào),也應(yīng)該作為普通字符。

構(gòu)建多叉樹層次結(jié)構(gòu)

設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu):

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

parent存儲(chǔ)父節(jié)點(diǎn)的指針,tab_size存儲(chǔ)當(dāng)前節(jié)點(diǎn)的層級(jí),data存儲(chǔ)當(dāng)前節(jié)點(diǎn)的所有數(shù)據(jù)。

構(gòu)建代碼:

tab_size = 0node = 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)

構(gòu)建完畢后,這段數(shù)據(jù)在內(nèi)存中的結(jié)構(gòu)(僅展示data)如下:

python實(shí)現(xiàn)excel公式格式化的示例代碼

遍歷打印這顆多叉樹

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))

結(jié)果:

=IF( ROW()>COLUMN(), '', IF( ROW()=COLUMN(), $B15, ROUNDDOWN( $B15*INDIRECT( SUBSTITUTE( ADDRESS( 1, 3+COLUMN()-ROW(), 4 ), 1, '' ) & 56 ), 0 ) ))合并最內(nèi)層的節(jié)點(diǎn)

顯然將最內(nèi)層的node5節(jié)點(diǎn)合并一下閱讀性更好:

python實(shí)現(xiàn)excel公式格式化的示例代碼

首先給數(shù)據(jù)結(jié)構(gòu)增加判斷是否為純文本節(jié)點(diǎn)的方法:

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)

下面是合并純文本節(jié)點(diǎn)的實(shí)現(xiàn),max_combine_layer決定了合并的最大次數(shù),如果合并后長(zhǎng)度超過(guò)text_max_length參數(shù),則不應(yīng)用這次合并:

from collections import dequedef combine_node(root, text_max_length=60, max_combine_layer=3): ''' 合并最內(nèi)層的只有純文本子節(jié)點(diǎn)的節(jié)點(diǎn)為單個(gè)文本節(jié)點(diǎn) :param root: 被合并的節(jié)點(diǎn) :param text_max_length: 合并后的文本長(zhǎng)度不超過(guò)該參數(shù),則應(yīng)用該合并替換原節(jié)點(diǎn) :param max_combine_layer: 最大合并層數(shù) :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))

結(jié)果:

=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))

結(jié)果:

=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))

結(jié)果:

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

合并三次后的內(nèi)存情況:

python實(shí)現(xiàn)excel公式格式化的示例代碼

體驗(yàn)網(wǎng)址

http://xiaoxiaoming.xyz:8088/excel

不保證永久有效。

到此這篇關(guān)于python實(shí)現(xiàn)excel公式格式化的示例代碼的文章就介紹到這了,更多相關(guān)python excel公式格式化內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: python
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩一区二区三区免费| 国产免费av一区二区三区| 国产精品magnet| 亚洲精品精选| 日韩在线观看一区二区| 亚洲欧美日韩国产| 伊人久久国产| 波多野结衣久久精品| 日韩久久视频| 久久精品高清| 精品91久久久久| 噜噜噜躁狠狠躁狠狠精品视频 | 日本不卡的三区四区五区| 综合一区av| 国产日本精品| 麻豆精品视频在线观看免费| 麻豆久久久久久| 中文在线资源| 亚洲精品极品少妇16p| 丝袜美腿亚洲一区| 欧美在线精品一区| 国产精品久久亚洲不卡| 日韩久久精品网| 水蜜桃久久夜色精品一区的特点| 午夜天堂精品久久久久| 国产精品第一| 在线一区免费| 日韩1区2区3区| 狠狠久久伊人中文字幕| 国产综合色区在线观看| 一本一本久久| 日韩精品成人| 国产成人免费| 九一国产精品| 日韩精品成人在线观看| 国产va免费精品观看精品视频| 四虎4545www国产精品| 极品裸体白嫩激情啪啪国产精品| 蜜臀久久99精品久久久画质超高清| 国产亚洲一区| 青青青免费在线视频| 中文在线不卡| 国产美女亚洲精品7777 | 国产精品久久久久久av公交车| 精品无人区麻豆乱码久久久| 久久久久免费av| 日韩三级精品| 桃色av一区二区| 最新亚洲国产| 91一区二区三区四区| 99在线观看免费视频精品观看| 久久国产视频网| 91精品一区二区三区综合在线爱| 亚洲欧美视频一区二区三区| 国产亚洲高清一区| 亚洲香蕉网站| 国产精品毛片久久久| 婷婷综合网站| 久久wwww| 女主播福利一区| 91九色综合| 亲子伦视频一区二区三区| 亚洲a成人v| 亚洲精品.com| 欧美一级二级三级视频| 激情婷婷欧美| 美日韩一区二区三区| 国产亚洲综合精品| 麻豆精品一区二区综合av| 欧美日韩免费观看一区=区三区| 日韩黄色在线观看| 国产一区日韩一区| 欧美国产不卡| 亚洲日产av中文字幕| 久久人人99| 国产精品99精品一区二区三区∴| 亚洲一区网站| 91精品一区二区三区综合| 国产精品成人自拍| 欧美在线综合| 91精品蜜臀一区二区三区在线| 国产精品午夜一区二区三区| 蜜臀va亚洲va欧美va天堂| 久久国产直播| 国产一区一一区高清不卡| 日本a级不卡| 一本一本久久| 在线视频观看日韩| 欧美好骚综合网| 国产精品观看| 综合一区二区三区| 国产女优一区| 亚洲国产专区| 欧美久久天堂| 久久亚洲道色| 国产精品亚洲产品| 91p九色成人| 亚洲久草在线| 日韩在线一区二区| 一区视频在线| 欧美福利专区| 亚洲国产影院| 激情综合自拍| 欧美中文字幕一区二区| 日韩黄色大片| 精品日韩在线| 久久精品三级| 精品黄色一级片| 国产精品videossex久久发布 | 99久久激情| 日韩欧美视频专区| 红杏一区二区三区| 老牛国内精品亚洲成av人片| 午夜天堂精品久久久久| 日欧美一区二区| 婷婷视频一区二区三区| 蜜桃视频一区二区| 首页欧美精品中文字幕| 在线亚洲观看| 99亚洲视频| 亚洲色诱最新| 视频一区欧美精品| 鲁大师成人一区二区三区| 免费国产自线拍一欧美视频| 国产精品日本欧美一区二区三区| 亚洲精品一区二区妖精| av一区二区高清| 九九综合九九| 五月婷婷亚洲| 99国产一区| 中文字幕视频精品一区二区三区| 亚洲视频二区| 日本一区免费网站| 青草综合视频| 国产精品分类| 在线手机中文字幕| 色婷婷久久久| 欧美va亚洲va日韩∨a综合色| 91成人网在线观看| 亚洲一区成人| 青草国产精品| 精品国产亚洲一区二区三区在线 | re久久精品视频| 免费视频一区二区| 青草国产精品| 91欧美日韩| 激情五月色综合国产精品| 中国女人久久久| 日本成人中文字幕在线视频| 欧美aⅴ一区二区三区视频| 国产日韩电影| 免费观看不卡av| 蜜桃av一区二区三区电影| 亚洲深夜福利在线观看| 91在线成人| bbw在线视频| 五月综合激情| 日韩手机在线| 成人国产综合| 亚洲视频播放| 久久精品 人人爱| 日韩中文在线电影| 亚洲专区欧美专区| 久久精品超碰| 成人日韩在线观看| 亚洲综合小说| 精品无人区麻豆乱码久久久 | 91精品观看| 日韩欧美美女在线观看| 精品国产一区二区三区性色av| 日韩不卡视频在线观看| 蜜桃视频一区二区三区 | 久久久精品网| 中文字幕一区日韩精品| 卡一精品卡二卡三网站乱码| www.com.cn成人| 综合色一区二区| 极品av在线| 日精品一区二区三区| 国产在线|日韩| 亚洲天堂免费| 日韩电影免费在线观看| 综合激情一区| av在线资源| 日本91福利区| 婷婷成人基地| 欧美激情久久久久久久久久久| 欧美福利在线| 欧美国产精品| 精品国产亚洲一区二区三区在线 | 日韩精品一区二区三区中文| www.com.cn成人| 国产欧美一区二区色老头| 麻豆精品蜜桃| 国产精品久久久久久久久免费高清| 亚洲午夜91| 久久精品国产一区二区| 日韩在线一二三区| 久久91导航| 美女国产一区二区三区|