首页 > 编程语言 >nodeJs读取JOSN文件导出多个word文件

nodeJs读取JOSN文件导出多个word文件

时间:2023-09-14 15:23:49浏览次数:46  
标签:function 文件 docx fs word nodeJs let path const

前言

最近遇到一个需求,读取JOSN文件,以JSON文件的标题为word的文件名导出多个文档,利用nodeJs和 officegen 实现了该功能
exportWords.js 代码如下

/**
 * 读取指定文件夹下的JSON文件,导出多个word文件
 * 一个json文件导出多个word文件,通常以json文件中的title作为导出的word的文件名
 * 可根据指定目录生成所需的文件夹
 */
let fs = require("fs");
let path = require("path");
const officegen = require('officegen')
let styleXML = fs.readFileSync("./utils/styles.xml", "utf-8"); // 文档标题
require('events').EventEmitter.defaultMaxListeners = 0;

let DIR = path.join(__dirname, 'Json/xxx'); // 需要导出的文件夹

const fileList = readDirSync(DIR);
console.log('fileList', fileList);

fileList.forEach(async (e) => {
  let content = await cusReadFile(path.join(DIR, e));
  content = JSON.parse(content);
  content.forEach(async (p,index) => {
    await generateWordFile(p,index); // 生成word文件
  })

})

// 读取path下的文件名称列表
function readDirSync(path) {
  let files = [];
  let pa = fs.readdirSync(path);
  pa.forEach(function (ele, index) {
    let info = fs.statSync(path + "/" + ele);
    if (info.isDirectory()) {
      //  console.log("dir: " + ele);
      readDirSync(path + "/" + ele);
    } else {
      //  console.log("file: " + ele);
      files.push(ele);
    }
  });
  return files;
}


// 读取文件
async function cusReadFile(src) {
  return new Promise((resolve) => {
    let a = "";
    const r = fs.createReadStream(src);
    // r.setEncoding('utf-8');
    r.on("data", (chunk) => {
      a += chunk;
    });
    r.on("end", () => {
      resolve(a);
    });
    r.on("error", () => {});
  });
  //
}

function addDocPara (params) {
  const title = params['title']; //文档标题
  const content = params['content']; // 文档内容

  // 生成docx对象
  const docx = officegen({
    type: "docx",
    styleXML,
  });
  //定义文档的标题
  let tObj = docx.createP();
  tObj.options.force_style = "myHeading1";
  tObj.addText(title, {
    font_face: 'Arial',
    font_size: 20,
    align: 'left'
  });
  tObj.addLineBreak() //换行
  //定义内容
  let pObj = docx.createP()
  pObj.addText(content, {
    font_size: 14,
    font_face: 'Arial'
  })
  return docx;
}
let fileNameArr = []; // 文件名数组,用于文件重名判断
async function generateWordFile (params, index) {
  const docx = await addDocPara(params); // 添加篇章
  docx.on('finalize', function (written) {
    console.log(
      'Finish to create a Microsoft Word document.'
    )
  })

  docx.on('error', function (err) {
    console.log(err)
  })

  const outDir = `Word/xxx` // 导出的文件目录
  console.log('outDir',outDir)
  // mkdirs(outDir, () => { }) // 生成文件目录

  let fileName = params['title'].replace(/\//g, '') //文件名有/不行,会被判断为文件夹
  if (fileNameArr.includes(fileName)) { 
    fileName = fileName + '-' + index;
  }
  fileNameArr.push(fileName);
  let out = await fs.createWriteStream(path.join(__dirname, `${outDir}/${fileName}.docx`));
  out.on('error', (err) => {
    console.log(err)
  })
  docx.generate(out)
}

//检测目录是否存在,不存在就创建
function mkdirs(dirname, callback) {
  fs.exists(dirname, function (exists) {  
      if (exists) {  
          callback();  
      } else {  
          mkdirs(path.dirname(dirname), function () {  
              fs.mkdir(dirname, callback);  
          });  
      }  
  });  
}

 

标签:function,文件,docx,fs,word,nodeJs,let,path,const
From: https://www.cnblogs.com/hyt09/p/17702583.html

相关文章

  • nodeJS读取JSON文件导出word文档
    前言最近遇到一个需求,将JSON文件的内容,导出到word文档,利用nodeJs和Officegen实现了文件导出的功能exportAWord.js代码如下/***读取指定文件夹下的JSON文件,导出为word*一个json文件为一个word,以json文件的名称为word文件的名称*/letfs=require("fs");letpath=......
  • 调用excel数据自动生成word文档
    应用场景:相信很多时候,您是否有过和博主一样在WORD里面重复制作某种资料的工作。比如给定了一份模板,需要根据不同内容制作出不同的word,但模板是一样的。一般情况下就是老老实实的一份一份的去填写(但人力填写难保证不出错,精力有限)。那么有没有可以自动生完成word的办法呢?答案是肯定......
  • C# 根据path递规创建文件夹
    使用场景很多,只要是要创建文件就要。所以写了一个。以后到处用就是了。///<summary>///根据path递规创建文件夹///</summary>///<paramname="filePath"></param>///<returns></returns>publicstaticboolCreateDirectoryByPath(thisstringfilePath){......
  • 百度 Web Uploader 文件批量上传组件
    WebUploader是由BaiduWebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS6+,android4+。两套运行时,同样的调用方式,可供用户任意选用。采用大文件......
  • docker 修改文件
    修改页面或者配置文件时,可以使用如下方法:dockercp[容器id]:docker容器中配置文件路径主机路径dockercpe4b322a429d1:/etc/grafana/grafana.ini/home/grafana.ini//改完之后dockercp主机文件路径[容器id]:docker容器中配置文件路径dockercp/home/grafana.in......
  • 共享文件夹添加 文件删除 可以被记录
    事件起因:在生产服务器上,某项目文件被删除,但是不知道具体是谁删除的,到底是误删除还是故意删除,所以才有了本次操作 解决办法:在生产服务器上的操作:1、选中文件夹--属性--安全--高级--审核--添加--选择主体Domainuser--显示高级权限删......
  • Git分支合并(merge)时忽略dist文件
    Git分支合并(merge)时忽略dist文件Git分支合并(merge)时忽略某个文件或者目录​前端项目不同分支dist文件合并到其他分支有很多冲突操作步骤1.定义虚拟合并策略gitconfig--globalmerge.ours.drivertrue其他配置可参考Git配置2.编辑规则文件编辑根目录下的.gita......
  • 利用word插入参考文献
    最近写论文牵涉到文献上标引用问题,找到一篇好文章,以保留做引用。写论文要有参考文献,但是每次写论文,遇到的第一个头疼的问题就是参考文献的插入。虽然以前知道word有很强大的插入参考文献的功能,也转载过别人写的经验总结,但是没有实际用过,现在用到了,把暂时遇......
  • axios+formdata上传多个文件(随手记录一下)
    <template><el-row><el-col:span="20":offset="4"style="text-align:left"><spanstyle="margin-left:200px">上传图片</span><el-uploadstyle="......
  • Android-2-manifest和build.gradle两个关键文件
    Androidmanifest.xml本质上就是用res中的文件配置项目的情况,像使用到的权限,app的名字,icon等等build.gradle.kts本质上和maven没什么区别,主要是做两个事情,一是添加插件,二是添加库(检查有无这个库,没有的话就从网上下载)Androidmanifest.xml<?xmlversion="1.0"encoding="utf-8"?>......