mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-19 08:26:01 +00:00
59 lines
1.4 KiB
JavaScript
59 lines
1.4 KiB
JavaScript
const xlsx = require('xlsx');
|
|
const stream = require('stream');
|
|
|
|
const writingWorkbooks = {};
|
|
|
|
async function saveExcelFiles() {
|
|
for (const file in writingWorkbooks) {
|
|
xlsx.writeFile(writingWorkbooks[file], file);
|
|
}
|
|
}
|
|
|
|
function createWorkbook(fileName) {
|
|
let workbook = writingWorkbooks[fileName];
|
|
if (workbook) return workbook;
|
|
workbook = xlsx.utils.book_new();
|
|
writingWorkbooks[fileName] = workbook;
|
|
return workbook;
|
|
}
|
|
|
|
class ExcelSheetWriterStream extends stream.Writable {
|
|
constructor({ fileName, sheetName }) {
|
|
super({ objectMode: true });
|
|
this.rows = [];
|
|
this.structure = null;
|
|
this.fileName = fileName;
|
|
this.sheetName = sheetName;
|
|
this.requireFixedStructure = true;
|
|
}
|
|
_write(chunk, enc, next) {
|
|
if (this.structure) {
|
|
this.rows.push(this.structure.columns.map((col) => chunk[col.columnName]));
|
|
} else {
|
|
this.structure = chunk;
|
|
this.rows.push(chunk.columns.map((x) => x.columnName));
|
|
}
|
|
|
|
next();
|
|
}
|
|
|
|
_final(callback) {
|
|
const workbook = createWorkbook(this.fileName);
|
|
xlsx.utils.book_append_sheet(workbook, xlsx.utils.aoa_to_sheet(this.rows), this.sheetName || 'Sheet 1');
|
|
callback();
|
|
}
|
|
}
|
|
|
|
async function writer({ fileName, sheetName }) {
|
|
return new ExcelSheetWriterStream({
|
|
fileName,
|
|
sheetName,
|
|
});
|
|
}
|
|
|
|
writer.initialize = ({ dbgateApi }) => {
|
|
dbgateApi.finalizer.register(saveExcelFiles);
|
|
};
|
|
|
|
module.exports = writer;
|