SpreadJS选择区域导出图片
本帖最后由 Lynn.Dou 于 2024-4-2 11:39 编辑背景:
用户希望实现这样一个功能:选择单元格区域后,可以点击按钮将这片区域作为图片导出。
思路:
如果将该业务放在后端处理,借助GcExcel可以很容易实现。GcExcel提供了toImage方法,支持将工作表、单元格区域等直接导出为图片。
如果是对于SpreadJS,应该如何实现呢?
SpreadJS在打印的时候其实默认会生成图片,可以借助打印功能实现此需求。
需注意,因需要借助printInfo的打印区域功能,去控制想要导出图片的单元格区域,所以在设置完成后会影响原sheet打印设置。
为避免影响后续的打印/导出pdf行为,需在导出图片后恢复原sheet的打印设置。
主要代码如下:
//将事件绑定到工作薄 在打印之前
spread.bind(GC.Spread.Sheets.Events.BeforePrint, (s, e) => {
let iframe = e.iframe
let imgs = iframe.contentWindow.document.getElementsByTagName("img")
for (let i = 0; i < imgs.length; i++) {
let img = imgs
let canvas = document.createElement("canvas")
canvas.height = img.naturalHeight
canvas.width = img.naturalWidth
let ctx = canvas.getContext('2d')
ctx.fillStyle = '#fff'
ctx.fillRect(0, 0, canvas.width, canvas.height)
ctx.drawImage(img, 0, 0)
canvas.toBlob((blob) => {
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "test" + i + ".png";
link.click();
link.remove();
})
e.cancel = true
}
})
document.getElementById('exportImgs').onclick = () => {
sheet = spread.getActiveSheet();
// 获取sheet原打印设置,便于后面恢复
var oldPrintInfo = sheet.printInfo();
var oldPrintArea = sheet.getCustomName("Print_Area") && GC.Spread.Sheets.CalcEngine.expressionToFormula(sheet, sheet.getCustomName("Print_Area").getExpression());
console.log("原打印设置", oldPrintInfo);
setPrintInfo(sheet);
spread.print();
// 恢复原sheet的打印设置,以避免影响打印/导出pdf行为
sheet.printInfo(oldPrintInfo);
sheet.removeCustomName("Print_Area");
if (oldPrintArea) {
sheet.addCustomName("Print_Area", oldPrintArea)
}
console.log("恢复后的打印设置:", sheet.printInfo());
designer.refresh();
}
function setPrintInfo(sheet) {
let sel = sheet.getSelections();
// 借助printInfo的打印区域功能,去控制想要导出图片的单元格区域。
let printInfo = new GC.Spread.Sheets.Print.PrintInfo();
//打印质量大于4时才会生成图片
printInfo.qualityFactor(9);
// 隐藏行列头
printInfo.showColumnHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide)
printInfo.showRowHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide)
printInfo.paperSize(new GC.Spread.Sheets.Print.PaperSize(GC.Spread.Sheets.Print.PaperKind.a3))
printInfo.margin({
top: 0,
bottom: 0,
left: 0,
right: 0,
header: 0,
footer: 0
});
// 打印选中区域
printInfo.rowStart(sel.row);
printInfo.rowEnd(sel.row + sel.rowCount - 1);
printInfo.columnStart(sel.col);
printInfo.columnEnd(sel.col + sel.colCount - 1);
sheet.printInfo(printInfo);
console.log("导出图片的打印设置:", printInfo);
}来看下效果:
完整代码请参考附件demo。
页:
[1]