欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-07 08:05:40
一,介绍与需求  1.1,介绍 1, 模块可以为microsoft office 2007及更高版本生成office open xml文件。此模块不依赖于任何...

一,介绍与需求

 1.1,介绍

1, 模块可以为microsoft office 2007及更高版本生成office open xml文件。此模块不依赖于任何框架,您不需要安装microsoft office,因此您可以将它用于任何类型的 javascript 应用程序。输出也是流而不是文件,不依赖于任何输出工具。此模块应适用于支持node.js 0.10或更高版本的任何环境,包括linux,osx和windows。

2, 文本提取节点模块。

3, 是一个节点。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文件生成与解析的实现代码

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