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的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
初探nodeJS
Jan 24 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
nodejs实现解析xml字符串为对象的方法示例
Mar 14 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 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&amp;mysql 日期操作小记
2012/02/27 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
详解PHP队列的实现
2019/03/14 PHP
js模拟类继承小例子
2010/07/17 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
通过vue.extend实现消息提示弹框的方法记录
2021/01/07 Vue.js
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
车辆转让协议书
2014/04/15 职场文书
毕业评语大全
2014/05/04 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
介绍信如何写
2015/01/31 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
食品安全主题班会
2015/08/13 职场文书
聘任合同书
2015/09/21 职场文书