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学习笔记之Connect中间件应用实例
Jan 27 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
Nodejs之http的表单提交
Jul 07 NodeJs
详解Nodejs 通过 fs.createWriteStream 保存文件
Oct 10 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 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 CURL 多线程操作代码实例
2015/05/13 PHP
Yii快速入门经典教程
2015/12/28 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
python去除扩展名的实例讲解
2018/04/23 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
运动会入场词200字
2014/02/15 职场文书
一年级学生评语
2014/04/23 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
年会主持人开场白台词
2015/05/29 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
教师反邪教心得体会
2016/01/15 职场文书
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python