UNPKG

exceljs-xlsx-template

Version:

Generate .xlsx file from .xlsx template. Support for Browser and Node.js

74 lines (71 loc) 2.47 kB
const ExcelJS = require("exceljs"); const { fetchUrlFile } = require("./helpers.js"); /** * * @param {ExcelJS.Cell} cell * @param {Array<{start: {row: number; col: number}; end: {row: number; col: number}}>} sheetMerges * @param {{width: number; height: number}} size * @param {'jpeg'|'png'|'gif'} ext */ async function image(cell, sheetMerges, size, ext) { if (cell.type === ExcelJS.ValueType.String) { let imageId = 0; let regx = null; const urlRegex = /https?:\/\/[^\s]+(?:\.(jpe?g|png|gif))?/i; const base64Regex = /data:image\/(jpeg|gif|png);base64,[^\s]+/i; if (urlRegex.test(cell.value)) { const matches = cell.value.match(urlRegex); const imageUrl = matches[0]; const imageExt = matches[1] ?? "png"; let fileContent = null; try { fileContent = await fetchUrlFile(imageUrl); } catch { console.warn(`Fail to load image ${imageUrl}`); return; } // 将图片添加到工作簿中 imageId = cell.workbook.addImage({ buffer: fileContent, extension: ext ?? (imageExt === "jpg" ? "jpeg" : imageExt), }); regx = urlRegex; } else if (base64Regex.test(cell.value)) { const matches = cell.value.match(base64Regex); imageId = cell.workbook.addImage({ base64: matches[0], extension: ext ?? matches[1], }); regx = base64Regex; } if (!regx) { return; } const merge = sheetMerges.find((merge) => { return merge.start.row === cell.fullAddress.row && merge.start.col === cell.fullAddress.col; }); // 坐标系基于零,A1 的左上角将为 {col:0,row:0},右下角为 {col:1,row:1} const range = { // 左上角 tl: { col: merge ? merge.start.col - 1 : cell.fullAddress.col - 1, row: merge ? merge.start.row - 1 : cell.fullAddress.row - 1, }, }; if (typeof size === "object" && size.width && size.height) { // 宽高(像素) range.ext = size; } else { // 右下角 range.br = { col: merge ? merge.end.col : cell.fullAddress.col, row: merge ? merge.end.row : cell.fullAddress.row, }; } // 将图片添加到工作表中 cell.worksheet.addImage(imageId, range); // 移除图片地址 cell.value = cell.value.replace(regx, ""); } } module.exports = { image };