
[從產(chǎn)品角度學(xué)EXCEL 02]-EXCEL里的樹形結(jié)構(gòu)
前言請看:
0 為什么要關(guān)注Excel的本質(zhì)
1 excel是怎樣運(yùn)作的
本文僅由尾巴本人發(fā)布于特定網(wǎng)站。不接受任何無授權(quán)轉(zhuǎn)載,如需轉(zhuǎn)載,請先聯(lián)系我,非常感謝。
2 Excel里的樹形結(jié)構(gòu)
這段時間,上海街邊的樹上陸陸續(xù)續(xù)長出了嫩芽,放眼望去有各種層次的綠色,格外好看。我們今天的話題,恰好也與樹有關(guān)。只不過,樹都是往天空伸展枝葉的,而我們這里討論的‘樹’,卻是由根部出發(fā),逐行逐行往下延展、伸展。
還記得上一個章節(jié)里,我們對一個excel文件解壓縮后,發(fā)現(xiàn)了若干個xml文件嗎?
xml本質(zhì)上是一種使用樹形結(jié)構(gòu)存儲信息的文檔。它由一個根節(jié)點(diǎn)root開始,逐層逐層長枝節(jié),并給每一層都打了個標(biāo)簽,讓xml解析器可以快速定位信息的內(nèi)容。而每一層以及每一個底部的節(jié)點(diǎn),都是這些信息的一個分類屬性。我們了解了它們的屬性和層級,也就了解這顆結(jié)構(gòu)樹長成什么樣子。
正因?yàn)閤ml的結(jié)構(gòu)與層級是如此重要,在進(jìn)一步講單元格之前,我們很有必要先剖析看看excel xml樹的結(jié)構(gòu),從大體上再來理解一下excel儲存文件的方式。
需要注意的是,這一章節(jié)大概是整個系列里涉及最多編程的章節(jié)了。如果各位對編程不是特別感興趣,可以先跳過這一節(jié),去看后面的內(nèi)容。不過按照我個人的經(jīng)驗(yàn)來說,不管你是用excel做一些簡單的數(shù)據(jù)處理,還是想要在數(shù)據(jù)分析行業(yè)里走得穩(wěn)妥一些,了解了解編程,只會有好處而沒有壞處。尤其是編程的一些思想,如妥善地設(shè)計接口,分隔各個功能塊等,即使你用excel處理數(shù)據(jù),這些也對你十分有好處。
言歸正傳吧。我們回過頭來再看看excel解壓縮以后的xml文件。
讓我們隨意打開一個xml文件,一串串密密麻麻的字符就這樣跳了出來。
對于不熟悉xml架構(gòu)的人來說,我們只會看到眼花繚亂的括號,等號,引號。但是如果你對xml有點(diǎn)理解,你就會知道,這一系列的標(biāo)點(diǎn)符號框起了一個個xml的數(shù)據(jù)結(jié)構(gòu)。
對于xml來說,每一個層級都是由<標(biāo)簽 屬性=ABC>內(nèi)容信息</標(biāo)簽>構(gòu)成的。有的內(nèi)容信息里又會再次嵌套一層標(biāo)簽層級,重重相疊,從根部開始向下延展出了無數(shù)枝葉,構(gòu)成了一棵看似錯綜復(fù)雜,卻是層次分明的xml樹。人們只要定位到某一個枝葉,就可以迅速把這個枝葉下的特定信息取出來。而要搞懂這棵xml樹長什么樣子,首先就要搞懂說這棵樹是有哪些層級,各個層級叫什么,有什么內(nèi)容。
但是各位再回顧看看上面的截圖,一長串一長串的代碼,你當(dāng)然可以一個個去判斷說,啊,根標(biāo)簽從worksheet開始,下面有selection層級,有f層級等等,但是這樣子做,不僅低效,而且會有遺漏。
請各位在學(xué)習(xí)excel時,隨時記住一個原則,那就是可以不要手工去做的事情,就不要手工去做。寧愿自己腦子廢點(diǎn)腦力構(gòu)思最優(yōu)方法,也不要直接就開始機(jī)械的作業(yè)。
那么,在這里,面臨這個要人工一個個看標(biāo)簽的艱巨任務(wù)時,我們該如何是好呢?
在這里跟大家再普及一個概念的是,xml嘛,除了微軟在用于office系列文檔儲存格式以外,它還廣泛應(yīng)用于各種網(wǎng)頁設(shè)計領(lǐng)域。而在網(wǎng)頁獲取信息這一塊,我們天然有很多工具可以通過讀取html或者xml源代碼,解析它們的結(jié)構(gòu),進(jìn)行數(shù)據(jù)提取工作(高級點(diǎn)叫法即網(wǎng)絡(luò)爬蟲)
所以對于這里的excel xml源文件,我們自然可以應(yīng)用各種爬蟲工具,把xml的框架給找出來。
我 用的比較熟的應(yīng)該是R語言的rvest包爬蟲了,查了一下它的文檔,有一個叫xml_structure的,可以直接把xml文件的標(biāo)簽層次給讀出來,而 xml_nodes/xml_attr等,又可以把里面特定的標(biāo)簽內(nèi)容給分層讀出來。那么寫一段代碼,幫我把excel的xml源文件里的層級與內(nèi)容弄出 來,那就省了我很大的心力啦^^
因?yàn)?a href='/map/r/' style='color:#000;font-size:inherit;'>R語言代碼并不是我們的重點(diǎn),所以我把源代碼放在文章末尾的擴(kuò)展閱讀里了,有需要的可以去看看,也可以用其他語言寫寫。有的時候只要學(xué)會一點(diǎn)點(diǎn)的編程,就能大大的改善各位的工作效率。要用好工具而不是被工具玩,是我希望在這系列excel教程里告訴大家的一個點(diǎn)。
那么言歸正傳。請各位看看下面這個用R語言跑出來的csv文件截圖。
左列是我們的標(biāo)簽名,右列是我們標(biāo)簽里面包含的文本。通過這個文件,我們就可以很容易知道各個標(biāo)簽里存放了什么文本信息。我們會發(fā)現(xiàn)row下面是一串串的c/v/f。而c與v的信息幾乎完全一樣。
另外,在r里,我們可以通過xml_structure輸出xml文件的結(jié)構(gòu)。這兩個結(jié)合起來,我為各位繪制了一張sheet1.xml的樹形結(jié)構(gòu)圖:
各位可以看到,在worksheet文件夾里的sheet1.xml,是在sheetdata里按照row為標(biāo)簽層級,存放了若干行的數(shù)據(jù)。而行又以 c(cell)為導(dǎo)向,存放了單元格的v (value)和f(函數(shù))。有多少行,在sheet1.xml里就有多少row,一個row有若干個有效單元格,就會有若干個c。
從這個角度看excel,會不會對excel的產(chǎn)品設(shè)計層次有了進(jìn)一步的理解呢?
另外,上面的截圖沒有出示的一點(diǎn)是,在worksheet這個文件夾里,數(shù)字是直接存在各個sheetxxx.xml里的,而字符類文本,卻是單獨(dú)存放在外面的SharedString.xml里。
嘿嘿,數(shù)字和文本的存放格式不一樣,各位想到了什么?有沒有虎軀一震,想到了excel里因?yàn)閿?shù)字和文本的不同,帶來的各種不便?
在前面啰嗦完為什么要寫這個系列,以及excel是怎么工作以后,我們終于把拼圖最重要的一塊——解讀xml補(bǔ)上了。
R語言解析XML源代碼:
setwd("~/excel/")
library(rvest)
#代碼用于《從產(chǎn)品角度學(xué)EXCEL》系列文章,XML解析
# read xml in zip files
get_xmllist<-function(access){
list<-list.files(access,full.names=TRUE,pattern = "xml$",recursive = TRUE)
list_name<-gsub(as.character(access),"",list)
list_name<-gsub("\\/|\\.|\\[|\\]","-",list_name)
list_name<-gsub("\\-\\-","-",list_name)
list<-data.frame(list,list_name,stringsAsFactors = FALSE)
list
}
# read xml structure
get_structure<-function(xmlfile){
data<-xml(xmlfile,encoding="UTF-8")
data<-data %>% html_nodes("*")
output<-cbind(node_names=data %>% html_tag(),
node_text=data %>% html_text())
output<-data.frame(output)
output
}
write_result<-function(dataframe,name){
write.csv(dataframe,paste0("./Output/",name,".csv"),row.names=FALSE)
}
#use these three function
xml_list<-get_xmllist("./sample u.xlsx/")
for (i in 1:nrow(xml_list)){
data<-get_structure(xml_list$list[i])
write_result(data,xml_list$list_name[i])
}
#write the structure
xml_structure(html(xml_list$list[8]))
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時的科學(xué)計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實(shí)踐的落地者與價值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價值,最終要在 “實(shí)踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場景的分 ...
2025-09-10