自己做的word批处理工具
main.js
const {app, BrowserWindow,globalShortcut,ipcMain} = require('electron')
const reloader = require('electron-reloader');
reloader(module);
//当app完成初始化时,执行窗体的创建。
app.on('ready', ()=>{
//构建一个高600,宽800的窗体,可以认为,一个窗体是一个浏览器的tab选项卡。
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences:{
// 开启渲染进程使用node
nodeIntegration:true,
// 开启remote模块
enableRemoteModule:true
}
});
// mainWindow.webContents.openDevTools({mode:'bottom'});
//窗体中显示的内容是index.html文件中的内容,将按照google浏览器的渲染方式,渲染显示。
//__dirname,表示main.js所在的目录路径
mainWindow.loadURL(__dirname + "/index.html");
//监听窗体关闭事件,当窗体已经关闭时,将win赋值为null,垃圾回收。
mainWindow.on('closed', () => {
win = null
})
})
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Word文件批处理工具</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>Word文件批处理工具</h1>
<div>文件夹:<input type="text" id="folder" value="D:/wordhtml" /></div>
<div class="btn_container">
<button type="button" onclick="folderWordToHtml()">转HTML</button> <button type="button" onclick="createOneZip()">生成完整压缩文件</button>
<button type="button" onclick="createSingleZpis()">批量生成压缩文件</button>
</div>
<script type="text/javascript" src="index.js"></script>
</body>
</html>
index.js
const {remote} = require('electron');
const fs = require('fs');
const folder = document.querySelector('#folder').value; // word文档全路径
const childFolderName = 'html'; // 子文件夹名称
const htmlFolder = folder + '/' + childFolderName; // 要压缩的文件夹全路径
const zipFolder = folder + '/zip'; // 放压缩文件的文件夹路径
let docFileNum = 0,docConvertNum = 0;
if(!fs.existsSync(htmlFolder)){// 如果html子文件夹不存在,则创建
fs.mkdirSync(htmlFolder);
}
let JsZip = require('jszip');
const { result } = require('underscore');
let zip = new JsZip();
// 将单个word文档转换为html文件,并以utf-8的编码格式保存
const wordToHtml = function(filePath,dirPath){
const mammoth = require('mammoth');
const path = require('path');
const template = require('./template');
const totalFilename = path.basename(filePath); // 获取文件全名
const fileExt = path.extname(totalFilename); // 获取文件后缀
// const filename = splitFileName(totalFilename); // 获取文件名称(不包括后缀)
const filename = totalFilename.split(".")[0]; // 获取文件名称(不包括后缀)
var options = {
styleMap: ['u => u', "p[style-name='center'] => p.center"],
transformDocument: transformElement,
};
if(fileExt == '.docx' || fileExt == '.doc'){
docFileNum++;
mammoth.convertToHtml({path: filePath}, options)
.then(function(result) {
let html = result.value; // html内容
const childPath = dirPath + '/' + childFolderName; // 子文件夹全路径
if(!fs.existsSync(childPath)){// 如果子文件夹不存在,则创建
fs.mkdirSync(childPath);
}
fs.writeFile(childPath + '/' + filename + '.html', template(html), res => {
docConvertNum++;
if(docFileNum == docConvertNum){
message('转换完毕','info');
}
console.log(totalFilename + '转换成功');
});
})
.done();
}else{
console.log(totalFilename+'不是word类型的文件');
}
}
// 遍历整个文件夹,将所有word文档批量转换为html文件,并以utf-8的编码格式保存
const folderWordToHtml = function(){
if(fs.existsSync(folder)){ // 判断文件夹是否存在
walk(folder, wordToHtml);
}else{
message('目录不存在','error');
}
}
// 遍历指定文件夹
const walk = function(dirPath, callback) {
const path = require('path');
docFileNum = docConvertNum = 0;
fs.readdir(dirPath, function (err, files) {
if (err) {
throw new Error(err);
}
files.forEach(function (name) {
var filePath = path.join(dirPath, name);
var stat = fs.statSync(filePath);
if (stat.isFile()) { // 如果是文件而不是目录
callback(filePath, dirPath);
}
});
});
}
// 样式调节
const transformElement = function(element) {
if (element.children) {
const underscore = require('underscore');
var children = underscore.map(element.children, transformElement);
element = { ...element, children: children };
}
if (element.type === 'paragraph') {
element = transformParagraph(element);
}
return element;
}
// 样式调节
const transformParagraph = function(element) {
if (element.alignment === 'center' && !element.styleId) {
return { ...element, styleName: 'center' };
} else {
return element;
}
}
// 将所有文件压缩在一个zip包中
const createOneZip = function(){
zipFile(htmlFolder);
}
// 把每个文件压缩成zip包
const createSingleZpis = function(){
let files = fs.readdirSync(htmlFolder);
let zipTool;
let htmlZipNum = 0;
if(!fs.existsSync(zipFolder)){// 如果子文件夹不存在,则创建
fs.mkdirSync(zipFolder);
}
if(files.length > 0){ // 判断是否有待压缩的文件
console.log(files.length);
files.forEach(function (fileName, index) {
// 遍历检测目录中的文件
let zipName = fileName.split('.')[0] + '.zip';
zipTool = new JsZip();
// 如果是文件压缩目录添加文件
zipTool.file(fileName, fs.readFileSync(htmlFolder+'/'+fileName));
zipTool.generateAsync({
type: 'nodebuffer',
compression: 'DEFLATE',
compressionOptions: {
level: 9,
},
}).then(function (content) {
htmlZipNum++;
fs.writeFileSync(zipFolder + '/'+zipName, content, 'utf-8');
if(htmlZipNum == files.length){
message('压缩完成','info');
}
});
});
}else{
message('没有待压缩的文件','info');
}
}
// 读取目录及文件
readDir = function(obj, nowPath, nowFolder) {
// 读取目录中的所有文件及文件夹
let files = fs.readdirSync(nowPath);
if(files.length > 0){ // 判断是否有待压缩的文件
files.forEach(function (fileName, index) {
// 遍历检测目录中的文件
let fillPath = nowPath + '/' + fileName;
let file = fs.statSync(fillPath);
if (file.isDirectory()) {
// 如果是目录的话,继续遍历
let folder = nowFolder + '/' + fileName;
// 压缩对象中生成该目录
let dirList = zip.folder(folder);
// 重新检索目录文件
readDir(dirList, fillPath, folder);
} else {
// 如果是文件压缩目录添加文件
obj.file(fileName, fs.readFileSync(fillPath));
}
});
}else{
message('没有待压缩的文件','info');
return false;
}
return true;
}
// 压缩文件
zipFile = function(path) {
let zipName = 'html.zip';
let result = readDir(zip, path, '');
if(result){
zip
.generateAsync({
type: 'nodebuffer',
compression: 'DEFLATE',
compressionOptions: {
level: 9,
},
})
.then(function (content) {
fs.writeFileSync(folder + '/'+zipName, content, 'utf-8');
message('压缩完成','info');
});
}
}
// 弹出框提示
const message = function(msg,type){
remote.dialog.showMessageBox({
type:type,
title: '消息提示',
message: msg,
buttons:['ok','cancel']
});
}
更多精彩内容:各种AI课程、技能课程、黑科技软件、网站小程序源码、副业小项目、PPT模板等精品素材、电商课程、推广引流课程等,尽在 天边资源网 。