Node.js 生成Word

2,490 阅读2分钟

一、方法

使用 officegen 包,npm 地址 www.npmjs.com/package/off…

二、Demo

新建word.js 来测试officegen用法,代码如下,运行node word.js 后,会在当前目录生成 out.docx 文件,officegen API可以参考www.npmjs.com/package/off…

var officegen = require("officegen");
var fs = require("fs");
var docx = officegen("docx"); //word

docx.on("finalize", function (written) {
  console.log(
    "Finish to create Word file.\nTotal bytes created: " + written + "\n"
  );
});

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

var table = [
  [
    {
      val: "No.",
      opts: {
        align: "center",
        vAlign: "center",
        sz: "36",
        // cellColWidth: 42,
        // b:true,
        // sz: '48',
        // shd: {
        //   fill: "7F7F7F",
        //   themeFill: "text1",
        //   "themeFillTint": "80"
        // },
        // fontFamily: "Avenir Book"
      },
    },
    {
      val: "省份",
      opts: {
        align: "center",
        vAlign: "center",
        sz: "36",
        // b:true,
        // color: "A00000",
        // align: "right",
        // shd: {
        //   fill: "92CDDC",
        //   themeFill: "text1",
        //   "themeFillTint": "80"
        // }
      },
    },
    {
      val: "市",
      opts: {
        align: "center",
        vAlign: "center",
        sz: "36",
        // cellColWidth: 42,
        // b:true,
        // sz: '48',
        // shd: {
        //   fill: "92CDDC",
        //   themeFill: "text1",
        //   "themeFillTint": "80"
        // }
      },
    },
    {
      val: "区/县",
      opts: {
        align: "center",
        vAlign: "center",
        sz: "36",
        // cellColWidth: 42,
        // b:true,
        // sz: '48',
        // shd: {
        //   fill: "92CDDC",
        //   themeFill: "text1",
        //   "themeFillTint": "80"
        // }
      },
    },
  ],
];

var data = [
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
  {
    id: "101010100",
    provinceZh: "北京",
    leaderZh: "北京",
    cityZh: "北京",
    cityEn: "beijing",
  },
];
var tableStyle = {
    tableColWidth: 2400,
    tableSize: 24,
    tableColor: "ada",
    tableAlign: "center",
    tableVAlign: "center",
    tableFontFamily: "Comic Sans MS",
    borders: true
}

//var tows = ['id', 'provinceZh', 'leaderZh', 'cityZh', 'cityEn'];//创建一个和表头对应且名称与数据库字段对应数据,便于循环取出数据
var pObj = docx.createP({ align: "center" }); // 创建行 设置居中 大标题
pObj.addText("全国所有城市", { bold: true, font_face: "Arial", font_size: 18 }); // 添加文字 设置字体样式 加粗 大小

// let towsLen = tows.length
let dataLen = data.length;
for (var i = 0; i < dataLen; i++) {
  //循环数据库得到的数据,因为取出的数据格式为

  /************************* 文本 *******************************/
//   var pObj = docx.createP();//创建一行,可以
//   pObj.addText(`(${i+1}), `,{ bold: true, font_face: 'Arial',});
//   pObj.addText(`省级:`,{ bold: true, font_face: 'Arial',});
//   pObj.addText(`${data[i]['provinceZh']}  `,);
//   pObj.addText(`市级:`,{ bold: true, font_face: 'Arial',});
//   pObj.addText(`${data[i]['leaderZh']}  `);
//   pObj.addText(`县区:`,{ bold: true, font_face: 'Arial',});
//   pObj.addText(`${data[i]['cityZh']}`);

  /************************* 表格 *******************************/
  let SingleRow = [
    data[i]["id"],
    data[i]["provinceZh"],
    data[i]["leaderZh"],
    data[i]["cityZh"],
  ];
  table.push(SingleRow);
}
docx.createTable(table, tableStyle);

// word分页
docx.putPageBreak()

// 下一页内容
docx.createTable(table, tableStyle);
var out = fs.createWriteStream("out.docx"); // 文件写入
out.on("error", function (err) {
  console.log(err);
});
var result = docx.generate(out); // 当前目录生成word