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

您的位置:首頁技術文章
文章詳情頁

python實現excel公式格式化的示例代碼

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

之前跟一些小伙伴有個討論:

python實現excel公式格式化的示例代碼

大概就是很多跟數據打交道的朋友都面對過很復雜的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% ))

python實現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))

的格式化結果為:

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

python實現excel公式格式化的示例代碼

(文末有體驗網址)

不過接下來,將公布這套格式化程序的完整代碼和開發思想,有技術能力的小伙伴可以考慮改進該代碼。

完整代碼

__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公式字符串,按照一定的規則切割成數組 :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 linesblank_char_count = 2def 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: 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個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 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)

的運行結果為:

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

構建完畢后,這段數據在內存中的結構(僅展示data)如下:

python實現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))

結果:

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

顯然將最內層的node5節點合并一下閱讀性更好:

python實現excel公式格式化的示例代碼

首先給數據結構增加判斷是否為純文本節點的方法:

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

合并三次后的內存情況:

python實現excel公式格式化的示例代碼

體驗網址

http://xiaoxiaoming.xyz:8088/excel

不保證永久有效。

到此這篇關于python實現excel公式格式化的示例代碼的文章就介紹到這了,更多相關python excel公式格式化內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: python
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
天堂成人国产精品一区| 欧美日韩国产一区精品一区| 蜜桃久久精品一区二区| 模特精品在线| 日韩激情中文字幕| 麻豆视频一区二区| 国际精品欧美精品| 久久视频一区| 亚洲欧美高清| 国产精品久久久久久模特| 久久免费影院| 91看片一区| 久久福利精品| 国产欧美高清视频在线| 狠狠久久伊人| 婷婷丁香综合| 久久精品凹凸全集| 久久电影tv| 石原莉奈在线亚洲二区| 国产欧美日韩一级| 欧洲av一区二区| 美女国产精品| 国产精品v日韩精品v欧美精品网站| 久草免费在线视频| 蜜桃av一区二区| 国产一区2区| 国产精品老牛| 久久中文在线| 午夜欧美理论片| 国产免费久久| 久久国产日韩| 国产精品一站二站| 蜜臀久久99精品久久一区二区| 日本在线视频一区二区| 欧美日韩国产观看视频| 日韩在线一二三区| 黄色网一区二区| 久久国产99| 国产精品久久久久久久免费观看 | 日本精品一区二区三区在线观看视频| 国产精品18| 午夜视频精品| 91日韩欧美| 久久精品 人人爱| 亚洲一级特黄| 免费在线观看一区| 亚洲人成网站在线在线观看| 久久久久久久久久久9不雅视频| 日韩区一区二| 亚洲大全视频| 日本蜜桃在线观看视频| 国产欧美久久一区二区三区| 鲁大师成人一区二区三区| 日本不良网站在线观看| 国产精品一卡| 一二三区精品| 欧美日韩国产免费观看| 国产一区二区三区不卡视频网站 | 亚洲天堂av资源在线观看| 亚洲人成网77777色在线播放| 日本久久成人网| 九九久久国产| 国产乱人伦丫前精品视频| 亚洲一区二区小说| 影音国产精品| 中文字幕一区久| 国产一区二区三区久久久久久久久| 日韩毛片网站| 视频一区中文字幕精品 | 成人片免费看| 麻豆久久一区二区| 久久精品99国产精品日本| 久久高清一区| 午夜久久福利| 九一国产精品| 久久高清精品| 色老板在线视频一区二区| 精品久久久亚洲| 国产精品一区二区中文字幕| 日韩黄色av| 日本不卡视频在线观看| 少妇精品久久久一区二区| 在线国产精品一区| 黄色欧美日韩| 久久福利一区| 日韩制服丝袜先锋影音| 免费日韩av片| 最新亚洲国产| 日韩欧美精品一区二区综合视频| 视频一区二区国产| 亚洲一区导航| 亚洲2区在线| 日韩高清不卡一区| 欧美精品国产| 久久xxx视频| 在线看片国产福利你懂的| 裤袜国产欧美精品一区| 伊人久久av| 国产精品久久久久av电视剧| 久久精品青草| 午夜在线精品偷拍| 综合国产视频| 久久国产三级精品| 美女在线视频一区| 青青青免费在线视频| 欧美日中文字幕| 久久香蕉精品| 久久精品凹凸全集| 日韩av片子| 亚洲成人不卡| 中国女人久久久| 奇米狠狠一区二区三区| 久久在线91| 91亚洲国产成人久久精品| 在线中文字幕播放| 欧美日韩三区| 日韩高清一区| 国际精品欧美精品| 亚洲国内欧美| 亚洲精选91| 国产精品地址| 欧美三区四区| 日韩中文字幕不卡| 国产精品hd| 欧美日韩精品在线一区| 亚洲伊人精品酒店| 精品国产亚洲一区二区三区大结局| 久久精选视频| 亚洲在线久久| 久久精品人人| 欧美在线影院| 国产精品视频首页| 欧美色图国产精品| 日韩在线网址| 中文字幕在线免费观看视频| 蘑菇福利视频一区播放| 久久亚洲资源中文字| 国产综合精品| 国产精品成人国产| 国产精品普通话对白| 美女免费视频一区| 欧美中文字幕| 精品一区av| 黄色日韩在线| 久久99久久久精品欧美| 亚洲免费精品| 国产精品不卡| 日本不卡高清| 亚洲视频综合| 欧美国产日韩电影| 三级在线观看一区二区| 三级在线看中文字幕完整版| 亚洲91在线| 激情婷婷亚洲| 国产精品porn| 中文字幕成人| 久久久精品久久久久久96| 日韩va欧美va亚洲va久久| 日韩三区免费| 国产精品香蕉| 一区二区国产在线观看| 日韩欧美中文| 国产精品久久久久久久久久久久久久久 | 欧美午夜不卡影院在线观看完整版免费| 欧美一区二区三区免费看| 蜜臀av免费一区二区三区| 国产黄色一区| 日韩综合一区二区| 免费国产自久久久久三四区久久| 久久99精品久久久久久园产越南 | 欧美亚洲三级| 视频一区在线视频| 伊人久久大香线蕉av不卡| 麻豆国产欧美一区二区三区| 免费人成精品欧美精品| 欧美高清一区| 久久青青视频| 国产在线观看91一区二区三区| 亚洲天堂久久| 午夜av成人| 精品一区二区三区的国产在线观看| 日韩精品欧美成人高清一区二区| 91国语精品自产拍| 偷拍精品精品一区二区三区| 国产精品毛片aⅴ一区二区三区| 少妇高潮一区二区三区99| 尹人成人综合网| 国产精品av久久久久久麻豆网| 成人福利av| sm久久捆绑调教精品一区| 国产伦精品一区二区三区千人斩| 日韩影片在线观看| 三级在线观看一区二区| 免费视频一区三区| 91精品一区二区三区综合| 最新中文字幕在线播放| 激情国产在线| 日韩成人亚洲| 欧美日韩尤物久久| 久久久久中文|