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对象 }
第六步:下载后的效果
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 + "成功") })
第五步:抛出接口调用后的效果
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 + "成功") })
第五步:抛出接口调用后的效果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。