qiushang 1 рік тому
батько
коміт
84d8de1882
3 змінених файлів з 383 додано та 77 видалено
  1. 1 0
      package.json
  2. 195 67
      src/renderer/components/home.vue
  3. 187 10
      yarn.lock

+ 1 - 0
package.json

@@ -38,6 +38,7 @@
     "axios": "^0.18.0",
     "element-ui": "^2.15.14",
     "node-xlsx": "^0.24.0",
+    "officegen": "^0.6.5",
     "regedit": "^5.0.0",
     "request": "^2.88.2",
     "vue": "^2.5.2",

+ 195 - 67
src/renderer/components/home.vue

@@ -174,7 +174,7 @@
 								</vxe-table>
 								<!-- 2、文件夹重命名 -->
 								<vxe-table
-									v-show="menuIndex == '2'"
+									v-show="['2', '6'].indexOf(menuIndex) > -1"
 									show-overflow class="img-table" max-height="100%" empty-text="没有更多数据了!" :loading="tabLoading"
 									:loading-config="{icon: 'vxe-icon-indicator roll', text: '文件加载中...'}" :row-config="{isHover: true}"
 									:edit-config="{trigger: 'click', mode: 'cell'}" :data="dirList" :scroll-y="{enabled: true}">
@@ -218,7 +218,7 @@
 								</vxe-table>
 								<!-- 3、文件时间属性-->
 								<vxe-table
-									v-show="menuIndex == '33'"
+									v-show="menuIndex == '3'"
 									show-overflow class="img-table" max-height="100%" empty-text="没有更多数据了!" :loading="tabLoading"
 									:loading-config="{icon: 'vxe-icon-indicator roll', text: '文件加载中...'}" :row-config="{isHover: true}"
 									:edit-config="{trigger: 'click', mode: 'cell'}" :data="fileList" :scroll-y="{enabled: true}">
@@ -1113,7 +1113,7 @@ export default {
 	    // 导出
 	    exportFile(flag) {
 			let authority = this.$refs.headerRef.authority;
-	        if (((this.menuIndex == '1' || this.menuIndex == '3') && this.fileList.length > 0) || ((this.menuIndex == '2' || this.menuIndex == '4') && this.dirList.length > 0)) {
+	        if ((['1','3','5'].indexOf(this.menuIndex) && this.fileList.length > 0) || (['2','4','6'].indexOf(this.menuIndex) && this.dirList.length > 0)) {
 	            if (!authority.isAuthority && !flag) { // 非会员点击转换弹出提示框
 					if(this.menuIndex == '3' || this.menuIndex == '4'){
 						this.$refs.headerRef.tipsModal = true;
@@ -1163,85 +1163,213 @@ export default {
 					this.backDirList = JSON.parse(JSON.stringify(this.dirList));
 				}
 				
-				let size = 9999999;
+				let size = 999999999;
 				if(!authority.isAuthority){
 					size = 5;
 				}
-	
-				setTimeout(()=>{
-					for(let index = 0; index < tempList.length; index++) {
-						let item = tempList[index];
-						item.status = "1";
-						let newPath = item.path + item.newName;
-						if(index < size) {
-							if(this.menuIndex == '1' || this.menuIndex == '2') {
-								if(fs.existsSync(item.path+item.name)){
-									if(item.name == item.newName){ // 名称相同
-										item.status = "5"; // 文件已存在
-									}else{
-										let beforeName = item.name;
-										let afterName = item.newName;
-										if (beforeName.toUpperCase() == afterName.toUpperCase()) { // 名称不相同但是存在大写相同
-											try{
-												fs.renameSync(item.path+item.name, newPath);
-												item.status = "2";
-												item.name = item.newName;
-											}catch(e){
-												item.status = "3";
-											}
-										}else{
-											if(fs.existsSync(newPath)){
+				
+				switch(this.menuIndex){
+					case '1':
+					case '2':
+					case '3':
+					case '4':
+						setTimeout(()=>{
+							for(let index = 0; index < tempList.length; index++) {
+								let item = tempList[index];
+								item.status = "1";
+								let newPath = item.path + item.newName;
+								if(index < size) {
+									if(this.menuIndex == '1' || this.menuIndex == '2') {
+										if(fs.existsSync(item.path+item.name)){
+											if(item.name == item.newName){ // 名称相同
 												item.status = "5"; // 文件已存在
 											}else{
-												try{
-													fs.renameSync(item.path+item.name, newPath);
-													item.status = "2";
-													item.name = item.newName;
-												}catch(e){
-													item.status = "3";
+												let beforeName = item.name;
+												let afterName = item.newName;
+												if (beforeName.toUpperCase() == afterName.toUpperCase()) { // 名称不相同但是存在大写相同
+													try{
+														fs.renameSync(item.path+item.name, newPath);
+														item.status = "2";
+														item.name = item.newName;
+													}catch(e){
+														item.status = "3";
+													}
+												}else{
+													if(fs.existsSync(newPath)){
+														item.status = "5"; // 文件已存在
+													}else{
+														try{
+															fs.renameSync(item.path+item.name, newPath);
+															item.status = "2";
+															item.name = item.newName;
+														}catch(e){
+															item.status = "3";
+														}
+													}
 												}
 											}
+										} else {
+											item.status = "4"; // 文件被修改
 										}
-									}
-								} else {
-									item.status = "4"; // 文件被修改
-								}
-							}else{
-								if(!this.handleData.btime && !this.handleData.mtime){
-									this.$message({message: '请选择需要更改的时间' , type: 'warning'});
-								}else{
-									let btime = this.handleData.btime;
-									let mtime = this.handleData.mtime;
-									if(!this.handleData.btime){ // 创建时间
-										btime = this.menuIndex == '3' ? this.fileTimeList[index].btime : this.dirTimeList[index].btime;
-									}
-									if(!this.handleData.mtime){ // 修改时间
-										mtime = this.menuIndex == '3' ? this.fileTimeList[index].mtime: this.dirTimeList[index].mtime;
-									}
-									btime = this.$utils.formatFileTime(new Date(btime));
-									mtime = this.$utils.formatFileTime(new Date(mtime));
-									
-									let execPath;
-									if(process.env.NODE_ENV == 'development') {
-										execPath = path.join(process.cwd(), "/bin/cert/t.exe");
-									} else {
-										execPath = path.join(__dirname, "../../../app.asar.unpacked/bin/cert/t.exe");
-									}
-									//参数:创建时间-访问时间-修改时间
-									child.execFile(execPath, [item.path+item.name, btime, mtime, mtime], (err,stdout,stderr)=>{
-										if(!err){
-											item.status = "2";
+									}else{
+										if(!this.handleData.btime && !this.handleData.mtime){
+											this.$message({message: '请选择需要更改的时间' , type: 'warning'});
 										}else{
-											item.status = "3";
+											let btime = this.handleData.btime;
+											let mtime = this.handleData.mtime;
+											if(!this.handleData.btime){ // 创建时间
+												btime = this.menuIndex == '3' ? this.fileTimeList[index].btime : this.dirTimeList[index].btime;
+											}
+											if(!this.handleData.mtime){ // 修改时间
+												mtime = this.menuIndex == '3' ? this.fileTimeList[index].mtime: this.dirTimeList[index].mtime;
+											}
+											btime = this.$utils.formatFileTime(new Date(btime));
+											mtime = this.$utils.formatFileTime(new Date(mtime));
+											
+											let execPath;
+											if(process.env.NODE_ENV == 'development') {
+												execPath = path.join(process.cwd(), "/bin/cert/t.exe");
+											} else {
+												execPath = path.join(__dirname, "../../../app.asar.unpacked/bin/cert/t.exe");
+											}
+											//参数:创建时间-访问时间-修改时间
+											child.execFile(execPath, [item.path+item.name, btime, mtime, mtime], (err,stdout,stderr)=>{
+												if(!err){
+													item.status = "2";
+												}else{
+													item.status = "3";
+												}
+											})
 										}
-									})
+									}
 								}
 							}
+						}, 200);
+						break;
+					case '5':
+					case '6':
+						this.extratFile(authority.isAuthority, size);
+						break;
+					case '7':
+						break;
+				}
+	
+				
+			}
+	    },
+		// 提取文件、文件夹名称
+		extratFile(authority, size){
+			let nameCont = [];
+			let list = [];
+			let name = '';
+			if(this.menuIndex == '5'){
+				list = this.fileList;
+				name = this.extractData.fileName;
+			}else if(this.menuIndex == '6'){
+				list = this.dirList;
+				name = this.extractData.dirName;
+			}
+			if(name.trim() == ''){
+				this.$message({message: '请输入导出文件名称' , type: 'warning'});
+				return false;
+			}
+			list.map((item, index) => {
+				let itemName = item.name;
+				let btime = '';
+				let mtime = '';
+				let path = '';
+				if(this.menuIndex == '5'){
+					if(!this.extractData.includeSuffix && itemName.lastIndexOf('.') > -1){
+						itemName = itemName.substr(0, itemName.lastIndexOf('.'));
+					}
+					if(this.extractData.includeBtime){
+						let time = this.fileTimeList[index].btime;
+						btime = this.$utils.formatFileTime(time, this.extractData.timeStyle);
+					}
+					if(this.extractData.includeMtime){
+						let time = this.fileTimeList[index].mtime;
+						mtime = this.$utils.formatFileTime(time, this.extractData.timeStyle);
+					}
+					if(this.extractData.includePath){
+						path = this.fileTimeList[index].path;
+					}
+				}
+				if(this.menuIndex == '6'){
+					if(this.extractData.includeBtime){
+						let time = this.dirTimeList[index].btime;
+						btime = this.$utils.formatFileTime(time, this.extractData.timeStyle);
+					}
+					if(this.extractData.includeMtime){
+						let time = this.dirTimeList[index].mtime;
+						mtime = this.$utils.formatFileTime(time, this.extractData.timeStyle);
+					}
+					if(this.extractData.includePath){
+						path = this.dirTimeList[index].path;
+					}
+				}
+				if((!authority && index < size) || authority){
+					nameCont.push(itemName + '|' + btime + '|' + mtime + '|' + path);
+				}
+			});
+			
+			if(fs.existsSync(this.downloadDir + separator + pjson.softInfo.softName)){
+				this.extractData.newPath = this.downloadDir + separator + pjson.softInfo.softName;
+			} else {
+				fs.mkdirSync(this.downloadDir + separator + pjson.softInfo.softName);
+				this.extractData.newPath = this.downloadDir + separator + pjson.softInfo.softName;
+			}
+			
+			try {
+				if(this.extractData.exportSuffix == 'xlsx'){
+					let datas = [];
+					nameCont.map(item => {
+						datas.push(item.split('|'));
+					});
+					let buffer = xlsx.build([
+						{
+							name:'sheet1',
+							data:datas
 						}
+					]);
+					fs.writeFileSync(this.extractData.newPath + separator + name + "." + this.extractData.exportSuffix, buffer, {'flag':'w'});
+				}else if(this.extractData.exportSuffix == 'docx'){
+					let docx = officegen('docx');
+					docx.on('finalize', function(written) {
+						console.log('Finish to create a Microsoft Word document.')
+					})
+					docx.on('error', function(err) {
+						console.log('docx', err);
+					})
+					nameCont.map(item => {
+						let pObj = docx.createP()
+						pObj.addText(item.replace(/\|/g, '    '));
+					});
+					let out = fs.createWriteStream(this.extractData.newPath + separator + name + "." + this.extractData.exportSuffix);
+					out.on('error', function(err) {
+						console.log('out', err);
+					})
+					docx.generate(out);
+				}else{
+					let txtData = [];
+					nameCont.map(item => {
+						txtData.push(item.replace(/\|/g, '    '));
+					});
+					fs.writeFileSync(this.extractData.newPath + separator + name + "." + this.extractData.exportSuffix, txtData.join('\r\n'));
+				}
+				list.map((item,index) => {
+					if((!authority && index < size) || authority){
+						item.status = '2';
 					}
-				}, 200);
+				});
+				this.$message({message: '恭喜你,名称导出已完成!' , type: 'success'});
+				electronApi.call('showItemInfolder',[this.extractData.newPath + '\\tty.tty'])
+			} catch (err) {
+				console.log(err);
+				if(err.toString().indexOf('EBUSY') > -1){
+					this.$Notice.error({title: '提示', desc: "文件被占用,请关闭后重试!"})
+				}
 			}
-	    },
+		},
 		// 命名撤回
 		back(){
 			let authority = this.$refs.headerRef.authority;

+ 187 - 10
yarn.lock

@@ -534,6 +534,51 @@ aproba@^1.0.3, aproba@^1.1.1:
   resolved "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
   integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
 
+archiver-utils@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2"
+  integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
+  dependencies:
+    glob "^7.1.4"
+    graceful-fs "^4.2.0"
+    lazystream "^1.0.0"
+    lodash.defaults "^4.2.0"
+    lodash.difference "^4.5.0"
+    lodash.flatten "^4.4.0"
+    lodash.isplainobject "^4.0.6"
+    lodash.union "^4.6.0"
+    normalize-path "^3.0.0"
+    readable-stream "^2.0.0"
+
+archiver-utils@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-3.0.4.tgz#a0d201f1cf8fce7af3b5a05aea0a337329e96ec7"
+  integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==
+  dependencies:
+    glob "^7.2.3"
+    graceful-fs "^4.2.0"
+    lazystream "^1.0.0"
+    lodash.defaults "^4.2.0"
+    lodash.difference "^4.5.0"
+    lodash.flatten "^4.4.0"
+    lodash.isplainobject "^4.0.6"
+    lodash.union "^4.6.0"
+    normalize-path "^3.0.0"
+    readable-stream "^3.6.0"
+
+archiver@~5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/archiver/-/archiver-5.2.0.tgz#25aa1b3d9febf7aec5b0f296e77e69960c26db94"
+  integrity sha512-QEAKlgQuAtUxKeZB9w5/ggKXh21bZS+dzzuQ0RPBC20qtDCbTyzqmisoeJP46MP39fg4B4IcyvR+yeyEBdblsQ==
+  dependencies:
+    archiver-utils "^2.1.0"
+    async "^3.2.0"
+    buffer-crc32 "^0.2.1"
+    readable-stream "^3.6.0"
+    readdir-glob "^1.0.0"
+    tar-stream "^2.1.4"
+    zip-stream "^4.0.4"
+
 are-we-there-yet@~1.1.2:
   version "1.1.7"
   resolved "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
@@ -740,7 +785,7 @@ async@^2.6.4:
   dependencies:
     lodash "^4.17.14"
 
-async@^3.2.3:
+async@^3.2.0, async@^3.2.3:
   version "3.2.5"
   resolved "https://registry.npmmirror.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66"
   integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==
@@ -1795,6 +1840,15 @@ bindings@^1.5.0:
   dependencies:
     file-uri-to-path "1.0.0"
 
+bl@^4.0.3:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+  integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+  dependencies:
+    buffer "^5.5.0"
+    inherits "^2.0.4"
+    readable-stream "^3.4.0"
+
 block-stream@*:
   version "0.0.9"
   resolved "https://registry.npmmirror.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
@@ -2007,7 +2061,7 @@ buffer-alloc@^1.2.0:
     buffer-alloc-unsafe "^1.1.0"
     buffer-fill "^1.0.0"
 
-buffer-crc32@~0.2.3:
+buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3:
   version "0.2.13"
   resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
   integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
@@ -2046,7 +2100,7 @@ buffer@^4.3.0:
     ieee754 "^1.1.4"
     isarray "^1.0.0"
 
-buffer@^5.1.0:
+buffer@^5.1.0, buffer@^5.5.0:
   version "5.7.1"
   resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
   integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -2610,6 +2664,16 @@ component-emitter@^1.2.1:
   resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
   integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
 
+compress-commons@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df"
+  integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==
+  dependencies:
+    buffer-crc32 "^0.2.13"
+    crc32-stream "^4.0.2"
+    normalize-path "^3.0.0"
+    readable-stream "^3.6.0"
+
 compressible@~2.0.16:
   version "2.0.18"
   resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
@@ -2776,6 +2840,19 @@ core-util-is@~1.0.0:
   resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
   integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
 
+crc-32@^1.2.0:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+  integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+crc32-stream@^4.0.2:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/crc32-stream/-/crc32-stream-4.0.3.tgz#85dd677eb78fa7cad1ba17cc506a597d41fc6f33"
+  integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==
+  dependencies:
+    crc-32 "^1.2.0"
+    readable-stream "^3.4.0"
+
 crc@^3.8.0:
   version "3.8.0"
   resolved "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
@@ -3648,7 +3725,7 @@ encodeurl@~1.0.2:
   resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
   integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
 
-end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
   version "1.4.4"
   resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
   integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -4012,6 +4089,11 @@ fast-deep-equal@^3.1.1:
   resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
   integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
 
+fast-image-size@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.npmmirror.com/fast-image-size/-/fast-image-size-0.1.3.tgz#fca56c19f0c69cf44b15606e60d820f6863fd5b2"
+  integrity sha512-aYg0XgNJT1F3z90HP04JedMhyBPkpQTM1va/JnjQsVqemBvsO7sRYMLAgp0A0opVFTyyoTbesV8HLYBJegRkKg==
+
 fast-json-stable-stringify@^2.0.0:
   version "2.1.0"
   resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -4242,6 +4324,11 @@ from2@^2.1.0:
     inherits "^2.0.1"
     readable-stream "^2.0.0"
 
+fs-constants@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+  integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
 fs-extra@^10.0.0:
   version "10.1.0"
   resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
@@ -4448,7 +4535,7 @@ glob-parent@~5.1.2:
   dependencies:
     is-glob "^4.0.1"
 
-glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3:
   version "7.2.3"
   resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
   integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -5024,6 +5111,11 @@ ignore@^3.3.5:
   resolved "https://registry.npmmirror.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
   integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
 
+immediate@~3.0.5:
+  version "3.0.6"
+  resolved "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
+  integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
+
 import-lazy@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npmmirror.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@@ -5697,6 +5789,16 @@ jsprim@^1.2.2:
     json-schema "0.4.0"
     verror "1.10.0"
 
+jszip@^3.6.0:
+  version "3.10.1"
+  resolved "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2"
+  integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==
+  dependencies:
+    lie "~3.3.0"
+    pako "~1.0.2"
+    readable-stream "~2.3.6"
+    setimmediate "^1.0.5"
+
 keyboardevent-from-electron-accelerator@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmmirror.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz#ace21b1aa4e47148815d160057f9edb66567c50c"
@@ -5762,6 +5864,20 @@ lazy-val@^1.0.4, lazy-val@^1.0.5:
   resolved "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
   integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
 
+lazystream@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638"
+  integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==
+  dependencies:
+    readable-stream "^2.0.5"
+
+lie@~3.3.0:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
+  integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
+  dependencies:
+    immediate "~3.0.5"
+
 load-json-file@^1.0.0:
   version "1.1.0"
   resolved "https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@@ -5900,6 +6016,21 @@ lodash.clonedeep@^3.0.2:
     lodash._baseclone "^3.0.0"
     lodash._bindcallback "^3.0.0"
 
+lodash.defaults@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+  integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==
+
+lodash.difference@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
+  integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==
+
+lodash.flatten@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+  integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
+
 lodash.get@^4.0.0:
   version "4.4.2"
   resolved "https://registry.npmmirror.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
@@ -5991,6 +6122,11 @@ lodash.toplainobject@^3.0.0:
     lodash._basecopy "^3.0.0"
     lodash.keysin "^3.0.0"
 
+lodash.union@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
+  integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
+
 lodash.uniq@^4.5.0:
   version "4.5.0"
   resolved "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@@ -6271,7 +6407,7 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
   dependencies:
     brace-expansion "^1.1.7"
 
-minimatch@^5.0.1:
+minimatch@^5.0.1, minimatch@^5.1.0:
   version "5.1.6"
   resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
   integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
@@ -6722,6 +6858,20 @@ obuf@^1.0.0, obuf@^1.1.2:
   resolved "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
   integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
 
+officegen@^0.6.5:
+  version "0.6.5"
+  resolved "https://registry.npmmirror.com/officegen/-/officegen-0.6.5.tgz#006a33fff9579d82dff77dd95f5a0013ced2922c"
+  integrity sha512-CpSqy7UiGeu1OvMGbj2nXIVRsi5Tcnr09Ce4RDxkZMU5pgDRV8ipROAe8iuhNZaLFPBM/dxdcR4Ty/BglhfrDA==
+  dependencies:
+    archiver "~5.2.0"
+    async "^3.2.0"
+    fast-image-size "^0.1.3"
+    jszip "^3.6.0"
+    lodash "^4.17.21"
+    readable-stream "~3.6.0"
+    setimmediate "~1.0.5"
+    xmlbuilder "^15.1.1"
+
 on-finished@2.4.1:
   version "2.4.1"
   resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
@@ -6851,7 +7001,7 @@ package-json@^6.3.0:
     registry-url "^5.0.0"
     semver "^6.2.0"
 
-pako@~1.0.5:
+pako@~1.0.2, pako@~1.0.5:
   version "1.0.11"
   resolved "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
   integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
@@ -7689,7 +7839,7 @@ read-pkg@^2.0.0:
     normalize-package-data "^2.3.2"
     path-type "^2.0.0"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6:
   version "2.3.8"
   resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
   integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
@@ -7712,7 +7862,7 @@ read-pkg@^2.0.0:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@^3.0.6, readable-stream@^3.6.0:
+readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@~3.6.0:
   version "3.6.2"
   resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
   integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -7731,6 +7881,13 @@ readable-stream@~1.1.9:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
+readdir-glob@^1.0.0:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584"
+  integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==
+  dependencies:
+    minimatch "^5.1.0"
+
 readdirp@^2.2.1:
   version "2.2.1"
   resolved "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
@@ -8277,7 +8434,7 @@ set-value@^2.0.0, set-value@^2.0.1:
     is-plain-object "^2.0.3"
     split-string "^3.0.1"
 
-setimmediate@^1.0.4:
+setimmediate@^1.0.4, setimmediate@^1.0.5, setimmediate@~1.0.5:
   version "1.0.5"
   resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
   integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
@@ -8864,6 +9021,17 @@ tapable@^1.0.0, tapable@^1.1.3:
   resolved "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
 
+tar-stream@^2.1.4:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+  integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
+  dependencies:
+    bl "^4.0.3"
+    end-of-stream "^1.4.1"
+    fs-constants "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^3.1.1"
+
 tar@^2.0.0:
   version "2.2.2"
   resolved "https://registry.npmmirror.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
@@ -9970,3 +10138,12 @@ yauzl@^2.10.0:
   dependencies:
     buffer-crc32 "~0.2.3"
     fd-slicer "~1.1.0"
+
+zip-stream@^4.0.4:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135"
+  integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==
+  dependencies:
+    archiver-utils "^3.0.4"
+    compress-commons "^4.1.2"
+    readable-stream "^3.6.0"