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" />