我写了一个将 Excel 文件转化成本地 Json 文件的插件

网站建设4年前发布
68 0 0

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

© 版权声明

相关文章