const fs = require('fs');
const Docxtemplater = require('docxtemplater');
const PizZip = require('pizzip');
const path = require('path');
// 指定文件夹路径
const folderPath = './static';
// 获取文件夹下所有文件
function getFiles(dir) {
let files = [];
const items = fs.readdirSync(dir);
for (let i = 0; i < items.length; i++) {
const item = items[i];
const fullPath = path.join(dir, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
files = files.concat(getFiles(fullPath));
} else {
files.push(fullPath);
}
}
return files;
}
// 读取文件内容并匹配指定类型
function readFilesAndMatchTypes(files) {
let result = "";
const types = ['js', 'php', 'py', 'java', 'ts'];
for (const file of files) {
const ext = path.extname(file).slice(1);
if (types.includes(ext)) {
const content = fs.readFileSync(file, 'utf-8');
result += content + '\n';
}
}
return result;
}
// 生成 Docx 文件
function generateDocx() {
const files = getFiles(folderPath);
const contents = readFilesAndMatchTypes(files);
const zip = new PizZip(fs.readFileSync('./template.docx'));
// 创建 docxtemplater 实例
const doc = new Docxtemplater(zip);
// 设置模板数据
/**
* setData函数的参数自定义,例如:我在模本文件template.docx中设置{content},那setData中的参数就可以是 {content}
* 以下是在模板的规则:
* 在模板中设置占位符的方法是使用 {} 包裹你想要替换的文本。
* 例如,如果你想要替换一个名字,你可以在模板中添加一个占位符 {name}。
* 当你使用 setData 方法传递数据时,
* docxtemplater 将会自动将 {name} 替换为对应的实际数据。
* 注意,占位符的名称应该与实际传递的数据对象的属性名相匹配。
* 例如,如果你的数据对象中有一个属性 firstName,那么你的占位符应该设置为 {firstName},而不是 {name}。
* 同时,你可以使用 {#} 和 {/} 来表示循环。例如,如果你的数据对象中有一个数组 items,你可以这样设置占位符:
* {#items}
* {item}
* {/items}
* ***/
let content = JSON.stringify(contents, null, 2);
// 去除JSON.stringify 转化后的 字符头尾的双引号
content = content.slice(1,content.length-1);
doc.setData({
content
});
// 使用模板替换文本并生成文档
doc.render();
const result = doc.getZip().generate({ type: 'nodebuffer' });
fs.writeFileSync('output.docx', result);
}
generateDocx();
/**
* JSON.stringify方法有三个参数:
value (必需): 通常是要序列化的对象或值。
replacer (可选): 可以是一个函数或者一个数组。如果是函数,这个函数会在JSON.stringify序列化过程中被调用,用来改变被序列化的值。如果是数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中。
space (可选): 用于美化输出结果的字符数量。如果提供一个数字,那空格数量等于这个数字。如果提供一个字符串,就使用这个字符串作为缩进。
示例代码如下:
javascript
const obj = { name: '张三', age: '20', school: [ '某某小学', '某某中学' ] };
const json = JSON.stringify(obj);
console.log(json); //{"name":"张三","age":"20","school":["某某小学","某某中学"]}
const json1 = JSON.stringify(obj, ['age']);
console.log(json1); //{"age":"20"}
// 使用replacer函数过滤掉值为undefined的属性
const json2 = JSON.stringify(obj, (key, value) => value === undefined ? null : value);
console.log(json2); //{"name":"张三","age":"20"}
上述代码演示了JSON.stringify的基本用法,以及其参数的使用方式。**/
node 获取指定文件夹下所有文本文件的内容,输出成.docx文件
本文介绍了如何使用Node.js中的fs、DocxTemplater和PizZip库,读取指定文件夹下的特定类型文件,提取内容,并将这些内容动态填充到Docx模板中生成新的文档。
摘要由CSDN通过智能技术生成