找回密码
 立即注册

QQ登录

只需一步,快速开始

进先生

注册会员

2

主题

3

帖子

23

积分

注册会员

积分
23
  • 67

    金币

  • 2

    主题

  • 3

    帖子

最新发帖
进先生
注册会员   /  发表于:2023-5-24 14:29  /   查看:1056  /  回复:6
10金币
本帖最后由 JoestarXu 于 2023-5-25 11:45 编辑

项目没有接入在线表格设计器(designer),但是有打印需求,因此需要实现一个简版的设计器打印预览功能。支持用户实时调整边距与方向。如下图。
image.png771050414.png
根据下面的demo,我们可知,GC.Spread.Sheets.Events.BeforePrint 事件会产生一个 iframe,然后将这个iframe 展示处理。由于需要调整边距,因此我们需要将这个 iframe 作为预览组件的一部分,嵌入到组件dom 中,但是通过 appendChild 方法移动 iframe 后,发现 iframe 的内容被清空了。
image.png405178222.png

想咨询一下,当前版本,是否有方法可实现上面的需求,或只单纯的使用在线表格设计器中的打印预览功能

相关链接:
https://gcdn.grapecity.com.cn/showtopic-142510-1-11.html

最佳答案

查看完整内容

您好,请尝试以下解决方案:

6 个回复

正序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-25 18:54:48
7#
不圆的珍珠 发表于 2023-6-25 16:42
你好 我也遇到了想同的问题 请问现在有解决的方案了吗?

参考置顶回复的方案:
image.png329042968.png
回复 使用道具 举报
不圆的珍珠
注册会员   /  发表于:2023-6-25 16:42:23
6#
你好 我也遇到了想同的问题 请问现在有解决的方案了吗?
回复 使用道具 举报
JoestarXu
超级版主   /  发表于:2023-5-25 11:34:42
4#
您好,问题已重现,这边调研一下解决方案,有后续进展我会在本帖下回复您。

本帖先做保留处理了。
回复 使用道具 举报
进先生
注册会员   /  发表于:2023-5-25 10:30:39
3#
https://jscodemine.grapecity.com/share/rL2Gldldckq6azOVP9vtEg/
在官方的demo中,添加一个预览容器,然后在 BeforePrint 事件中,将 iframe 插入到容器中。
  1. <!doctype html>
  2. <html>
  3. <head>
  4.     <title>SpreadJS in TypeScript</title>
  5.         <link rel="stylesheet" type="text/css" href="node_modules/@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css">
  6.      <link rel="stylesheet type="text/css" href="node_modules/@grapecity/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css">
  7.     <script src="node_modules/systemjs/dist/system.src.js"></script>
  8.     <script src="systemjs.config.js"></script>
  9.     <button id='preview'>预览</button> <button id='cancel'>取消预览</button>
  10.     <div id="previewContainer" style="border:10px solid;"></div>
  11.     <div id="designer-container" style="width:100%;height:98vh;border:1px solid darkgray"></div>
  12.     <script>
  13.         System.import('./src/app');
  14.     </script>
  15. </head>
  16. <body>
  17. </body>
  18. </html>
复制代码

  1. let pc = document.getElementById('previewContainer')

  2. spread.bind(GC.Spread.Sheets.Events.BeforePrint,function(e,data){
  3.     // 监听打印前事件,获取回调中的iframe,修改iframe宽高及位置,并取消打印
  4.     sjsiframe = data.iframe
  5.     pc.appendChild(sjsiframe)

  6.     sjsiframe.style.width = '800px'
  7.     sjsiframe.style.height = '600px'
  8.     sjsiframe.style.top = '200px'
  9.     sjsiframe.style.left = '200px'
  10.     sjsiframe.style.background = '#ffffff'
  11.     sjsiframe.style.border = '10px solid'
  12.     data.cancel = true
  13. })
复制代码
回复 使用道具 举报
JoestarXu
超级版主   /  发表于:2023-5-24 18:20:34
2#
您好,“通过 appendChild 方法移动 iframe 后,发现 iframe 的内容被清空了。”这一步您是具体怎么操作的呢?能否提供一个Demo我们这边根据代码调研一下。
回复 使用道具 举报
最佳答案
最佳答案
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-5-24 14:29:04
来自 5#
您好,请尝试以下解决方案:

  1. let printContent;
  2. let pc = document.getElementById('previewContainer')
  3. spread.bind(GC.Spread.Sheets.Events.BeforePrint, function (e, data) {
  4.     // 监听打印前事件,获取回调中的iframe,修改iframe宽高及位置,并取消打印
  5.     let iframe = data.iframe;
  6.     if (iframe.contentDocument && iframe.contentDocument.body && iframe.contentDocument.body.firstChild) {
  7.         printContent = iframe.contentDocument.body.firstChild;
  8.         iframe.contentDocument.body.removeChild(printContent);
  9.         pc.appendChild(printContent);
  10.     }
  11.     data.cancel = true
  12. });
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部