exceljs-xlsx-template
Version:
Generate .xlsx file from .xlsx template. Support for Browser and Node.js
74 lines (71 loc) • 2.47 kB
JavaScript
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 };