首页 > 编程语言 >nodeJS读取JSON文件导出word文档

nodeJS读取JSON文件导出word文档

时间:2023-09-14 15:11:26浏览次数:44  
标签:function docx word nodeJS content JSON let path const

前言
最近遇到一个需求,将JSON文件的内容,导出到word文档,利用nodeJs 和 Officegen 实现了文件导出的功能
exportAWord.js 代码如下

/**
 * 读取指定文件夹下的JSON文件,导出为word
 * 一个json文件为一个word,以json文件的名称为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; // 去除MaxListenersExceededWarning限制

let DIR = path.join(__dirname, 'Json');  // 需要导出的文件夹
let docx = officegen({
  type: "docx",
  styleXML,
});


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) => { 
    await addDocPara(p)
  })
  await generateWordFile(e);
})

// 读取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']; // 文档内容
   
  //定义文档的标题
  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'
  })
}

async function generateWordFile (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/` // 导出的文件目录
  const fileName = params.split('.')[0] // 导出的文件名称
  let out = await fs.createWriteStream(path.join(__dirname, `${outDir}/${fileName}.docx` ));
  out.on('error', (err) => {
    console.log(err)
  })
  docx.generate(out)
}

styles.xml 代码如下

<w:styles xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
    xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
    xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
    xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
    xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" mc:Ignorable="w14 w15 w16se">
    <w:style w:type="paragraph" w:styleId="myHeading1">
        <w:name w:val="heading 1"/>
    </w:style>
    <w:style w:type="paragraph" w:styleId="myHeading2">
        <w:name w:val="heading 2"/>
    </w:style>
    <w:style w:type="paragraph" w:styleId="myHeading3">
        <w:name w:val="heading 3"/>
    </w:style>
    <w:style w:type="paragraph" w:styleId="myHeading4">
        <w:name w:val="heading 4"/>
    </w:style>
    <w:style w:type="paragraph" w:styleId="myHeading5">
        <w:name w:val="heading 5"/>
    </w:style>
</w:styles>

 

 

 

标签:function,docx,word,nodeJS,content,JSON,let,path,const
From: https://www.cnblogs.com/hyt09/p/17702556.html

相关文章

  • 调用excel数据自动生成word文档
    应用场景:相信很多时候,您是否有过和博主一样在WORD里面重复制作某种资料的工作。比如给定了一份模板,需要根据不同内容制作出不同的word,但模板是一样的。一般情况下就是老老实实的一份一份的去填写(但人力填写难保证不出错,精力有限)。那么有没有可以自动生完成word的办法呢?答案是肯定......
  • netcore请求json斜杠带空格导致请求报错
    我用netcore发布了一个webapi接口,个别电脑,同样的浏览器(谷歌),swagger调用接口的时候,它的json体会加空格,然后请求就会报错。这是控制器里的方法下图是请求输入: 下图是加了空格的请求内容,如红色框所示,带了空格 下图是报错的内容下图是正常请求的内容,可以返回想要的结果......
  • 利用word插入参考文献
    最近写论文牵涉到文献上标引用问题,找到一篇好文章,以保留做引用。写论文要有参考文献,但是每次写论文,遇到的第一个头疼的问题就是参考文献的插入。虽然以前知道word有很强大的插入参考文献的功能,也转载过别人写的经验总结,但是没有实际用过,现在用到了,把暂时遇......
  • 【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-云影
    (文章目录)前言幂数加密是一种基于离散对数问题和群论理论的非对称加密算法。它使用一个生成元为质数p的循环群G来进行加密和解密。通常情况下,该算法的安全性建立在离散对数难题上,即找到群G中的一个元素g的k次方等于给定的元素h,其中k为未知数。该算法与RSA加密算法相比,具有更高的......
  • 谷歌浏览器json格式化插件安装
    在前端开发中,经常需要处理json格式数据,方便查看和调试。而chrome浏览器提供了很多插件来帮助我们更方便地处理json数据,今天我们就来介绍一款非常方便的json格式化插件——JSONFormatter。插件安装该插件可以在ChromeWebStore中直接下载和安装,也可以通过浏览器插件商店进行安装。......
  • Jmeter BeanShell, 读取HTTP请求返回的JSON,并将其存到文件中
    1、创建BeanShellSampler将fastjson-1.2.30.jar放到Jmeter安装目录\lib下 importjava.io.*;importcom.alibaba.fastjson.JSONObject;importjava.io.IOException;importjava.io.File;importjava.io.FileOutputStream;importjava.io.FileWriter;privatestat......
  • 【超详细】宝塔面板安装WordPress程序图文教程
    宝塔面板是目前广受用户喜爱的服务器控制面板之一,自己也在用,确实很方便,很多用户的网站都是基于宝塔面板搭建,今天简单介绍下宝塔面板是如何安装WordPress的,方便新手用户快速部署。也方便自己以后查阅。一、安装宝塔插件大部分使用宝塔面板的用户可能还不知道在宝塔插件里面有一个......
  • Helm CLI部署wordpress到ACK集群
    wgethttps://labfileapp.oss-cn-hangzhou.aliyuncs.com/helm-v3.9.0-linux-amd64.tar.gztar-zxvfhelm-v3.9.0-linux-amd64.tar.gzmvlinux-amd64/helm/usr/local/bin/helmhelmrepoaddbitnamihttps://charts.bitnami.com/bitnamihelminstallwordpressbitnami/wo......
  • C# JSON字符串转带头(声明)XML字符串
     privatestringConverXml(stringmemberId,intcode,stringmsg)    {      varresp=new{authenticate=new{member_id=memberId,status_code=code,message=msg}};      varjsonstr=JsonConvert.SerializeObject(re......
  • 完美解决MySQL ERROR:Access denied for user `root`@`localhost` (using password:YE
    windows找到mysql安装目录下的my.ini,并在最后一行添加skip-grant-tableslinux目录为etc/my.cnf在最后一行添加skip-grant-tables 1、输入mysql-uroot-p  然后回车2、输入usemysql; 3、输入updateusersetpassword=password("这里填写要设置的密码")whereuser=......