first commit

This commit is contained in:
KeiferJu 2022-06-15 14:59:17 +08:00
commit 4a44253e16
10 changed files with 13327 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules/

12
README.md Normal file
View File

@ -0,0 +1,12 @@
# 处理工具
## 合并xlsx
1.把需要合并的文件放到excel文件夹里
2.运行start.bat文件
3.到result下拿到合并完成的excel
## xlsx转geojson

53
combine_xlsx.js Normal file
View File

@ -0,0 +1,53 @@
/**
* @description excel批量合成工具
* @author cmyh100
*/
// 公共库
const xlsx = require('node-xlsx')
const fs = require('fs')
// excel文件夹路径把要合并的文件放在excel文件夹内
const _file = `${__dirname}/excel/`
const _output = `${__dirname}/result/`
// 合并数据的结果集
let dataList = [{
name: 'sheet1',
data: []
}]
init()
function init () {
fs.readdir(_file, function(err, files) {
if (err) {
throw err
}
// files是一个数组
// 每个元素是此目录下的文件或文件夹的名称
// console.log(`${files}`);
files.forEach((item, index) => {
try {
// console.log(`${_file}${item}`)
console.log(`开始合并:${item}`)
let excelData = xlsx.parse(`${_file}${item}`)
if (excelData) {
if (dataList[0].data.length > 0) {
excelData[0].data.splice(0, 1)
}
dataList[0].data = dataList[0].data.concat(excelData[0].data)
}
} catch (e) {
console.log(e)
console.log('excel表格内部字段不一致请检查后再合并。')
}
})
// 写xlsx
var buffer = xlsx.build(dataList)
fs.writeFile(`${_output}resut.${new Date().getTime()}.xlsx`, buffer, function (err) {
if (err) {
throw err
}
console.log('\x1B[33m%s\x1b[0m', `完成合并:${_output}resut.${new Date().getTime()}.xlsx`)
})
})
}

View File

@ -0,0 +1,97 @@
const log4js = require('log4js');
const {program} = require('commander');
const xlsx = require('node-xlsx');
const fs = require('fs');
const logger = log4js.getLogger("cgfx");
program
.version('1.0.0')
.description('An application for create geojson from xlsx.')
.option('-l, --log-level <string>', 'log level [all < trace < debug < info < warn < error < fatal < mark < off]', 'debug')
.option('-f, --from-file <string>', 'input xlsx file', 'grid/resut.xlsx')
.option('-t, --to-file <string>', 'output geojson file', 'grid/grid.geojson')
.option('-b, --bbox-fields <string>', 'bbox fields:minx,miny,maxx,maxy', 'grid_lon_min,grid_lat_min,grid_lon_max,grid_lat_max')
.option('-i, --info-fields <string>', 'info fields:info1,info2', 'grid_addr,grid_fk_target,grid_fk,grid_ph,grid_acti,grid_label1,grid_label2,grid_label3,grid_label4')
.option('-p, --prefix-field <string>', 'field prefix', 'app_app_cbam_lbs_grid_cust_label_d_f_v1.')
program.parse(process.argv)
const args = program.opts()
logger.level = args.logLevel;
logger.info(`args = ${JSON.stringify(args)}`)
function get_field_index(headers, args) {
const fm = {}
headers.forEach((v, i) => fm[v] = i)
const res = {}
const bboxFields = args.bboxFields.split(",")
res.bboxIndex = bboxFields.map((v, i) => fm[args.prefixField + bboxFields[i]])
const infoFields = args.infoFields.split(",")
res.infoFields = infoFields
res.infoIndex = infoFields.map((v, i) => fm[args.prefixField + infoFields[i]])
return res;
}
function write_to_geojson_file(sheet, index_info, writer) {
writer.write('{\n' +
'"type": "FeatureCollection",\n' +
'"name": "grid",\n' +
'"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },\n' +
'"features": [\n');
let count = 0;
let total = sheet.data.length;
for (let i = 1; i < total; i++) {
const row = sheet.data[i];
let bbox = index_info.bboxIndex.map((v) => {
return +row[v];
});
let props = {};
index_info.infoIndex.forEach((v, i) => {
props[index_info.infoFields[i]] = row[index_info.infoIndex[i]];
});
props["id"] = count;
let coors = [[bbox[0], bbox[1]], [bbox[2], bbox[1]], [bbox[2], bbox[3]], [bbox[0], bbox[3]], [bbox[0], bbox[1]]]
let feature = {"type": "Feature", "properties": props, "geometry": {"type": "Polygon", "coordinates": [coors]}}
writer.write((i == 1 ? '' : ',\n') + JSON.stringify(feature))
count++;
if (count % 1000 == 0) {
logger.info(`${i}/${total} ${new Number(i * 100 / total).toFixed()}...`)
}
}
writer.write('\n]\n' +
'}\n');
logger.info(`${total}/${total} 100%...`)
}
function geojson_from_xlsx(args) {
logger.info('load xlsx file, file = ' + args.fromFile)
const sheets = xlsx.parse(args.fromFile)
logger.info('xlsx file loaded')
const sheet = sheets[0]
const index_info = get_field_index(sheet.data[0], args)
logger.info('start write to geojson, file = ' + args.toFile)
let writer = fs.createWriteStream(args.toFile)
write_to_geojson_file(sheet, index_info, writer)
writer.close()
logger.info('end write to geojson')
}
const start_time = new Date().getTime();
logger.info('start create geojson from xlsx ...')
geojson_from_xlsx(args);
logger.info('end create geojson from xlsx, spent time = ' + (new Date().getTime() - start_time)/1000 + "s");

BIN
excel/北京市.xlsx Executable file

Binary file not shown.

12920
grid/grid.geojson Normal file

File diff suppressed because it is too large Load Diff

BIN
grid/resut.xlsx Normal file

Binary file not shown.

228
package-lock.json generated Normal file
View File

@ -0,0 +1,228 @@
{
"name": "excelmergetool",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@babel/runtime": {
"version": "7.16.5",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz",
"integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==",
"requires": {
"regenerator-runtime": "^0.13.4"
}
},
"adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
"integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
},
"cfb": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.1.tgz",
"integrity": "sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ==",
"requires": {
"adler-32": "~1.3.0",
"crc-32": "~1.2.0",
"printj": "~1.3.0"
},
"dependencies": {
"adler-32": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.0.tgz",
"integrity": "sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g==",
"requires": {
"printj": "~1.2.2"
},
"dependencies": {
"printj": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.2.3.tgz",
"integrity": "sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA=="
}
}
},
"printj": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.3.0.tgz",
"integrity": "sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg=="
}
}
},
"codepage": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
"integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
},
"commander": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
"integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
},
"crc-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
"integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"date-format": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz",
"integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w=="
},
"debug": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
"requires": {
"ms": "2.1.2"
}
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
},
"flatted": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
"integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
},
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"graceful-fs": {
"version": "4.2.8",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
"integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"requires": {
"graceful-fs": "^4.1.6"
}
},
"log4js": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz",
"integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==",
"requires": {
"date-format": "^3.0.0",
"debug": "^4.1.1",
"flatted": "^2.0.1",
"rfdc": "^1.1.4",
"streamroller": "^2.2.4"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node-xlsx": {
"version": "0.14.2",
"resolved": "https://registry.npmjs.org/node-xlsx/-/node-xlsx-0.14.2.tgz",
"integrity": "sha512-xbFHYP76OFm3ByK8opP/mzmkjtSY3U9g3U86erOBjQRugCMLdlYSFv2xwLq5vcENsydwMM41MwZ7f+ZbSYBWjg==",
"requires": {
"@babel/runtime": "^7.14.6",
"buffer-from": "^1.1.1",
"xlsx": "^0.17.0"
}
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
},
"rfdc": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
"integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
},
"ssf": {
"version": "0.11.2",
"resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
"requires": {
"frac": "~1.1.2"
}
},
"streamroller": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz",
"integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==",
"requires": {
"date-format": "^2.1.0",
"debug": "^4.1.1",
"fs-extra": "^8.1.0"
},
"dependencies": {
"date-format": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz",
"integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA=="
}
}
},
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
},
"wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
},
"word": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
},
"xlsx": {
"version": "0.17.4",
"resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.17.4.tgz",
"integrity": "sha512-9aKt8g9ZLP0CUdBX8L5xnoMDFwSiLI997eQnDThCaqQMYB9AEBIRzblSSNN/ICMGLYIHUO3VKaItcedZJ3ijIg==",
"requires": {
"adler-32": "~1.2.0",
"cfb": "^1.1.4",
"codepage": "~1.15.0",
"crc-32": "~1.2.0",
"ssf": "~0.11.2",
"wmf": "~1.0.1",
"word": "~0.3.0"
}
}
}
}

16
package.json Normal file
View File

@ -0,0 +1,16 @@
{
"name": "excelmergetool",
"version": "1.0.0",
"description": "excel批量合成工具",
"scripts": {
"combine": "node combine_xlsx.js",
"xlsx2geojosn": "node create_geojson_from_xlsx.js"
},
"author": "cmyh100",
"license": "ISC",
"dependencies": {
"commander": "^8.3.0",
"log4js": "^6.3.0",
"node-xlsx": "^0.14.2"
}
}

Binary file not shown.