深入淺出使用JS/TS輕松搞定Excel與XML互轉(zhuǎn)
一、 為什么需要Excel與XML互轉(zhuǎn)?
項目需求:
- 數(shù)據(jù)導(dǎo)入導(dǎo)出: 比如我工作時候遇到的
fairygui多語言,導(dǎo)出的是xml文件,策劃需要Excel文件。 - 配置管理 、數(shù)據(jù)遷移 等,本質(zhì)就是需求雙方出現(xiàn)了對數(shù)據(jù)格式要求的不一致。
在這些場景下,程序化的Excel與XML轉(zhuǎn)換能力就顯得尤為重要。它能幫助我們告別繁瑣的手動操作,實現(xiàn)數(shù)據(jù)的自動化、批量化處理。
二、 核心工具庫安裝
安裝依賴
npm install xlsx xml2js ts-node typescript @types/node xml-js npm install @types/xml2js @types/xlsx @types/xml-js -D
三、 Excel 轉(zhuǎn)換為 XML
這個過程的核心思想是:讀取Excel數(shù)據(jù) -> 將數(shù)據(jù)構(gòu)造成JavaScript對象 -> 將JavaScript對象轉(zhuǎn)換為XML格式。
3.1 讀取Excel數(shù)據(jù)并轉(zhuǎn)換成Json對象
假設(shè)我們有一個名為 users.xlsx 的Excel文件,內(nèi)容如下:
| id | name | |
|---|---|---|
| 1 | Alice | alice@163.com |
| 2 | Bob | bob@163.com |
| 3 | Charlie | charlie@163.com |
我們可以使用 xlsx 來讀取它:
import * as XLSX from 'xlsx';
// 讀取Excel文件
const workbook = XLSX.readFile('users.xlsx');
// 獲取第一個工作表
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
// 將工作表轉(zhuǎn)換為JSON對象數(shù)組
const jsonData = XLSX.utils.sheet_to_json<{ id: number; name: string; email: string }>(worksheet);
console.log(jsonData);
/*
輸出:
[
{ id: 1, name: 'Alice', email: 'Alice@163.com' },
{ id: 2, name: 'Bob', email: 'Bob@163.com' },
{ id: 3, name: 'Charlie', email: 'Charlie@163.com' }
]
*/
3.2 將JSON數(shù)據(jù)轉(zhuǎn)換為XML
現(xiàn)在我們有了JavaScript對象數(shù)組,接下來使用 xml-js 將其轉(zhuǎn)換為XML格式。
import * as convert from 'xml-js';
// 假設(shè) jsonData 來自上一步
const dataForXml = {
_declaration: { _attributes: { version: '1.0', encoding: 'utf-8' } },
users: {
user: jsonData.map((u) => ({
_attributes: { id: u.id },
name: { _text: u.name },
email: { _text: u.email },
})),
},
};
const xmlData = convert.js2xml(dataForXml, { compact: true, spaces: 4 });
console.log(xmlData);
輸出的XML結(jié)果 (output.xml):
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>Alice</name>
<email>Alice@163.com</email>
</user>
<user id="2">
<name>Bob</name>
<email>Bob@163.com</email>
</user>
<user id="3">
<name>Charlie</name>
<email>Charlie@163.com</email>
</user>
</users>
四、XML 轉(zhuǎn)換為 Excel
反向操作的思路同樣清晰:讀取XML數(shù)據(jù) -> 將XML解析為JavaScript對象 -> 將JavaScript對象生成為Excel文件。
4.1 讀取并解析XML數(shù)據(jù)
假設(shè)我們有上一節(jié)生成的 output.xml 文件。
import * as fs from 'fs';
import * as convert from 'xml-js';
// 讀取XML文件內(nèi)容
const xmlFile = fs.readFileSync('output.xml', 'utf8');
// 將XML轉(zhuǎn)換為JavaScript對象
const jsonDataFromXml = convert.xml2js(xmlFile, { compact: true }) as any;
// 提取我們需要的用戶數(shù)據(jù)數(shù)組
const users = jsonDataFromXml.users.user.map((u: any) => ({
id: u._attributes.id,
name: u.name._text,
email: u.email._text,
}));
console.log(users);
/*
[
{ id: '1', name: 'Alice', email: 'alice@163.com' },
{ id: '2', name: 'Bob', email: 'bob@163.com' },
{ id: '3', name: 'Charlie', email: 'charlie@163.com' }
]
*/
4.2 將JSON數(shù)據(jù)生成Excel文件
得到JavaScript對象數(shù)組后,我們再次請出 xlsx 來完成最后一步。
import * as XLSX from 'xlsx'; // 1. 創(chuàng)建一個新的工作簿 const newWorkbook = XLSX.utils.book_new(); // 2. 將JSON數(shù)據(jù)轉(zhuǎn)換為工作表 const newWorksheet = XLSX.utils.json_to_sheet(users); // 3. 將工作表附加到工作簿,并命名為 "Users" XLSX.utils.book_append_sheet(newWorkbook, newWorksheet, 'Users'); // 4. 生成Excel文件并寫入磁盤 XLSX.writeFile(newWorkbook, 'users_from_xml.xlsx');
到此這篇關(guān)于深入淺出使用JS/TS輕松搞定Excel與XML互轉(zhuǎn)的文章就介紹到這了,更多相關(guān)JS Excel與XML互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談javascript中的prototype和__proto__的理解
這篇文章主要介紹了淺談javascript中的prototype和__proto__的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
JavaScript屏蔽Backspace鍵的實現(xiàn)代碼
這篇文章主要介紹了JavaScript屏蔽Backspace鍵的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-11-11
JavaScript中Map和Set數(shù)據(jù)結(jié)構(gòu)使用方法詳解
這篇文章主要介紹了JavaScript中Map和Set數(shù)據(jù)結(jié)構(gòu)使用方法的相關(guān)資料,Map是一種鍵值對集合,支持任意類型的鍵和值,保留插入順序,并提供多種遍歷和操作方法,Set是一種唯一值集合,通過哈希算法保證唯一性,提供添加、刪除、檢查元素的方法,需要的朋友可以參考下2025-03-03
JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建(2)
這篇文章主要介紹了JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建,上一篇我們介紹了什么是集合,并且手動實現(xiàn)了一個集合的類,本篇基于上篇內(nèi)容繼續(xù)深入介紹需要的小伙伴可以參考一下2022-04-04
js對數(shù)組中的數(shù)字從小到大排序?qū)崿F(xiàn)代碼
對數(shù)組中的數(shù)字從小到大排序,很多時候需要用的多,需要的朋友可以參考下2012-09-09

