数据库导出为excel表格的封装
const xlsx = require("node-xlsx");
const fs = require("fs");
const os = require("os");
const path = require("path");
const DBUtil = require("./DBUtil");
class ExcelUtil {
static dbToExcel(results, outputPath) {
if (Array.isArray(results)) {
if (results.length == 0) {
return false;
}
let excelData = [];
let headerRow = Object.keys(results[0]);
excelData.push(headerRow);
for (let item of results) {
excelData.push(Object.values(item));
}
let buffer = xlsx.build([{
name: "sheet1",
data: excelData
}]);
if (!outputPath) {
outputPath = path.join(os.tmpdir(), `${Date.now()}.xlsx`);
}
fs.writeFileSync(outputPath, buffer);
return outputPath;
}
else {
throw new Error("要导出的数据必须是一个数组");
}
}
static async excelToDB(excelPath, tableName) {
if (!excelPath) {
return false;
}
if (!fs.existsSync(excelPath)) {
return false;
}
let extName = path.extname(excelPath);
if (!/^\.xlsx?$/.test(extName)) {
return false;
}
let buffer = fs.readFileSync(excelPath);
let workSheetBook = xlsx.parse(buffer);
let excelData = workSheetBook[0].data;
if (excelData.length == 0) {
return false;
}
let headerRow = excelData.shift();
try {
let ddlSql = `
create table if not exists ${tableName} (
id int primary key auto_increment,
${headerRow.map(item => item + " varchar(255) ").toString()}
) engine = innodb default charset = utf8;
`;
let result1 = await DBUtil.executeSql(ddlSql);
let strSql = "";
for (let item of excelData) {
strSql += ` insert into ${tableName} (${headerRow.toString()}) values (${item.map(_item => "'" + _item + "'")}) ; `;
}
let result2 = await DBUtil.executeSql(strSql);
return true;
} catch (error) {
throw error;
}
}
}
module.exports = ExcelUtil;
本文封装基于数据库封装详情见封装数据库的篇章