NodeJs之word文件生成与解析

一,介绍与需求

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

1 cnpm install officegen --save

第二步:引入officegen

1 var officegen = require('officegen');

2 var fs = require('fs');

3 var docx = officegen('docx');//word

4 var pptx = officegen('pptx');//pptx

第三步:使用officegen docx

复制代码

1 ...

2

3  docx.on('finalize', function (written) {

4        console.log('Finish to create Word file.\nTotal bytes created: ' + written + '\n');

5    });

6

7

8    docx.on('error', function (err) {

9        console.log(err);

10    });

11

12 ...

13 

14 //var tows = ['id', 'provinceZh', 'leaderZh', 'cityZh', 'cityEn'];//创建一个和表头对应且名称与数据库字段对应数据,便于循环取出数据

15            var pObj = docx.createP({ align: 'center' });// 创建行 设置居中 大标题

16            pObj.addText('全国所有城市', { bold: true, font_face: 'Arial', font_size: 18 });// 添加文字 设置字体样式 加粗 大小

17

18            // let towsLen = tows.length

19            let dataLen = data.length

20            for (var i = 0; i < dataLen; i++) {//循环数据库得到的数据,因为取出的数据格式为

21                //[{"id" : "101010100","provinceZh" : "北京","leaderZh" : "北京","cityZh" : "北京","cityEn" : "beijing"},{…………},{…………}]

22                /************************* 文本 *******************************/

23                // var pObj = docx.createP();//创建一行

24                // pObj.addText(`(${i+1}), `,{ bold: true, font_face: 'Arial',});

25                // pObj.addText(`省级:`,{ bold: true, font_face: 'Arial',});

26                // pObj.addText(`${data[i]['provinceZh']}  `,);

27                // pObj.addText(`市级:`,{ bold: true, font_face: 'Arial',});

28                // pObj.addText(`${data[i]['leaderZh']}  `);

29                // pObj.addText(`县区:`,{ bold: true, font_face: 'Arial',});

30                // pObj.addText(`${data[i]['cityZh']}`);

31

32                /************************* 表格 *******************************/

33                let SingleRow = [data[i]['id'], data[i]['provinceZh'], data[i]['leaderZh'], data[i]['cityZh']]

34                table.push(SingleRow)

35            }

36            docx.createTable(table, tableStyle);

37            var out = fs.createWriteStream('out.docx');// 文件写入

38            out.on('error', function (err) {

39                console.log(err);

40            });

41            var result = docx.generate(out);// 服务端生成word

42            res.writeHead(200, {

43                // 注意这里的type设置,导出不同文件type值不同application/vnd.openxmlformats-officedocument.wordprocessingml.document

44                "Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",

45                'Content-disposition': 'attachment; filename=out' + moment(new Date().getTime()).format('YYYYMMDDhhmmss') + '.docx'

46            });

47            docx.generate(res);// 客户端导出word

复制代码

第四步:抛出接口

复制代码

  1 router.put('/download/word', function (req, res) {

  2    console.log('exportWord-------------');

  3    docx.on('finalize', function (written) {

  4        console.log('Finish to create Word file.\nTotal bytes created: ' + written + '\n');

  5    });

  6

  7

  8    docx.on('error', function (err) {

  9        console.log(err);

10    });

11    let fields = {

12        id: '',

13        provinceZh: '',

14        leaderZh: '',

15        cityZh: '',

16        cityEn: ''

17    }

18    var table = [

19        [{

20            val: "No.",

21            opts: {

22                align: "center",

23                vAlign: "center",

24                sz: '36',

25                // cellColWidth: 42,

26                // b:true,

27                // sz: '48',

28                // shd: {

29                //  fill: "7F7F7F",

30                //  themeFill: "text1",

31                //  "themeFillTint": "80"

32                // },

33                // fontFamily: "Avenir Book"

34            }

35        }, {

36            val: "省份",

37            opts: {

38                align: "center",

39                vAlign: "center",

40                sz: '36',

41                // b:true,

42                // color: "A00000",

43                // align: "right",

44                // shd: {

45                //  fill: "92CDDC",

46                //  themeFill: "text1",

47                //  "themeFillTint": "80"

48                // }

49            }

50        }, {

51            val: "市",

52            opts: {

53                align: "center",

54                vAlign: "center",

55                sz: '36',

56                // cellColWidth: 42,

57                // b:true,

58                // sz: '48',

59                // shd: {

60                //  fill: "92CDDC",

61                //  themeFill: "text1",

62                //  "themeFillTint": "80"

63                // }

64            }

65        }, {

66            val: "区/县",

67            opts: {

68                align: "center",

69                vAlign: "center",

70                sz: '36',

71                // cellColWidth: 42,

72                // b:true,

73                // sz: '48',

74                // shd: {

75                //  fill: "92CDDC",

76                //  themeFill: "text1",

77                //  "themeFillTint": "80"

78                // }

79            }

80        }],

81    ]

82

83    var tableStyle = {

84        tableColWidth: 2400,

85        tableSize: 24,

86        tableColor: "ada",

87        tableAlign: "center",

88        tableVAlign: "center",

89        tableFontFamily: "Comic Sans MS",

90        borders: true

91    }

92

93    MongoDbAction.getFieldsByConditions('AllCity', {}, fields, function (err, data) {//根据需求查询想要的字段

94        if (err) {

95            //执行出错

96        } else {

97            //var tows = ['id', 'provinceZh', 'leaderZh', 'cityZh', 'cityEn'];//创建一个和表头对应且名称与数据库字段对应数据,便于循环取出数据

98            var pObj = docx.createP({ align: 'center' });// 创建行 设置居中 大标题

99            pObj.addText('全国所有城市', { bold: true, font_face: 'Arial', font_size: 18 });// 添加文字 设置字体样式 加粗 大小

100

101            // let towsLen = tows.length

102            let dataLen = data.length

103            for (var i = 0; i < dataLen; i++) {//循环数据库得到的数据,因为取出的数据格式为

104                //[{"id" : "101010100","provinceZh" : "北京","leaderZh" : "北京","cityZh" : "北京","cityEn" : "beijing"},{…………},{…………}]

105                /************************* 文本 *******************************/

106                // var pObj = docx.createP();//创建一行

107                // pObj.addText(`(${i+1}), `,{ bold: true, font_face: 'Arial',});

108                // pObj.addText(`省级:`,{ bold: true, font_face: 'Arial',});

109                // pObj.addText(`${data[i]['provinceZh']}  `,);

110                // pObj.addText(`市级:`,{ bold: true, font_face: 'Arial',});

111                // pObj.addText(`${data[i]['leaderZh']}  `);

112                // pObj.addText(`县区:`,{ bold: true, font_face: 'Arial',});

113                // pObj.addText(`${data[i]['cityZh']}`);

114

115                /************************* 表格 *******************************/

116                let SingleRow = [data[i]['id'], data[i]['provinceZh'], data[i]['leaderZh'], data[i]['cityZh']]

117                table.push(SingleRow)

118            }

119            docx.createTable(table, tableStyle);

120            var out = fs.createWriteStream('out.docx');// 文件写入

121            out.on('error', function (err) {

122                console.log(err);

123            });

124            var result = docx.generate(out);// 服务端生成word

125            res.writeHead(200, {

126                // 注意这里的type设置,导出不同文件type值不同application/vnd.openxmlformats-officedocument.wordprocessingml.document

127                "Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",

128                'Content-disposition': 'attachment; filename=out' + moment(new Date().getTime()).format('YYYYMMDDhhmmss') + '.docx'

129            });

130            docx.generate(res);// 客户端导出word

131        }

132    });

133

134 });

复制代码

第五步:前端调用

下载调用方法

复制代码

1    downloadWordOper() {

2        // var url =  "http://localhost:8880/api/v1/yingqi/download/word";

3        // window.location = url;//这里不能使用get方法跳转,否则下载不成功

4            this.$http(downloadWord()).then((res)=>{

5              //这里res.data是返回的blob对象

6              var blob = new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'}); //application/vnd.openxmlformats-officedocument.wordprocessingml.document这里表示doc类型

7              downloadFile(blob,'word','docx')

8            })

9     

10    },

复制代码

downloadFile方法代码如下:

复制代码

1  /**

2    *下载文件

3    * @param blob  :返回数据的blob对象

4    * @param tagFileName  :下载后文件名标记

5    * @param fileType  :文件类 word(docx) excel(xlsx) ppt等

6    */

7  export function downloadFile(blob,tagFileName,fileType) {

8    var downloadElement = document.createElement('a');

9    var href = window.URL.createObjectURL(blob); //创建下载的链接

10    downloadElement.href = href;

11    downloadElement.download = tagFileName+moment(new Date().getTime()).format('YYYYMMDDhhmmss')+'.'+fileType; //下载后文件名

12    document.body.appendChild(downloadElement);

13    downloadElement.click(); //点击下载

14    document.body.removeChild(downloadElement); //下载完成移除元素

15    window.URL.revokeObjectURL(href); //释放掉blob对象

16  }

复制代码

第六步:下载后的效果

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

复制代码

1 router.put('/download/createPpt', function (req, res) {

2    console.log('exportPpt-------------');

3    pptx.on('finalize', function (written) {

4        console.log('Finish to create ppt file.\nTotal bytes created: ' + written + '\n');

5    });

6

7

8    pptx.on('error', function (err) {

9        console.log(err);

10    });

11

12    let slide1 = pptx.makeNewSlide();//创建一个新幻灯片

13    slide1.title = 'PPT文件';

14    slide1.addText('Office generator', {

15        y: 66, x: 'c', cx: '50%', cy: 60, font_size: 48,

16        color: '0000ff'

17    });

18

19    slide1.addText('Big Red', {

20        y: 250, x: 10, cx: '70%',

21        font_face: 'Wide Latin', font_size: 54,

22        color: 'cc0000', bold: true, underline: true

23    });

24

25    var out = fs.createWriteStream('out.pptx');// 文件写入

26    out.on('error', function (err) {

27        console.log('error2===',err);

28    });

29    var result = pptx.generate(out);// 服务端生成ppt

30    res.writeHead(200, {

31        // 注意这里的type设置,导出不同文件type值不同application/vnd.openxmlformats-officedocument.presentationml.presentation

32        // "Content-Type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",

33        // 'Content-disposition': 'attachment; filename=out' + moment(new Date().getTime()).format('YYYYMMDDhhmmss') + '.pptx'

34        "Content-Type": "application/vnd.openxmlformats-officedocument.presentationml.presentation",

35        'Content-disposition': 'attachment; filename=surprise.pptx'

36    });

37    pptx.generate(res);// 客户端导出ppt

38

39 });

复制代码

三,文件上传解析

3.1,word文档解析

第一步:安装textract

1 cnpm install textract --save

第二步:引入textract

1 //引入textract解析word模块

2 var textract = require('textract');//对于docx文件,您可以使用textract,它将从.docx文件中提取文本。

3 var fs = require('fs');

第三步:解析文档

复制代码

1 function parseWord(excelConfig, res) {

2    textract.fromFileWithPath(excelConfig.excel_Dir, function (error, text) {

3        if (error) {

4            res.status(200).json({

5                httpCode: 200,

6                message: '导入解析失败',

7                data: error,

8                returnValue: 0

9            });

10        } else {

11            res.status(200).json({

12                httpCode: 200,

13                message: '导入成功',

14                data: {

15                    result: text

16                },

17                returnValue: 1

18            });

19        }

20    })

21 }

复制代码

第四步:解析后删除文档

1 fs.unlink(excelConfig.excel_Dir, function (err) {

2            if (err) throw err;

3            console.log("删除文件" + excelConfig.excel_Dir + "成功")

4        })

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

3.2,pdf文档解析

第一步:安装pdf2json

1 cnpm install pdf2json --save

第二步:引入pdf2json

1 var PDFParser = require("pdf2json");

2 var fs = require('fs');

第三步:解析文档

复制代码

1 function parsePdf(excelConfig, res) {

2    var pdfParser = new PDFParser(this, 1);

3    pdfParser.loadPDF(excelConfig.excel_Dir);

4    pdfParser.on("pdfParser_dataError", errData => {

5        res.status(200).json({

6            httpCode: 200,

7            message: '导入解析失败',

8            data: errData,

9            returnValue: 0

10        });

11    });

12    pdfParser.on("pdfParser_dataReady", pdfData => {

13        let data = pdfParser.getRawTextContent()

14        fs.writeFile('./uploads/test.txt', data, function (err) {

15            if (err) {

16                throw err;

17            }

18        });

19        res.status(200).json({

20            httpCode: 200,

21            message: '导入成功',

22            data: {

23                result: data

24            },

25            returnValue: 1

26        });

27    });

28 }

复制代码

第四步:解析后删除文档

1  fs.unlink(excelConfig.excel_Dir, function (err) {

2            if (err) throw err;

3            console.log("删除文件" + excelConfig.excel_Dir + "成功")

4        })

东莞网站建设www.zg886.cn

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容