[从产品角度学EXCEL 02]-EXCEL里的树形结构

这是《从产品角度学EXCEL》系列第三篇。

前言请看:

为什么要关注EXCEL的本质

excel是怎样运作的

或者你可以去微信公众号@尾巴说数 获得连载目录。

本文仅由尾巴本人发布于特定网站。不接受任何无授权转载,如需转载,请先联系我,非常感谢。

2 EXCEL里的树形结构

这段时间,上海街边的树上陆陆续续长出了嫩芽,放眼望去有各种层次的绿色,格外好看。我们今天的话题,恰好也与树有关。只不过,树都是往天空伸展枝叶的,而我们这里讨论的‘树’,却是由根部出发,逐行逐行往下延展、伸展。

还记得上一个章节里,我们对一个excel文件解压缩后,发现了若干个xml文件吗?

xml本质上是一种使用树形结构存储信息的文档。它由一个根节点root开始,逐层逐层长枝节,并给每一层都打了个标签,让xml解析器可以快速定位信息的内容。而每一层以及每一个底部的节点,都是这些信息的一个分类属性。我们了解了它们的属性和层级,也就了解这颗结构树长成什么样子。

正因为xml的结构与层级是如此重要,在进一步讲单元格之前,我们很有必要先剖析看看excel xml树的结构,从大体上再来理解一下excel储存文件的方式。

需要注意的是,这一章节大概是整个系列里涉及最多编程的章节了。如果各位对编程不是特别感兴趣,可以先跳过这一节,去看后面的内容。不过按照我个人的经验来说,不管你是用excel做一些简单的数据处理,还是想要在数据分析行业里走得稳妥一些,了解了解编程,只会有好处而没有坏处。尤其是编程的一些思想,如妥善地设计接口,分隔各个功能块等,即使你用excel处理数据,这些也对你十分有好处。

言归正传吧。我们回过头来再看看excel解压缩以后的xml文件。

让我们随意打开一个xml文件,一串串密密麻麻的字符就这样跳了出来。

对于不熟悉xml架构的人来说,我们只会看到眼花缭乱的括号,等号,引号。但是如果你对xml有点理解,你就会知道,这一系列的标点符号框起了一个个xml的数据结构。

对于xml来说,每一个层级都是由<标签 属性=ABC>内容信息</标签>构成的。有的内容信息里又会再次嵌套一层标签层级,重重相叠,从根部开始向下延展出了无数枝叶,构成了一棵看似错综复杂,却是层次分明的xml树。人们只要定位到某一个枝叶,就可以迅速把这个枝叶下的特定信息取出来。而要搞懂这棵xml树长什么样子,首先就要搞懂说这棵树是有哪些层级,各个层级叫什么,有什么内容。

但是各位再回顾看看上面的截图,一长串一长串的代码,你当然可以一个个去判断说,啊,根标签从worksheet开始,下面有selection层级,有f层级等等,但是这样子做,不仅低效,而且会有遗漏。

请各位在学习excel时,随时记住一个原则,那就是可以不要手工去做的事情,就不要手工去做。宁愿自己脑子废点脑力构思最优方法,也不要直接就开始机械的作业。

那么,在这里,面临这个要人工一个个看标签的艰巨任务时,我们该如何是好呢?

在这里跟大家再普及一个概念的是,xml嘛,除了微软在用于office系列文档储存格式以外,它还广泛应用于各种网页设计领域。而在网页获取信息这一块,我们天然有很多工具可以通过读取html或者xml源代码,解析它们的结构,进行数据提取工作(高级点叫法即网络爬虫

所以对于这里的excel xml源文件,我们自然可以应用各种爬虫工具,把xml的框架给找出来。

我 用的比较熟的应该是R语言的rvest包爬虫了,查了一下它的文档,有一个叫xml_structure的,可以直接把xml文件的标签层次给读出来,而 xml_nodes/xml_attr等,又可以把里面特定的标签内容给分层读出来。那么写一段代码,帮我把excel的xml源文件里的层级与内容弄出 来,那就省了我很大的心力啦^^

因为R语言代码并不是我们的重点,所以我把源代码放在文章末尾的扩展阅读里了,有需要的可以去看看,也可以用其他语言写写。有的时候只要学会一点点的编程,就能大大的改善各位的工作效率。要用好工具而不是被工具玩,是我希望在这系列excel教程里告诉大家的一个点。

那么言归正传。请各位看看下面这个用R语言跑出来的csv文件截图。

左列是我们的标签名,右列是我们标签里面包含的文本。通过这个文件,我们就可以很容易知道各个标签里存放了什么文本信息。我们会发现row下面是一串串的c/v/f。而c与v的信息几乎完全一样。

另外,在r里,我们可以通过xml_structure输出xml文件的结构。这两个结合起来,我为各位绘制了一张sheet1.xml的树形结构图:

各 位可以看到,在worksheet文件夹里的sheet1.xml,是在sheetdata里按照row为标签层级,存放了若干行的数据。而行又以 c(cell)为导向,存放了单元格的v (value)和f(函数)。有多少行,在sheet1.xml里就有多少row,一个row有若干个有效单元格,就会有若干个c。

从这个角度看excel,会不会对excel的产品设计层次有了进一步的理解呢?

另外,上面的截图没有出示的一点是,在worksheet这个文件夹里,数字是直接存在各个sheetxxx.xml里的,而字符类文本,却是单独存放在外面的SharedString.xml里。

嘿嘿,数字和文本的存放格式不一样,各位想到了什么?有没有虎躯一震,想到了excel里因为数字和文本的不同,带来的各种不便?

在前面啰嗦完为什么要写这个系列,以及excel是怎么工作以后,我们终于把拼图最重要的一块——解读xml补上了。那么接下来,我们终于要进入从产品角度看excel的正题。

下一章节:单元格背后的秘密,敬请期待:)

以及顺手打个小广告,本系列预计每周更新一章,工作很忙或者没有灵感的时候可能会两周更新一章。每次都会在我的微信公众号上推送所有章节,欢迎关注我的公众号。

当然,如果各位等不及更新,想更早了解后续内容的话,欢迎私下联系我。上海地区提供有偿私教:)


扩展阅读

HTML的基础知识: http://www.w3school.com.cn

阐述XML树形结构的一篇文章: http://www.cnblogs.com/iswszheng/archive/2009/05/18/1459213.html

曾经用R语言写过的kindle爬虫: http://www.flybi.net/blog/weibaar/2974

R语言解析XML源代码:

setwd("~/excel/")
library(rvest)
#代码用于《从产品角度学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]))
 

微信公众号:

时间: 2024-10-10 19:19:11

[从产品角度学EXCEL 02]-EXCEL里的树形结构的相关文章

[从产品角度学EXCEL 03]-单元格的秘密

这是<从产品角度学EXCEL>系列——单元格的秘密. 前言请看: 0 为什么要关注EXCEL的本质 1 EXCEL是怎样运作的 2 EXCEL里的树形结构 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布于特定网站.不接受任何无授权转载,如需转载,请先联系我,非常感谢. 在讲了excel的树形结构之后,我们终于要进入正题,研究单元格的秘密了. 当我们打开excel的时候,首先映入眼帘的就是一大片格子,这就是单元格. 在excel里,单元格承担了几乎所有的存储信息的功能.你

[从产品角度学excel 04]-单元格的“衣服”

忘记发这里了..补发一下 这是<从产品角度学EXCEL>系列——单元格篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 2 EXCEL里的树形结构 3 单元格的秘密(文本/数字篇) 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布于特定网站.不接受任何无授权转载,如需转载,请先联系我,非常感谢. 抱歉之前因为有各种事情,一个多月没更新了,从今天开始恢复更新. 在前一章节里,我们通过对excel xml代码的阅读,发现在excel单元格里,文本

[从产品角度学EXCEL 01]-EXCEL是怎样运作的

这是<从产品角度学EXCEL>系列第二篇. 前言请看:从产品角度学EXCEL-系列0-为什么要关注EXCEL的本质 本文不接受无授权转载,如需转载,请先联系我,非常感谢. 1.EXCEL是怎么工作的 在序言里,我们大致讲了一下为什么要写这篇文章,以及其整体架构.而从这章开始,我们将简单看一下EXCEL是什么,以及它是怎么工作的. 从EXCEL的定义来说,它是一款用于处理数据的电子表格软件.当我们打开EXCEL时,看到的一大片方格子,就是excel所处理的主要对象——表格(spreadsheet

[从产品角度学EXCEL 00]-为什么要关注EXCEL的本质

前言 Hello 大家好,我是尾巴,从今天开始,在这里连载<从产品角度学EXCEL>的系列文章.本文不接受无授权转载,如需转载,请先联系我,非常感谢. 与世面上的大部分EXCEL教程不同的是,我们并不会太多关注于介绍EXCEL各个功能的细节,譬如表格怎么搭建.EXCEL有什么函数等等.这些知识点在各个教程里随处可见,各位只要有心,就可以很容易的找到. 相反,这系列的文章会更多关注于EXCEL这个产品,关注EXCEL的本质. 我们会尝试从一个产品设计,或者一个编程人员的角度来解剖EXCEL的内在

[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作

Microsoft.Office.Interop.Excel 操作 Excel

Microsoft.Office.Interop.Excel类库用于操作Excel,提供了丰富的类和函数,功能非常强大. 第一部分:类库简介 引用命名空间 using Excel = Microsoft.Office.Interop.Excel; 1,在使用类库之前,先总结以下几个类的用法 Application:Excel应用程序类,是Excel的引擎,new 一个实例. Excel.Application excelApp = new Excel.Application(); Workboo

服务器不装Excel读取Excel并转换DataTable

原来是用OleDb.4.0组件读取Excel,但是放到服务器后 傻了,服务器没装Excel ,而且领导说不可以装 没办法,只好自己重新找下代码 在CodeProject找到一个开源的dll,一阵欢喜啊,虽然是winform项目,但是主要是用他的类库所以提取一下后 自己研究后重新封装了一个类,运行 耶! 完美支持 需要Dome的同学下载后去研究下吧 地址:http://download.csdn.net/detail/jine515073/7266371 本人用 Excel 97-2003 工作表

在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能(转)

1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和 导出 . 该项目的GitHub地址是: https://github.com/Maatwebsite/Laravel-Excel . 本文我们将在Laravel中使用Laravel Excel简单实现Excel文件的导入和导出. 2.安装&配置 使用Composer安装依赖 首先在Laravel项目根目录

关于产品的一些思考——八千里网络之谁叫我起床

--------------------2014.5.11-------------------- 谁叫我起床更新了,最新版本1.3.6,添加了自定义铃声功能,还有正如前一个月所说的添加了第三方好友的叫醒功能,可是这不应该叫做"微信好友叫你起床"吧,还有那个字体实在是不敢认同,完全看不清楚啊,不知道为什么不采取我的建议,要么把字体颜色改了,要么直接把字体去掉,人们根据图表可以直接辨别. 1.所谓的"微信好友叫你起床"      文章出处:http://blog.cs