NodeJs之word文件生成与解析的实现代码


Posted in NodeJs onApril 01, 2019

一,介绍与需求

 1.1,介绍

1, officegen 模块可以为Microsoft Office 2007及更高版本生成Office Open XML文件。此模块不依赖于任何框架,您不需要安装Microsoft Office,因此您可以将它用于任何类型的 JavaScript 应用程序。输出也是流而不是文件,不依赖于任何输出工具。此模块应适用于支持Node.js 0.10或更高版本的任何环境,包括Linux,OSX和Windows。

2, textract 文本提取节点模块。

3, pdf2json 是一个节点。js模块解析和转换PDF从二进制到json格式,它是用PDF构建的。并通过浏览器外的交互式表单元素和文本内容解析对其进行扩展。其目标是在web服务中包装时启用带有交互式表单元素的服务器端PDF解析,并在作为命令行实用程序使用时启用将本地PDF解析为json文件。

1.2,需求

二,文件生成导出

第一步:安装 officegen

cnpm install officegen --save

第二步:引入officegen

var officegen = require('officegen');
var fs = require('fs');
var docx = officegen('docx');//word
var pptx = officegen('pptx');//pptx

第三步:使用officegen docx

...

 docx.on('finalize', function (written) {
    console.log('Finish to create Word file.\nTotal bytes created: ' + written + '\n');
  });


  docx.on('error', function (err) {
    console.log(err);
  });

...
 
//var tows = ['id', 'provinceZh', 'leaderZh', 'cityZh', 'cityEn'];//创建一个和表头对应且名称与数据库字段对应数据,便于循环取出数据
      var pObj = docx.createP({ align: 'center' });// 创建行 设置居中 大标题
      pObj.addText('全国所有城市', { bold: true, font_face: 'Arial', font_size: 18 });// 添加文字 设置字体样式 加粗 大小

      // let towsLen = tows.length
      let dataLen = data.length
      for (var i = 0; i < dataLen; i++) {//循环数据库得到的数据,因为取出的数据格式为
        //[{"id" : "101010100","provinceZh" : "北京","leaderZh" : "北京","cityZh" : "北京","cityEn" : "beijing"},{…………},{…………}]
        /************************* 文本 *******************************/
        // var pObj = docx.createP();//创建一行
        // pObj.addText(`(${i+1}), `,{ bold: true, font_face: 'Arial',});
        // pObj.addText(`省级:`,{ bold: true, font_face: 'Arial',});
        // pObj.addText(`${data[i]['provinceZh']} `,);
        // pObj.addText(`市级:`,{ bold: true, font_face: 'Arial',});
        // pObj.addText(`${data[i]['leaderZh']} `);
        // pObj.addText(`县区:`,{ bold: true, font_face: 'Arial',});
        // pObj.addText(`${data[i]['cityZh']}`);

        /************************* 表格 *******************************/
        let SingleRow = [data[i]['id'], data[i]['provinceZh'], data[i]['leaderZh'], data[i]['cityZh']]
        table.push(SingleRow)
      }
      docx.createTable(table, tableStyle);
      var out = fs.createWriteStream('out.docx');// 文件写入
      out.on('error', function (err) {
        console.log(err);
      });
      var result = docx.generate(out);// 服务端生成word
      res.writeHead(200, {
        // 注意这里的type设置,导出不同文件type值不同application/vnd.openxmlformats-officedocument.wordprocessingml.document
        "Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        'Content-disposition': 'attachment; filename=out' + moment(new Date().getTime()).format('YYYYMMDDhhmmss') + '.docx'
      });
      docx.generate(res);// 客户端导出word

第四步:抛出接口

router.put('/download/word', function (req, res) {
  console.log('exportWord-------------');
  docx.on('finalize', function (written) {
    console.log('Finish to create Word file.\nTotal bytes created: ' + written + '\n');
  });


  docx.on('error', function (err) {
    console.log(err);
  });
  let fields = {
    id: '',
    provinceZh: '',
    leaderZh: '',
    cityZh: '',
    cityEn: ''
  }
  var table = [
    [{
      val: "No.",
      opts: {
        align: "center",
        vAlign: "center",
        sz: '36',
        // cellColWidth: 42,
        // b:true,
        // sz: '48',
        // shd: {
        //  fill: "7F7F7F",
        //  themeFill: "text1",
        //  "themeFillTint": "80"
        // },
        // fontFamily: "Avenir Book"
      }
    }, {
      val: "省份",
      opts: {
        align: "center",
        vAlign: "center",
        sz: '36',
        // b:true,
        // color: "A00000",
        // align: "right",
        // shd: {
        //  fill: "92CDDC",
        //  themeFill: "text1",
        //  "themeFillTint": "80"
        // }
      }
    }, {
      val: "市",
      opts: {
        align: "center",
        vAlign: "center",
        sz: '36',
        // cellColWidth: 42,
        // b:true,
        // sz: '48',
        // shd: {
        //  fill: "92CDDC",
        //  themeFill: "text1",
        //  "themeFillTint": "80"
        // }
      }
    }, {
      val: "区/县",
      opts: {
        align: "center",
        vAlign: "center",
        sz: '36',
        // cellColWidth: 42,
        // b:true,
        // sz: '48',
        // shd: {
        //  fill: "92CDDC",
        //  themeFill: "text1",
        //  "themeFillTint": "80"
        // }
      }
    }],
  ]

  var tableStyle = {
    tableColWidth: 2400,
    tableSize: 24,
    tableColor: "ada",
    tableAlign: "center",
    tableVAlign: "center",
    tableFontFamily: "Comic Sans MS",
    borders: true
  }

  MongoDbAction.getFieldsByConditions('AllCity', {}, fields, function (err, data) {//根据需求查询想要的字段
    if (err) {
      //执行出错
    } else {
      //var tows = ['id', 'provinceZh', 'leaderZh', 'cityZh', 'cityEn'];//创建一个和表头对应且名称与数据库字段对应数据,便于循环取出数据
      var pObj = docx.createP({ align: 'center' });// 创建行 设置居中 大标题
      pObj.addText('全国所有城市', { bold: true, font_face: 'Arial', font_size: 18 });// 添加文字 设置字体样式 加粗 大小

      // let towsLen = tows.length
      let dataLen = data.length
      for (var i = 0; i < dataLen; i++) {//循环数据库得到的数据,因为取出的数据格式为
        //[{"id" : "101010100","provinceZh" : "北京","leaderZh" : "北京","cityZh" : "北京","cityEn" : "beijing"},{…………},{…………}]
        /************************* 文本 *******************************/
        // var pObj = docx.createP();//创建一行
        // pObj.addText(`(${i+1}), `,{ bold: true, font_face: 'Arial',});
        // pObj.addText(`省级:`,{ bold: true, font_face: 'Arial',});
        // pObj.addText(`${data[i]['provinceZh']} `,);
        // pObj.addText(`市级:`,{ bold: true, font_face: 'Arial',});
        // pObj.addText(`${data[i]['leaderZh']} `);
        // pObj.addText(`县区:`,{ bold: true, font_face: 'Arial',});
        // pObj.addText(`${data[i]['cityZh']}`);

        /************************* 表格 *******************************/
        let SingleRow = [data[i]['id'], data[i]['provinceZh'], data[i]['leaderZh'], data[i]['cityZh']]
        table.push(SingleRow)
      }
      docx.createTable(table, tableStyle);
      var out = fs.createWriteStream('out.docx');// 文件写入
      out.on('error', function (err) {
        console.log(err);
      });
      var result = docx.generate(out);// 服务端生成word
      res.writeHead(200, {
        // 注意这里的type设置,导出不同文件type值不同application/vnd.openxmlformats-officedocument.wordprocessingml.document
        "Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        'Content-disposition': 'attachment; filename=out' + moment(new Date().getTime()).format('YYYYMMDDhhmmss') + '.docx'
      });
      docx.generate(res);// 客户端导出word
    }
  });

});

第五步:前端调用

下载调用方法

downloadWordOper() {
    // var url = "http://localhost:8880/api/v1/yingqi/download/word";
    // window.location = url;//这里不能使用get方法跳转,否则下载不成功
      this.$http(downloadWord()).then((res)=>{
       //这里res.data是返回的blob对象
       var blob = new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'}); //application/vnd.openxmlformats-officedocument.wordprocessingml.document这里表示doc类型
       downloadFile(blob,'word','docx')
      })
   
  },

downloadFile方法代码如下:

/**
  *下载文件
  * @param blob :返回数据的blob对象
  * @param tagFileName :下载后文件名标记
  * @param fileType :文件类 word(docx) excel(xlsx) ppt等
  */
 export function downloadFile(blob,tagFileName,fileType) {
  var downloadElement = document.createElement('a');
  var href = window.URL.createObjectURL(blob); //创建下载的链接
  downloadElement.href = href;
  downloadElement.download = tagFileName+moment(new Date().getTime()).format('YYYYMMDDhhmmss')+'.'+fileType; //下载后文件名
  document.body.appendChild(downloadElement);
  downloadElement.click(); //点击下载
  document.body.removeChild(downloadElement); //下载完成移除元素
  window.URL.revokeObjectURL(href); //释放掉blob对象
 }

NodeJs之word文件生成与解析的实现代码

第六步:下载后的效果

NodeJs之word文件生成与解析的实现代码

ppt生成下载类似,只是设置的writeHead类型与使用的方法不一样

router.put('/download/createPpt', function (req, res) {
  console.log('exportPpt-------------');
  pptx.on('finalize', function (written) {
    console.log('Finish to create ppt file.\nTotal bytes created: ' + written + '\n');
  });


  pptx.on('error', function (err) {
    console.log(err);
  });

  let slide1 = pptx.makeNewSlide();//创建一个新幻灯片
  slide1.title = 'PPT文件';
  slide1.addText('Office generator', {
    y: 66, x: 'c', cx: '50%', cy: 60, font_size: 48,
    color: '0000ff'
  });

  slide1.addText('Big Red', {
    y: 250, x: 10, cx: '70%',
    font_face: 'Wide Latin', font_size: 54,
    color: 'cc0000', bold: true, underline: true
  });

  var out = fs.createWriteStream('out.pptx');// 文件写入
  out.on('error', function (err) {
    console.log('error2===',err);
  });
  var result = pptx.generate(out);// 服务端生成ppt
  res.writeHead(200, {
    // 注意这里的type设置,导出不同文件type值不同application/vnd.openxmlformats-officedocument.presentationml.presentation
    // "Content-Type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
    // 'Content-disposition': 'attachment; filename=out' + moment(new Date().getTime()).format('YYYYMMDDhhmmss') + '.pptx'
    "Content-Type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
    'Content-disposition': 'attachment; filename=surprise.pptx'
  });
  pptx.generate(res);// 客户端导出ppt

});

三,文件上传解析

3.1,word文档解析

第一步:安装textract

cnpm install textract --save

第二步:引入textract

//引入textract解析word模块
var textract = require('textract');//对于docx文件,您可以使用textract,它将从.docx文件中提取文本。
var fs = require('fs');

第三步:解析文档

function parseWord(excelConfig, res) {
  textract.fromFileWithPath(excelConfig.excel_Dir, function (error, text) {
    if (error) {
      res.status(200).json({
        httpCode: 200,
        message: '导入解析失败',
        data: error,
        returnValue: 0
      });
    } else {
      res.status(200).json({
        httpCode: 200,
        message: '导入成功',
        data: {
          result: text
        },
        returnValue: 1
      });
    }
  })
}

第四步:解析后删除文档

fs.unlink(excelConfig.excel_Dir, function (err) {
      if (err) throw err;
      console.log("删除文件" + excelConfig.excel_Dir + "成功")
    })

第五步:抛出接口调用后的效果

NodeJs之word文件生成与解析的实现代码

3.2,pdf文档解析

第一步:安装pdf2json

cnpm install pdf2json --save

第二步:引入pdf2json

var PDFParser = require("pdf2json");
var fs = require('fs');

第三步:解析文档

function parsePdf(excelConfig, res) {
  var pdfParser = new PDFParser(this, 1);
  pdfParser.loadPDF(excelConfig.excel_Dir);
  pdfParser.on("pdfParser_dataError", errData => {
    res.status(200).json({
      httpCode: 200,
      message: '导入解析失败',
      data: errData,
      returnValue: 0
    });
  });
  pdfParser.on("pdfParser_dataReady", pdfData => {
    let data = pdfParser.getRawTextContent()
    fs.writeFile('./uploads/test.txt', data, function (err) {
      if (err) {
        throw err;
      }
    });
    res.status(200).json({
      httpCode: 200,
      message: '导入成功',
      data: {
        result: data
      },
      returnValue: 1
    });
  });
}

第四步:解析后删除文档

fs.unlink(excelConfig.excel_Dir, function (err) {
if (err) throw err;
console.log("删除文件" + excelConfig.excel_Dir + "成功")
})

第五步:抛出接口调用后的效果

NodeJs之word文件生成与解析的实现代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
NodeJS中Buffer模块详解
Jan 07 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
NodeJS实现一个聊天室功能
Nov 25 NodeJs
详解nodejs http请求相关总结
Mar 31 #NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 #NodeJs
nodejs微信开发之自动回复的实现
Mar 17 #NodeJs
nodejs微信开发之接入指南
Mar 17 #NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 #NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 #NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 #NodeJs
You might like
php下网站防IP攻击代码,超级实用
2010/10/24 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
Js 随机数产生6位数字
2010/05/13 Javascript
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
浅谈关于axios和session的一些事
2017/07/13 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
女大学生自我鉴定
2013/12/09 职场文书
项目合作计划书
2014/01/09 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
个人授权委托书样本
2014/09/13 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书