【原创】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']
    });
}
点赞
  1. PokerPhantom说道:
    Google Chrome Windows 10
    https://t.me/s/ef_beef
  2. Pokerdomded说道:
    Google Chrome Windows 10
    https://t.me/officials_pokerdom/4007
  3. PokerPhantom说道:
    Google Chrome Windows 10
    https://t.me/s/lex_officials
  4. ChipWhisperer说道:
    Google Chrome Windows 10
    https://t.me/s/dragon_money_mani
  5. BluffMaster说道:
    Google Chrome Windows 10
    В мире ставок, где всякий площадка пытается привлечь гарантиями быстрых джекпотов, рейтинг топ онлайн казино превращается той самой картой, что проводит сквозь дебри подвохов. Игрокам хайроллеров да начинающих, что надоел от фальшивых посулов, он инструмент, дабы почувствовать реальную rtp, словно ощущение ценной монеты в ладони. Обходя лишней ерунды, лишь надёжные сайты, там rtp не лишь показатель, но ощутимая удача.Составлено из поисковых трендов, как паутина, что вылавливает самые актуальные веяния по рунете. В нём минуя пространства для стандартных трюков, каждый момент словно ставка на столе, где подвох выявляется сразу. Профи понимают: по России тон речи с подтекстом, где юмор скрывается как намёк, даёт обойти ловушек.На https://www.wantedly.com/id/Don8Play данный список ждёт как раскрытая колода, подготовленный на раздаче. Загляни, коли нужно увидеть ритм настоящей ставки, без иллюзий и провалов. Игрокам кто ценит тактильность удачи, он словно держать ставку у ладонях, а не смотреть на монитор.

发表回复

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