mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-02 03:13:58 +00:00
excel sheet reader
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
"cross-env": "^6.0.3",
|
||||
"csv": "^5.3.2",
|
||||
"eslint": "^6.8.0",
|
||||
"exceljs": "^4.0.1",
|
||||
"express": "^4.17.1",
|
||||
"express-basic-auth": "^1.2.0",
|
||||
"find-free-port": "^2.0.0",
|
||||
|
||||
28
packages/api/src/shell/excelSheetReader.js
Normal file
28
packages/api/src/shell/excelSheetReader.js
Normal file
@@ -0,0 +1,28 @@
|
||||
const exceljs = require('exceljs');
|
||||
const stream = require('stream');
|
||||
const _ = require('lodash');
|
||||
|
||||
async function excelSheetReader({ fileName, sheetName }) {
|
||||
console.log(`Loading excel ${fileName}`);
|
||||
const workbook = new exceljs.Workbook();
|
||||
await workbook.xlsx.readFile(fileName);
|
||||
const sheet = workbook.getWorksheet(sheetName);
|
||||
|
||||
const pass = new stream.PassThrough({
|
||||
objectMode: true,
|
||||
});
|
||||
const header = sheet.getRow(1);
|
||||
const structure = {
|
||||
columns: _.range(header.cellCount).map((index) => ({ columnName: header.getCell(index + 1).value })),
|
||||
};
|
||||
pass.write(structure);
|
||||
for (let rowIndex = 2; rowIndex <= sheet.rowCount; rowIndex++) {
|
||||
const row = sheet.getRow(rowIndex);
|
||||
pass.write(_.fromPairs(structure.columns.map((col, index) => [col.columnName, row.getCell(index + 1).value])));
|
||||
}
|
||||
pass.end();
|
||||
|
||||
return pass;
|
||||
}
|
||||
|
||||
module.exports = excelSheetReader;
|
||||
@@ -6,6 +6,7 @@ const tableWriter = require('./tableWriter');
|
||||
const copyStream = require('./copyStream');
|
||||
const fakeObjectReader = require('./fakeObjectReader');
|
||||
const consoleObjectWriter = require('./consoleObjectWriter');
|
||||
const excelSheetReader = require('./excelSheetReader');
|
||||
|
||||
module.exports = {
|
||||
queryReader,
|
||||
@@ -14,6 +15,7 @@ module.exports = {
|
||||
runScript,
|
||||
tableWriter,
|
||||
copyStream,
|
||||
excelSheetReader,
|
||||
fakeObjectReader,
|
||||
consoleObjectWriter,
|
||||
};
|
||||
|
||||
@@ -45,6 +45,7 @@ function createBulkInsertStream(driver, mssql, stream, pool, name, options) {
|
||||
|
||||
const respTemplate = await pool.request().query(`SELECT * FROM ${fullNameQuoted} WHERE 1=0`);
|
||||
writable.templateColumns = respTemplate.recordset.toTable().columns;
|
||||
// console.log('writable.templateColumns', writable.templateColumns);
|
||||
|
||||
this.columnNames = _.intersection(
|
||||
structure.columns.map((x) => x.columnName),
|
||||
@@ -62,7 +63,12 @@ function createBulkInsertStream(driver, mssql, stream, pool, name, options) {
|
||||
// console.log('TCOL', tcol);
|
||||
// console.log('TYPE', tcol.type, mssql.Int);
|
||||
// table.columns.add(column, tcol ? tcol.type : mssql.NVarChar(mssql.MAX));
|
||||
table.columns.add(column, tcol ? tcol.type : mssql.NVarChar(mssql.MAX), { nullable: tcol.nullable });
|
||||
table.columns.add(column, tcol ? tcol.type : mssql.NVarChar(mssql.MAX), {
|
||||
nullable: tcol.nullable,
|
||||
length: tcol.length,
|
||||
precision: tcol.precision,
|
||||
scale: tcol.scale,
|
||||
});
|
||||
}
|
||||
for (const row of rows) {
|
||||
table.rows.add(...this.columnNames.map((col) => row[col]));
|
||||
|
||||
Reference in New Issue
Block a user