找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2024-4-2 11:15  /   查看:1275  /  回复:0
本帖最后由 Lynn.Dou 于 2024-4-2 11:39 编辑

背景:
用户希望实现这样一个功能:选择单元格区域后,可以点击按钮将这片区域作为图片导出。

思路:
如果将该业务放在后端处理,借助GcExcel可以很容易实现。GcExcel提供了toImage方法,支持将工作表、单元格区域等直接导出为图片。
如果是对于SpreadJS,应该如何实现呢?
SpreadJS在打印的时候其实默认会生成图片,可以借助打印功能实现此需求。
需注意,因需要借助printInfo的打印区域功能,去控制想要导出图片的单元格区域,所以在设置完成后会影响原sheet打印设置。
为避免影响后续的打印/导出pdf行为,需在导出图片后恢复原sheet的打印设置。

主要代码如下:
  1. //将事件绑定到工作薄 在打印之前
  2.             spread.bind(GC.Spread.Sheets.Events.BeforePrint, (s, e) => {
  3.                 let iframe = e.iframe
  4.                 let imgs = iframe.contentWindow.document.getElementsByTagName("img")
  5.                 for (let i = 0; i < imgs.length; i++) {
  6.                     let img = imgs[i]
  7.                     let canvas = document.createElement("canvas")
  8.                     canvas.height = img.naturalHeight
  9.                     canvas.width = img.naturalWidth
  10.                     let ctx = canvas.getContext('2d')
  11.                     ctx.fillStyle = '#fff'
  12.                     ctx.fillRect(0, 0, canvas.width, canvas.height)
  13.                     ctx.drawImage(img, 0, 0)
  14.                     canvas.toBlob((blob) => {
  15.                         const link = document.createElement("a");
  16.                         link.href = URL.createObjectURL(blob);
  17.                         link.download = "test" + i + ".png";
  18.                         link.click();
  19.                         link.remove();
  20.                     })
  21.                     e.cancel = true
  22.                 }
  23.             })

  24.             document.getElementById('exportImgs').onclick = () => {
  25.                 sheet = spread.getActiveSheet();
  26.                 // 获取sheet原打印设置,便于后面恢复
  27.                 var oldPrintInfo = sheet.printInfo();
  28.                 var oldPrintArea = sheet.getCustomName("Print_Area") && GC.Spread.Sheets.CalcEngine.expressionToFormula(sheet, sheet.getCustomName("Print_Area").getExpression());
  29.                 console.log("原打印设置", oldPrintInfo);
  30.                
  31.                 setPrintInfo(sheet);
  32.                 spread.print();
  33.                
  34.                 // 恢复原sheet的打印设置,以避免影响打印/导出pdf行为
  35.                 sheet.printInfo(oldPrintInfo);
  36.                 sheet.removeCustomName("Print_Area");
  37.                 if (oldPrintArea) {
  38.                     sheet.addCustomName("Print_Area", oldPrintArea)
  39.                 }
  40.                 console.log("恢复后的打印设置:", sheet.printInfo());
  41.                 designer.refresh();
  42.             }
  43.    
  44.             function setPrintInfo(sheet) {
  45.                 let sel = sheet.getSelections()[0];
  46.                 // 借助printInfo的打印区域功能,去控制想要导出图片的单元格区域。
  47.                 let printInfo = new GC.Spread.Sheets.Print.PrintInfo();
  48.                 //打印质量大于4时才会生成图片
  49.                 printInfo.qualityFactor(9);
  50.                 // 隐藏行列头
  51.                 printInfo.showColumnHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide)
  52.                 printInfo.showRowHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide)
  53.                 printInfo.paperSize(new GC.Spread.Sheets.Print.PaperSize(GC.Spread.Sheets.Print.PaperKind.a3))
  54.                 printInfo.margin({
  55.                     top: 0,
  56.                     bottom: 0,
  57.                     left: 0,
  58.                     right: 0,
  59.                     header: 0,
  60.                     footer: 0
  61.                 });
  62.                 // 打印选中区域
  63.                 printInfo.rowStart(sel.row);
  64.                 printInfo.rowEnd(sel.row + sel.rowCount - 1);
  65.                 printInfo.columnStart(sel.col);
  66.                 printInfo.columnEnd(sel.col + sel.colCount - 1);
  67.                 sheet.printInfo(printInfo);
  68.                 console.log("导出图片的打印设置:", printInfo);
  69.             }
复制代码
来看下效果:

pic.gif618749694.png
完整代码请参考附件demo。

exportPic_V17.html

7.31 KB, 下载次数: 154

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部