,excel-2b-json 插件用于将 google excel 文件转化成 本地json文件。,适用场景: 项目国际化,配置多语言。,![]()
,转化得到:,![]()
,下面是插件的实现:,算法实现:,我们先看看google Excel文档的url的组成:,例如下面这条,你可以尝试打开,下面这条链接是可以打开的。,![]()
,下载google文档的步骤非常简单,只要获取原始的链接,然后拼接成下面的url,向这个Url发起请求,然后以流的方式写入生成文件就可以了。,因此实现下载的方法非常简单,可以直接看代码。,入口文件可以这样写:,之所以写if判断,是为了后面扩展,也许就不止是解析google文档了,或许也要解析腾讯等其他文档呢?,第一步已经实现了,接下来就看第二步怎么实现。,excel 文件其实本质上是多份xml文件的压缩文件。,而在这里我们只需要获取两份xml 文件,一份是strings,就是excel里的内容,一份是sheet,概括整个excel文件的信息。,所以第一步我们看看怎么获取excel的sheet信息和strings信息。,可以断点看看entry.path,你就会看到分别进来了好几次,然后我们会分别看到我们想要的那两个文件。,![]()
,两份xml文件解析之后就会到close方法里了,这时就可以看到strings和sheet都有内容了,而且内容都是xml。,![]()
,我们分别看看strings和sheet的内容。,![]()
,格式化一下。,![]()
,
,可以发现strings的内容非常简单,现在我们借助xmldom将内容解析为节点对象,然后用xpath插件来获取内容。,xpath的用法:https://github.com/goto100/xpath#readme。,
,可以看到,xpath的用法很简单,就是找到si节点下的子节点t的内容,然后放进数组里。,![]()
,最终生成的values数组是[ 'lang', 'cn','en', 'lang001','我是阳光', 'i am sunny','lang002', '前端阳光','FE Sunny', 'lang003','带带我', 'ddw']。,现在我们要获取sheet的内容了,我们先分析一下xml结构。,![]()
,可以看到sheetData节点其实就是记录strings的内容的信息的,strings的内容是我们真正输入的,而sheet则是类似一种批注。,我们分析看看。,row就是表示表格中的行,c则表示的是列,属性t="s"表示的是当前这个格子有内容,r="A1"表示的是在第一行中的A列。,
,而节点v则表示该格子是该表格的第几个有值的格子,不信?我们可以试试看。,![]()
,
,可以看到这打印出来的xml内容,strings中已经没有了那两个值,而sheet中的那两个格子的c节点的t属性没了,而且v节点也没有了。,现在我们可以知道,string只保存有值的格子里的值,而sheet则是一个网格,不管格子有没有值都会记录,有值的会有个序号存在v节点中。,现在就要收集c节点。,每个c节点用cell对象来表示。,可以看到cell节点有四个属性。,你现在知道它为什么要保存顺序了吗?,因为这样才可以直接从strings生成的values数组中拿出对应顺序的值填充到网格中。,接下来要获取总共有多少列数和行数。这就需要获取最大最小行数列数,然后求差得到。,接下来就根据列数和行数造空二维数组,然后再根据cells和values填充内容。,我们看看最终生成的data,可以发现,excel的网格已经被二维数组模拟出来了。,
,所以我们看看extractData的完整实现。,接下来就是要去除空行和空列,并将二维数组翻转成我们需要的格式。,
,可以看到,现在数组的第一项子数组则是key列表了。,接下来就可以根据key来生成对应的json文件了。,这一步非常简单。,首先就是获取json数据。,先获取data数组的第一项数组,第一项数组是key,然后生成每种语言的json对象。,我们可以看看生成的result_arr。,![]()
,可见已经成功生成每一种语言的json对象了。,接下来只需要生成json文件就可以了,注意把之前生成的excel文件删除。,到此,一个稍微完美的插件就此完成了。 撒花撒花!
© 版权声明
文章版权归作者所有,未经允许请勿转载。