node server端生成二维码插入word并导出word

209 阅读1分钟

用到的工具类

var fs = require('fs')
var path = require('path')
var os = require('os')
var qr = require('qr-image')
var QRCode = require('qrcode')
const docx = require('docx')
const moment = require('moment')
const { AlignmentType, BorderStyle, WidthType, VerticalAlign, Document, Packer, Paragraph, Media, Table, TableCell, TableRow } = docx
const Async = require('async')

生成二维码

/**
 * CreateQRcode 生成二维码并保存到本地
 * @param {*} item 需要生成二维码的信息
 */
const CreateQRcode = (item, callback) => {
    // data.forEach((item,index)=>{
    //     var qrCode = qr.image(`${item.card_no}`, { type: 'png' ,size: 8, margin: 20})
    //     qrCode.pipe(require('fs').createWriteStream(path.join(outDir, `${item.student_name}.png`)))
    // })
    // var qrCode = qr.image(`${data.card_no}`, { type: 'png' ,size: 8, margin: 20})
    // qrCode.pipe(fs.createWriteStream(path.join(outDir, `${data.student_name}.png`)))
    // QRCode.toFile(path.join(outDir, `${data.student_name}.png`),`${data.card_no}`,{margin:20},function(err){
    //     if(err) throw err
    // })
    QRCode.toFile(path.join(QRcodeOutDir, `${item.card_no}.png`), `${item.card_no}`, { margin: 6, width: 10 }, function (err) {
        if (err) { throw err }
        callback(null)
    })
}

生成word

 * WordInsertImage 生成图片插入到word中
 * @param {*} item 每一名学生的信息
 * @param {*} callback callback
 */
function WordInsertImage(item, callback) {
    rows.push(
        new TableRow({
            children: [
                new TableCell({
                    children: [
                        new Paragraph(''),
                        new Paragraph({ text: `${item.school_name}`, style: 'left' }),
                        new Paragraph(''),
                        new Paragraph({ text: `${item.grade_name}`, style: 'left' }),
                        new Paragraph(''),
                        new Paragraph({ text: `${item.class_name}`, style: 'left' }),
                        new Paragraph(''),
                        new Paragraph({ text: `${item.student_name} (${item.sex == 0 ? '女' : '男'},${moment(item.birthday).format('YYYY-MM-DD')})`, style: 'left' }),
                        new Paragraph(''),
                    ],
                    width: {
                        size: 54,
                        type: WidthType.PERCENTAGE
                    },
                    borders: {
                        right: { style: BorderStyle.NONE, size: 0, color: 'ffffff' }
                    }
                }),
                new TableCell({
                    children: [
                        // new Paragraph(''),
                        new Paragraph(Media.addImage(doc, fs.readFileSync(path.join(QRcodeOutDir, `${item.card_no}.png`)), 120, 120)),
                    ],
                    width: {
                        size: 26,
                        type: WidthType.PERCENTAGE
                    },
                    borders: {
                        left: { style: BorderStyle.NONE, size: 0, color: 'ffffff' },
                        right: { style: BorderStyle.NONE, size: 0, color: 'ffffff' },
                    }
                }),
                new TableCell({
                    children: [
                        new Paragraph({ text: '□ 屈光', style: 'right' }),
                        new Paragraph(''),
                        new Paragraph({ text: '□ 视力', style: 'right' }),
                    ],
                    width: {
                        size: 20,
                        type: WidthType.PERCENTAGE
                    },
                    borders: {
                        left: { style: BorderStyle.NONE, size: 0, color: 'ffffff' }
                    },
                    verticalAlign: VerticalAlign.CENTER,
                })
            ],
        })
    )
    if (rows.length == ArrayLength) {

        const table = new Table({
            rows: rows
        })

        doc.addSection({
            children: [
                new Paragraph({ text: '标题', style: 'title' }),
                table
            ]
        })

        Packer.toBuffer(doc).then((buffer) => {
            fs.writeFileSync(path.join(wordOutDir, `${wordInfos.taskName}.docx`), buffer)
        }).then((res) => {
            finish = true
            console.log('完成了?', finish)
            callback(null, finish)
            return
        })
    } else {
        callback(null)
    }
}


/**
 * CreateWord 生成Word并保存到本地
 * @param {*} data 需要生成word和二维码的信息
 * @param {*} wordInfo 生成word的名字,标题信息
 */
const CreateWord = (data, wordInfo) => {
    return new Promise((resolve, reject) => {
        try {
            if (os.platform() == 'win32') {
                filePath = path.join('D:\\ProgramData\\QRcodeFile\\')
            }
            fs.mkdir(filePath, { recursive: true, mode: 0o777 }, err => {
                if (err) {
                    reject(err)
                } else {
                    console.log('ok!')
                    QRcodeOutDir = path.join(filePath)
                    fs.mkdir(path.join('D:\\ProgramData\\wordFile\\'), { recursive: true, mode: 0o777 }, err => {
                        if (err) {
                            reject(err)
                        } else {
                            wordOutDir = path.join('D:\\ProgramData\\wordFile\\')
                        }
                    })
                    ArrayLength = data.length
                    finish = false
                    wordInfos = wordInfo
                    doc = new Document({
                        title: '测试文档',
                        styles: {
                            paragraphStyles: [
                                {
                                    id: 'title',
                                    paragraph: {
                                        alignment: AlignmentType.CENTER
                                    },
                                    run: {
                                        size: 24
                                    }
                                },
                                {
                                    id: "left",
                                    paragraph: {
                                        indent: {
                                            left: 1400,
                                        },
                                    },
                                    run: {
                                        size: 20,
                                        family: '楷体'
                                    }
                                },
                                {
                                    id: 'right',
                                    paragraph: {
                                        indent: {
                                            left: 500,
                                        }
                                    },
                                    run: {
                                        size: 26
                                    }
                                }
                            ]
                        }
                    })
                    rows = []
                    Async.eachLimit(data, 10, CreateQRcode, function (err) {
                        err ?
                            console.log('err:', err) :
                            Async.eachLimit(data, 1, WordInsertImage, function (err) {
                                err ? console.log('err:', err) : finish ? resolve(finish) : ''
                            })
                    })
                }
            })
        } catch (err) {
            console.log('err: ', err)
            reject(err)
        }
    })
}

最后抛出方法

export default {
    CreateQRcode: CreateQRcode,
    CreateWord: CreateWord
}