工具方法
classidiedArray<T>(data: Array<T>, key: string) {
const map = {},
dest = [];
for (let i = 0; i < data.length; i++) {
const ai: T = data[i];
if (!map[ai["key"]]) {
dest.push({
key: ai["key"],
data: [ai],
});
map[ai["key"]] = ai;
} else {
for (let j = 0; j < dest.length; j++) {
const dj = dest[j];
if (dj["key"] == ai["key"]) {
dj.data.push(ai);
break;
}
}
}
}
},
exportExcel<V, T>(column: V, list: T[], title: string) {
const json = list.map((item: T) => {
return Object.keys(item).reduce((list, key) => {
const newKey = column[key] || key;
list[newKey] = item[key];
return list;
}, {});
});
const sheet = XLSX.utils.json_to_sheet(json);
tools.openDownloadDialog(
tools.sheet2blob(sheet, undefined),
`${title}.xlsx`
);
},
openDownloadDialog(url: Blob, saveName: string) {
let saveUrl = "";
if (typeof url === "object" && url instanceof Blob) {
saveUrl = URL.createObjectURL(url);
}
const aLink = document.createElement("a");
aLink.href = saveUrl;
aLink.download = saveName || "";
let event;
if (window.MouseEvent) event = new MouseEvent("click");
else {
event = document.createEvent("MouseEvents");
event.initMouseEvent(
"click",
true,
false,
window,
0,
0,
0,
0,
0,
false,
false,
false,
false,
0,
null
);
}
aLink.dispatchEvent(event);
},
sheet2blob(sheet: any, sheetName = "sheet1") {
const workbook = {
SheetNames: [sheetName],
Sheets: {},
};
workbook.Sheets[sheetName] = sheet;
const wopts: WritingOptions = {
bookType: "xlsx",
type: "binary",
};
const wbout = XLSX.write(workbook, wopts);
const blob = new Blob([s2ab(wbout)], {
type: "application/octet-stream",
});
function s2ab(s: any) {
const buf = new ArrayBuffer(s.length);
const view = new Uint8Array(buf);
for (let i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
return buf;
}
return blob;
},
const data = {
key: "索引",
name: "姓名",
age: "年龄",
address: "地址",
};
const dataSource = [
{
key: "1",
name: "胡彦斌",
age: 32,
address: "西湖区湖底公园1号",
},
{
key: "2",
name: "胡彦祖",
age: 42,
address: "西湖区湖底公园1号",
},
];
exportExcel(data, dataSource, "测试文件");