nodejs替换docx文件{{x}}处标记的内容
替换前
替换后
安装依赖
pnpm add compressing rimraf
代码
index.js
const fs = require('fs')
const path = require('path')
const compressing = require('compressing')
const rimrif = require('rimraf')
// 要替换内容的模板
const inputDocx = 'cs.docx'
// 替换完成的docx文件
const outputDocx = 'dd.docx'
// {{xx}}处要替换的内容
const replaceData = {
name: '替换name处的内容',
age: '替换age处的内容',
}
// 替换方法
function replaceDocx(inputDocxName, outputDocxName, options) {
// 解压出来的临时目录
const tempDocxName = inputDocxName + Math.random()
// 要替换的xml文件位置
const tempDocxXMLName = `${tempDocxName}/word/document.xml`
// 压缩文件夹为文件
const dir_to_docx = (inputName, outputName) => {
// 创建压缩流
const zipStream = new compressing.zip.Stream()
// 写出流
const outStream = fs.createWriteStream(outputName)
fs.readdir(inputName, null, (err, files) => {
if (!err) {
files.map(file => path.join(__dirname, inputName, file))
.forEach(file => {
zipStream.addEntry(file)
})
}
})
// 写入文件内容
zipStream.pipe(outStream)
.on('close', () => {
// 打包完成后删除临时目录
rimrif(tempDocxName, (err) => {
if (err) throw err
})
})
}
// 替换word/document.xml文件中{{xx}}处的内容
const replaceXML = (data, text) => {
Object.keys(data).forEach(key => {
text = text.replaceAll(`{{${key}}}`, data[key])
})
return text
}
// 解压docx文件替换内容重新打包成docx文件
compressing.zip.uncompress(inputDocxName, tempDocxName)
.then(() => {
// 读写要替换内容的xml文件
fs.readFile(tempDocxXMLName, null, (err, data) => {
if (!err) {
let text = data.toString()
text = replaceXML(options, text)
fs.writeFile(tempDocxXMLName, text, (err) => {
if (!err) {
dir_to_docx(tempDocxName, outputDocxName)
} else {
throw err
}
})
} else {
throw err
}
})
}).catch(err => {
throw err
})
}
// 替换内容
replaceDocx(inputDocx, outputDocx, replaceData)