If the source spreadsheet contains an image, and then the widths of the columns it overlaps are manipulated, the image will be scaled as well. However, there are options within Excel that allow users to explicitly determine the behavior of image resizing with respect to column manipulation (right-click image -> "Size and Properties" -> "Properties" section). In this case, I have set the image properties to "Don't move or size with cells", so I'm hoping that there is a way for that setting to be taken into account.
Hopefully this is enough to get started. Please let me know if I can be of any more help.
const xlsxPopulate = require('xlsx-populate');
xlsxPopulate.fromFileAsync('./example-with-image.xlsx')
.then(workbook => {
const sheet = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
const worksheet = workbook.sheet(0);
// Insert sheet data
const rowsCount = (sheet.length - 1);
const columnCount = (sheet[0].length - 1);
const cellStartInsert = workbook.find("${data}")[0];
const cellEndInsert = cellStartInsert.relativeCell(rowsCount, columnCount);
const addrStartCell = cellStartInsert.address();
const addrEndCell = cellEndInsert.address();
const rangeForSheet = worksheet.range(`${addrStartCell}:${addrEndCell}`);
rangeForSheet.value(sheet);
// Auto-size column widths and set heights to rows
const addrHeaderEnd = cellStartInsert.relativeCell(0, columnCount).address();
const rangeHeader = worksheet.range(`${addrStartCell}:${addrHeaderEnd}`);
rangeHeader.forEach((cell, ri, ci, range) => {
const cellColumnLast = cell.relativeCell(rowsCount, 0);
const addrColumnFirst = cell.address();
const addrColumnLast = cellColumnLast.address();
const columnWidth = 25;
const addrColumn = cell.column().address().split(':')[0];
worksheet.column(addrColumn).width(columnWidth);
});
workbook.toFileAsync('./out.xlsx');
});