Excel讀寫(NodeJs)

Excel讀寫

一、安裝插件

這裏用到的插件是 xlsx
直接 npm i xlsx
詳細文檔:https://www.npmjs.com/package/xlsx

二、上代碼

ts裏面:

//首先導入xlsx包
import * as XLSX from 'xlsx';
// 打開並獲取Excel對象
openExcel(evt):Promise<any>{
  const target: DataTransfer = <DataTransfer>(evt.target);
  if (target.files.length !== 1) throw new Error('Cannot use multiple files');
  const reader: FileReader = new FileReader();
  return new Promise((resolve,reject)=> {
    reader.onload = (e: any) => {
      /* read workbook */
      const bstr: string = e.target.result;
      const wb: XLSX.WorkBook = XLSX.read(bstr, {type: 'binary'});
      //wb就是返回的excel對象
      resolve(wb);
    };
    reader.readAsBinaryString(target.files[0]);
  })
};

Excel讀取數據方法(寫了三個方法,請按需索取):

//Excel讀取數據(方法一)  sheet_to_json方法
//wb是excel對象,range是讀取的範圍
//range = {s:{c:0,r:3}, e:{c:3,r:6}}; 
//s是start,e是end,c是列,r是行,行列號都是從0開始
readExcelF1(wb, range){
  /* read worksheet */
  var first_sheet_name = wb.SheetNames[0];
  var ws = wb.Sheets[first_sheet_name];
  console.log(ws["!ref"]);
  console.log(XLSX.utils.decode_range(ws["!ref"]));
  console.log(ws);
  let inputdata = [];
  inputdata = (XLSX.utils.sheet_to_json(ws, {header: 1, range: range}));
  console.log(inputdata);
};
//Excel讀取數據(方法二)  for循環的方法
readExcelF2(wb, range){
  var outdata = {};
  /* read worksheet */
  var first_sheet_name = wb.SheetNames[0];
  var ws = wb.Sheets[first_sheet_name];
  console.log(ws);
  for(var R = range.s.r; R <= range.e.r; ++R) {
    for(var C = range.s.c; C <= range.e.c; ++C) {
      var cell_address = {c:C, r:R};
      var cell_ref = XLSX.utils.encode_cell(cell_address);
      var desired_cell = ws[cell_ref];
      var desired_value = (desired_cell ? desired_cell.v : "");
      console.log(desired_value);
      outdata[cell_ref] = desired_value;
    }
  }
  console.log(outdata);
};
//Excel讀取數據(方法三)
//range = {s:{c:2,r:3}, e:{c:-1,r:-1}};
//-1表示不限制範圍,基本思想是先求出獲得的excel對象的整體範圍,
//來替代-1
readExcelF3(wb, range){
  /* read worksheet */
  var first_sheet_name = wb.SheetNames[0];
  var ws = wb.Sheets[first_sheet_name];
  let allrange = XLSX.utils.decode_range(ws["!ref"]);

  if (range.e.c == -1){
    range.e.c = allrange.e.c;
  };

  if (range.e.r == -1){
    range.e.r = allrange.e.r;
  };

  let inputdata = [];
  inputdata = (XLSX.utils.sheet_to_json(ws, {header: 1, range: range}));
  console.log(inputdata);
};

Excel寫入數據方法(寫了兩個方法,請按需索取)

/*Excel寫入數據(方法一)
wb:寫入的excel對象
dataArr:需要寫入的json數據    
dataArr = [
      { 姓名: "張三", 性別: "男", 年齡: 12 },
      { 姓名: "李四", 性別: "女", 年齡: 13 }
    ];
origin:行順序寫入的起點("A2")*/
writeExcelF1(wb, dataArr, origin){
  let keyArr = [];
  for(let key in dataArr[0]){
    keyArr.push(key);
    console.log(keyArr);
  }

  /* read worksheet */
  var first_sheet_name = wb.SheetNames[0];
  var ws = wb.Sheets[first_sheet_name];

  XLSX.utils.sheet_add_json(ws, dataArr, {skipHeader: true, origin: origin, header: keyArr});
  XLSX.writeFile(wb, 'out.xlsx');
};
//按列順序填充
writeExcelF2(wb, dataArr, origin){
  var cell_address = XLSX.utils.decode_cell(origin);
  let sr = cell_address.r;
  let sc = cell_address.c;
  /* read worksheet */
  var first_sheet_name = wb.SheetNames[0];
  var ws = wb.Sheets[first_sheet_name];

  for(let i=0;i<dataArr.length;i++){
    //row回到原始狀態
    cell_address.r = sr;
    for (let key in dataArr[i])
    {
      console.log(dataArr[i][key]);
      XLSX.utils.sheet_add_aoa(ws, [[dataArr[i][key]]], {origin: cell_address});
      cell_address.r ++;
    }
    cell_address.c ++;
  }
  XLSX.writeFile(wb, 'out.xlsx');
};
//測試Excel
testExcel(e){
  this.openExcel(e).then((res)=>{
    let jsonData = [
      { 姓名: "張三", 性別: "男", 年齡: 12 },
      { 姓名: "李四", 性別: "女", 年齡: 13 }
    ];
    var first_sheet_name = res.SheetNames[0];
    var ws = res.Sheets[first_sheet_name];
    let range = {s:{c:2,r:3}, e:{c:-1,r:-1}};
    // this.writeExcelF2(res, jsonData,"A2");
    this.readExcelF3(res, range);
  })
};

.html

  <div>導入</div>
  <input type="file" (change)="testExcel($event)" multiple="false" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章