中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js利用js-xlsx處理Excel文件的方法詳解

發布時間:2020-10-12 01:34:04 來源:腳本之家 閱讀:119 作者:scarlex 欄目:web開發

簡介

本文介紹用 Node.js 中的 js-xlsx 庫來處理 Excel 文件。

js-xlsx 庫是目前 Github 上 star 數量最多的處理 Excel 的庫,功能強大,但上手難度稍大。文檔有些亂,不適合快速上手。

本文對 js-xlsx 庫進行一定的總結,并提供幾個實用的例子供讀者測試,學習,交流。

安裝

$ npm install xlsx

一些概念

在使用這個庫之前,先介紹庫中的一些概念。

  • workbook 對象,指的是整份 Excel 文檔。我們在使用 js-xlsx 讀取 Excel 文檔之后就會獲得 workbook 對象。
  • worksheet 對象,指的是 Excel 文檔中的表。我們知道一份 Excel 文檔中可以包含很多張表,而每張表對應的就是 worksheet 對象。
  • cell 對象,指的就是 worksheet 中的單元格,一個單元格就是一個 cell 對象。

它們的關系如下:

// workbook
{
 SheetNames: ['sheet1', 'sheet2'],
 Sheets: {
 // worksheet
 'sheet1': {
  // cell
  'A1': { ... },
  // cell
  'A2': { ... },
  ...
 },
 // worksheet
 'sheet2': {
  // cell
  'A1': { ... },
  // cell
  'A2': { ... },
  ...
 }
 }
}

用法

基本用法

  • XLSX.readFile 打開 Excel 文件,返回 workbook
  • workbook.SheetNames 獲取表名
  • workbook.Sheets[xxx] 通過表名獲取表格
  • 按自己的需求去處理表格
  • 生成新的 Excel 文件

具體用法

讀取 Excel 文件

import XLSX from 'xlsx';
const workbook = XLSX.readFile('someExcel.xlsx', opts);

獲取 Excel 文件中的表

// 獲取 Excel 中所有表名
const sheetNames = workbook.SheetNames; // 返回 ['sheet1', 'sheet2']
// 根據表名獲取對應某張表
const worksheet = workbook.Sheets[sheetNames[0]];

通過 worksheet[address] 來操作表格,以 ! 開頭的 key 是特殊的字段。

// 獲取 A1 單元格對象
let a1 = worksheet['A1']; // 返回 { v: 'hello', t: 's', ... }
// 獲取 A1 中的值
a1.v // 返回 'hello'

// 獲取表的有效范圍
worksheet['!ref'] // 返回 'A1:B20'
worksheet['!range'] // 返回 range 對象,{ s: { r: 0, c: 0}, e: { r: 100, c: 2 } }

// 獲取合并過的單元格
worksheet['!merges'] // 返回一個包含 range 對象的列表,[ {s: { r: 0, c: 0 }, c: { r: 2, c: 1 } } ]

實戰

解析 Excel 生成 JSON

Tips 事實上,你可以直接通過 XLSX.utils.sheet_to_json(worksheet) 獲得同樣的結果

注意 本例子中假設表的第一行為字段名

const headers = {};
const data = [];
const keys = Object.keys(worksheet);
keys
 // 過濾以 ! 開頭的 key
 .filter(k => k[0] !== '!')
 // 遍歷所有單元格
 .forEach(k => {
  // 如 A11 中的 A
  let col = k.substring(0, 1);
  // 如 A11 中的 11
  let row = parseInt(k.substring(1));
  // 當前單元格的值
  let value = worksheet[k].v;

  // 保存字段名
  if (row === 1) {
   headers[col] = value;
   return;
  }

  // 解析成 JSON
  if (!data[row]) {
   data[row] = {};
  }
  data[row][headers[col]] = value;
 });

console.log(data); // [ { '姓名': 'test1', '年齡': 20 }, { '姓名': 'test2', '年齡': 10 } ... ]

合并表格

步驟:

  • 讀取多份表格
  • 合并數組

Tips: 其實合并表格跟 XLSX 沒什么關系,只是處理幾個數組而已。

sheet1

id name age
1 test1 30
2 test2 20
3 test3 18

sheet2

id country remark
1 China hello
2 America world
3 Unkonw ???

let sheet1 = XLSX.utils.sheet_to_json(sheet1);
let sheet2 = XLSX.utils.sheet_to_json(sheet2);

// 先合并 sheet1 和 sheet2,再對統一處理
const result = sheet1.concat(sheet2).reduce((prev, next) => {
 let index = prev.findIndex((elem, i) => elem.id === next.id);

 if (index === -1) {
  return prev.concat(next);
 } else {
  prev[index] = Object.assign({}, prev[index], next);
  return prev;
 }
}, []);
console.log(result);

// [ { id: '1',
// name: 'test1',
// age: '30',
// country: 'China',
// remark: 'hello' },
// { id: '2',
// name: 'test2',
// age: '20',
// country: 'America',
// remark: 'world' },
// { id: '3',
// name: 'test3',
// age: '18',
// country: 'Unkonw',
// remark: '???' } ]

導出表格

步驟:

  • 構建特定的數據結構,如下。
  • 調用 XLSX.writeFile(workbook, filename) 即可。
// workbook
{
 SheetNames: ['mySheet'],
 Sheets: {
  'mySheet': {
   '!ref': 'A1:E4', // 必須要有這個范圍才能輸出,否則導出的 excel 會是一個空表
   A1: { v: 'id' },
   ...
  }
 }
}
var _headers = ['id', 'name', 'age', 'country', 'remark']
var _data = [ { id: '1',
    name: 'test1',
    age: '30',
    country: 'China',
    remark: 'hello' },
    { id: '2',
    name: 'test2',
    age: '20',
    country: 'America',
    remark: 'world' },
    { id: '3',
    name: 'test3',
    age: '18',
    country: 'Unkonw',
    remark: '???' } ];

var headers = _headers
    // 為 _headers 添加對應的單元格位置
    // [ { v: 'id', position: 'A1' },
    // { v: 'name', position: 'B1' },
    // { v: 'age', position: 'C1' },
    // { v: 'country', position: 'D1' },
    // { v: 'remark', position: 'E1' } ]
    .map((v, i) => Object.assign({}, {v: v, position: String.fromCharCode(65+i) + 1 }))
    // 轉換成 worksheet 需要的結構
    // { A1: { v: 'id' },
    // B1: { v: 'name' },
    // C1: { v: 'age' },
    // D1: { v: 'country' },
    // E1: { v: 'remark' } }
    .reduce((prev, next) => Object.assign({}, prev, {[next.position]: {v: next.v}}), {});

var data = _data
    // 匹配 headers 的位置,生成對應的單元格數據
    // [ [ { v: '1', position: 'A2' },
    //  { v: 'test1', position: 'B2' },
    //  { v: '30', position: 'C2' },
    //  { v: 'China', position: 'D2' },
    //  { v: 'hello', position: 'E2' } ],
    // [ { v: '2', position: 'A3' },
    //  { v: 'test2', position: 'B3' },
    //  { v: '20', position: 'C3' },
    //  { v: 'America', position: 'D3' },
    //  { v: 'world', position: 'E3' } ],
    // [ { v: '3', position: 'A4' },
    //  { v: 'test3', position: 'B4' },
    //  { v: '18', position: 'C4' },
    //  { v: 'Unkonw', position: 'D4' },
    //  { v: '???', position: 'E4' } ] ]
    .map((v, i) => _headers.map((k, j) => Object.assign({}, { v: v[k], position: String.fromCharCode(65+j) + (i+2) })))
    // 對剛才的結果進行降維處理(二維數組變成一維數組)
    // [ { v: '1', position: 'A2' },
    // { v: 'test1', position: 'B2' },
    // { v: '30', position: 'C2' },
    // { v: 'China', position: 'D2' },
    // { v: 'hello', position: 'E2' },
    // { v: '2', position: 'A3' },
    // { v: 'test2', position: 'B3' },
    // { v: '20', position: 'C3' },
    // { v: 'America', position: 'D3' },
    // { v: 'world', position: 'E3' },
    // { v: '3', position: 'A4' },
    // { v: 'test3', position: 'B4' },
    // { v: '18', position: 'C4' },
    // { v: 'Unkonw', position: 'D4' },
    // { v: '???', position: 'E4' } ]
    .reduce((prev, next) => prev.concat(next))
    // 轉換成 worksheet 需要的結構
    // { A2: { v: '1' },
    //  B2: { v: 'test1' },
    //  C2: { v: '30' },
    //  D2: { v: 'China' },
    //  E2: { v: 'hello' },
    //  A3: { v: '2' },
    //  B3: { v: 'test2' },
    //  C3: { v: '20' },
    //  D3: { v: 'America' },
    //  E3: { v: 'world' },
    //  A4: { v: '3' },
    //  B4: { v: 'test3' },
    //  C4: { v: '18' },
    //  D4: { v: 'Unkonw' },
    //  E4: { v: '???' } }
    .reduce((prev, next) => Object.assign({}, prev, {[next.position]: {v: next.v}}), {});

// 合并 headers 和 data
var output = Object.assign({}, headers, data);
// 獲取所有單元格的位置
var outputPos = Object.keys(output);
// 計算出范圍
var ref = outputPos[0] + ':' + outputPos[outputPos.length - 1];

// 構建 workbook 對象
var wb = {
 SheetNames: ['mySheet'],
 Sheets: {
  'mySheet': Object.assign({}, output, { '!ref': ref })
 }
};

// 導出 Excel
XLSX.writeFile(wb, 'output.xlsx');

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

出處

http://scarletsky.github.io/2016/01/30/nodejs-process-excel/

參考資料

https://github.com/SheetJS/js-xlsx

http://stackoverflow.com/questions/30859901/parse-xlsx-with-node-and-create-json

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊金霍洛旗| 綦江县| 梅河口市| 鲁山县| 全州县| 镇雄县| 焉耆| 磐石市| 遵义市| 岳普湖县| 武清区| 武山县| 西贡区| 茂名市| 长兴县| 修文县| 应用必备| 孟州市| 日喀则市| 卓资县| 永吉县| 邛崃市| 沙坪坝区| 海城市| 连云港市| 海南省| 岑巩县| 隆回县| 苍山县| 玉溪市| 浪卡子县| 湄潭县| 恭城| 高州市| 蕉岭县| 宝应县| 乌鲁木齐市| 个旧市| 明光市| 广南县| 河西区|