node 获取指定文件夹下所有文本文件的内容,输出成.docx文件

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的基本用法,以及其参数的使用方式。**/

gitee项目地址

你可能感兴趣的:(javascript,前端,node.js)