NodeJs

ExcelJS 生成Excel文件

有的时候我们希望能在Server端通过代码把数据生成Excel文件,如果是Nodejs的话,ExcelJs可以很好的满足我们的要求。使用非常简单,可以看官网的例子。

ExcelJS官方地址:https://www.npmjs.com/package/exceljs

中文文档地址:https://github.com/exceljs/exceljs/blob/HEAD/README_zh.md

下面是一个Nodejs 使用的例子:

const detailTextFont = {
  // 字体名
  name: 'Yu Gothic Regular (本文)',
  // Font family for fallback. An integer value. 
  family: 4,
  // 字体大小
  size: 11,
  // 下划线
  underline: false,
  // 加粗
  bold: false,
};

// nodejs 方法
router.post('/createExcel', async function (req, res) {

  const jsonParm = req.body;
  // 从数据库取得某些数据
  const returnData = dataBase.xxxxxxx(dbschema, jsonParm)


  // 生成workbook对象
  const workbook = new Excel.Workbook();
  // 读取本地的一个Excel文件(模版文件)
  await workbook.xlsx.readFile("./template.xlsx");
  // 获取文件的一个Sheet页面
  const worksheet = workbook.getWorksheet('shee1');
  // 给K1单元格赋值
  worksheet.getCell('K1').value = "XXXX";
  // 给N4单元格赋值
  worksheet.getCell('N4').value = "XXXXX";
  // 给N4单元格赋值设定字体
  worksheet.getCell('N4').font = detailTitleFontBold;

  // 从网络上下载图片到Server端本地目录
  var downLoadFlag = await downLoadImage("imageName")

  // 如果下载成功,把图片插入到Excel中
  if (downLoadFlag) {
      const imageId1 = workbook.addImage({
        filename: imageName,
        extension: 'png',
      });
      worksheet.addImage(imageId1, 'D37:T47');
    }
  }

  // 保存修改到Excel文件
  workbook.xlsx.writeFile(fileName + ".xlsx").then(function () {
    // 如果成功,读取把Excel文件,并把Excel文件返回到Http Response中
    fs.createReadStream(fileName + ".xlsx").pipe(res);
    // 设定Http Response的Header,注意跨域
    res.writeHead(200, {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Headers': 'X-Requested-With',
      'Access-Control-Allow-Methods': 'PUT,POST,GET,DELETE,OPTIONS',
      'Content-Type': 'application/octet-stream;charset=UTF8',
      'Content-Disposition': 'attachment; filename=' + fileName + '.xlsx'
    });

    // 后续操作 删除相关的图片 和 生成的Excel文件。
    fs.unlinkSync(fileName + ".xlsx");
    fs.unlinkSync(imageName);   
    }
  });
});

浏览器端VUE调用的例子

createExcelFile() {
      return new Promise((resolve, reject) => {
     
        let jsonData = {
          ids: xxxx,
        };
        this.$axios({
          // timeout时间
          timeout: 180000,
          method: "post",
          url:  "https://xxxxx/createExcel",
          data: jsonData,
          // 注意responseType blob
          responseType: "blob"
        })
          .then((response) => {
            const fileName = new Date().format("yyyyMMddhhmm");
            let url = window.URL.createObjectURL(new Blob([response.data]));
            let link = document.createElement("a");
            link.style.display = "none";
            link.href = url;
            link.setAttribute("download", fileName + ".xlsx");
            document.body.appendChild(link);
            link.click();
          })
          .catch((error) => {
            reject(error);
          });
      });
    },