【原创】Electron word批量转html 打成zip包实例 自己做的

自己做的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>&nbsp;&nbsp;<button type="button" onclick="createOneZip()">生成完整压缩文件</button>
      &nbsp;&nbsp;<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']
    });
}
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注