ExcelJS:应用自动筛选后,隐藏行中的图片仍然会显示
我正在使用ExcelJS 4.4.0 + Node.js导出一个单元格内带图片的工作表。第一次打开时看起来没问题——每一行的图片都在D 列。但一旦开启自动筛选并隐藏一些行,情况就乱了:隐藏行中的图片不会消失。它们仍然存在,或者落在了错误的行上。
我基本想要的是筛选时“图片和单元格绑定”。我尝试了 editAs: 'oneCell',但没有帮助。
下面给出一个最小重现步骤:
const ExcelJS = require('exceljs');
async function main() {
const workbook = new ExcelJS.Workbook();
const sheet = workbook.addWorksheet('test');
sheet.columns = [
{ header: 'ID', key: 'id', width: 8 },
{ header: 'Name', key: 'name', width: 12 },
{ header: 'Category', key: 'category', width: 12 },
{ header: 'Image', key: 'image', width: 18 },
];
sheet.autoFilter = 'A1:D1';
const png = Buffer.from(
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==',
'base64'
);
const imageId = workbook.addImage({ buffer: png, extension: 'png' });
const rows = [
[1, 'Alpha', 'A'],
[2, 'Beta', 'B'],
[3, 'Gamma', 'A'],
[4, 'Delta', 'B'],
[5, 'Epsilon', 'A'],
];
for (const [id, name, category] of rows) {
const row = sheet.addRow([id, name, category, '']);
sheet.getRow(row.number).height = 40;
sheet.addImage(imageId, {
tl: { col: 3, row: row.number - 1 },
ext: { width: 100, height: 50 },
editAs: 'oneCell',
});
}
await workbook.xlsx.writeFile('output.xlsx');
console.log('Done: output.xlsx');
}
main();
如何重现:
npm init -y && npm install [email protected]- 将文件另存为
generate.js,运行node generate.js - 在WPS 12.1.25897(macOS)中打开
output.xlsx - 筛选 Category(C列),取消勾选 A
- 行1/3/5被隐藏,但第5 行(Category A)的图片仍然在那里——位于最后一个可见行的下方
所以只有第2 和第4 行应该有图片。实际上,至少有一张隐藏行的图片仍然会显示。下面有截图——我给每行使用不同颜色的图片,这样更容易看出哪一张是错的。
筛选前:
筛选后(隐藏A):
我的设置:
- ExcelJS 4.4.0
- Node 20.x
- macOS 15
- WPS Office 12.1.25897
另外在GitHub上还看到这个话题的[讨论串]——看起来相关,但我还没找到对我有用的修复方法。
我的问题是:
- ExcelJS实际上是否支持真正的“图片在单元格中”嵌入?
- 如果不支持,是否有一个
addImage设置,在AutoFilter下表现良好?(oneCell对比twoCell,tl/br对比ext,等。)
如果有指点,一定不胜感激——已经卡在这里很久了。谢谢!
解决方案
ExcelJS目前不支持将图片放在单元格内。
关于这个话题还有一些未解决的议题/讨论,其中这个是最新/最活跃的: https://github.com/exceljs/exceljs/discussions/2839
考虑对该讨论进行投票/跟帖,以表示你对这个特性的关注。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。