用到的工具类
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
}