excel sheet reader

This commit is contained in:
Jan Prochazka
2020-06-11 15:58:19 +02:00
parent 5c1920d60d
commit 41ee6e9b91
6 changed files with 425 additions and 14 deletions

View File

@@ -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",

View 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;

View File

@@ -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,
};

View File

@@ -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]));