找回密码
 立即注册

QQ登录

只需一步,快速开始

gnip

高级会员

139

主题

367

帖子

1176

积分

高级会员

积分
1176
gnip
高级会员   /  发表于:2024-10-29 14:49  /   查看:341  /  回复:9
1金币
本帖最后由 gnip 于 2024-10-29 17:52 编辑

续之前的填报后导出单元格内容和线上不一致的问题



按照给的解决方案,现在版本更新到17.1.8之后,不会报错了,但是下载后,数据下载后本地预览和线上还是有偏差,出现了明显的单元格样式错位的情况,初步尝试copy出来的sheet,并没有数据,仅仅是个模版的结构,并不是数据渲染后的sheet,导致setArray过后样式出现问题
我的代码如下:
  1.   const spread = GC.Spread.Sheets.findControl(spreadDom.value)
  2.     const sheetTabCount = spreadRef.getSheetTabCount()
  3.     const dataMap = new Map()
  4.     for (let i = 0; i < sheetTabCount; i++) {
  5.       const sheetTab = spreadRef.getSheetTab(i)
  6.       const usedRange = sheetTab.getRange()

  7.       console.log('usedRange---', usedRange)
  8.       dataMap.set(i, [])
  9.       const sheetMapItem = dataMap.get(i)
  10.       for (let i = 0; i < usedRange.rowCount; i++) {
  11.         const arr = []
  12.         for (let j = 0; j < usedRange.colCount; j++) {
  13.           let value = sheetTab.getValue(i, j)
  14.           const tagInfo = sheetTab.getSheet().getCell(i, j).tag()
  15.           if (tagInfo && tagInfo.renderCellValue) {
  16.             value = tagInfo.renderCellValue
  17.           }
  18.           arr.push(value)
  19.         }
  20.         sheetMapItem.push(arr)
  21.       }
  22.     }
  23.     const temp = new GC.Spread.Sheets.Workbook()
  24.     await temp.fromJSON(spread.toJSON())
  25.     resolveColAndRowHeader(true, temp)
  26.     const t_sheetTabCount = temp.getSheetTabCount()
  27.     for (let i = 0; i < t_sheetTabCount; i++) {
  28.       const t_sheetTab = temp.getSheetTab(i)
  29.       const usedRange = t_sheetTab.getRange()
  30.       t_sheetTab.renderMode('Preview')
  31.       t_sheetTab.getSheet().setArray(usedRange.row, usedRange.col, dataMap.get(i))
  32.     }

  33.     console.log('dataMap', dataMap)
  34.     temp.export(
  35.       (blob) => {
  36.         fileSaver.saveAs(
  37.           blob,
  38.           `${
  39.             typeof downloadFieldName === 'string'
  40.               ? downloadFieldName
  41.               : reportDetail.value.reportName
  42.           }.xlsx`
  43.         )
  44.         // 隐藏行头
  45.         setTimeout(() => {
  46.           resolveColAndRowHeader(false, temp)
  47.           sheetLoading.value = false
  48.         }, 200)
  49.         ElMessage({
  50.           message: '导出成功',
  51.           type: 'success'
  52.         })
  53.       },
  54.       null,
  55.       {
  56.         fileType: GC.Spread.Sheets.FileType.excel
  57.       }
  58.     )
复制代码




test1111.gif

9 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-10-29 18:00:10
沙发
收到,调研下回复您。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-10-30 10:21:00
板凳
您好,请将您的模板导出json上传下,我未能复现您的问题。
回复 使用道具 举报
gnip
高级会员   /  发表于:2024-10-30 13:56:10
地板
Ellia.Duan 发表于 2024-10-30 10:21
您好,请将您的模板导出json上传下,我未能复现您的问题。

复现问题demon已上传,点击拷贝下载明显的和线上不一致了
演示.gif

填报下载问题.zip

1.14 MB, 下载次数: 11

回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-10-30 16:35:34
5#
已复现,调研编号:SJS-27095
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-11-1 14:58:53
6#
本帖最后由 Ellia.Duan 于 2024-11-1 16:12 编辑

您好,针对前面帖子提出的解决方案已修改:
https://gcdn.grapecity.com.cn/fo ... =1&extra=#pid843209

这个是因为:
ReportSheet的预览界面是由数据驱动的。
比如说,数据源有三条,在模板中设置一行字段后,设置一行静态的样式,如下图 image.png947641906.png
在预览页面将在7行以后,扩展出数据源的行数。

而您remote中read采用的是promise方法,在toJSON ,fromJSON后,此时获取的数据源是空的。因为不是静态数据。
所以,此时预览时,模板中的7行就不会向下扩展,所以在setArray后出现了如下图的问题:
image.png16193541.png

为此,正确做法是,重新为dataManager中为table重设数据源。
当然这个数据源,可以是任意方式,比如说您下拉框中value改为label。



总体上来说,ReportSheet有一个数据引擎,预览页面由数据驱动,setValue,setArray无法控制其行为。如果想要导出显示的内容与预览时不一样,就重新设置数据源即可。

具体参考这个demo: update.html (9.98 KB, 下载次数: 4)
回复 使用道具 举报
gnip
高级会员   /  发表于:2024-11-8 15:44:20
7#
本帖最后由 gnip 于 2024-11-8 16:39 编辑
Ellia.Duan 发表于 2024-11-1 14:58
您好,针对前面帖子提出的解决方案已修改:
https://gcdn.grapecity.com.cn/fo ... =1&extra=#pid843209
...

但是,这样的方式去下载,还是有2个明显的问题
1、每次重设数据源,页面的改动就没法下载呢,每次下载的都是初始化服务端拉取的数据,预期的下载是能够编辑后也能下载修改的部分,实时的
2、每次拉取数据的时候,由于是从后端重新拉取,页面配置的下拉这种单元格,我重新拉取后,处理数据字段的时候,也不知道他是不是下拉,要不要映射成label(具体标识实在页面模版配置的时候,配置在单元格属性上的)
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-11-8 17:11:23
8#
1、如果客户客户修改后的数据,不经过“提交”确认,直接导出为Excel ,我认为是不合理的。
导出Excel后查看的数据,应该是经过验证的正确的数据,即需要点击“提交”后,前端后端同时做一些验证,数据正确后,修改数据库。

此时,重新拉取最新的数据源的数据,再导出Excel文件,符合正常流程。

2、对于下拉框问题,数据库中应该保存的是一个value值,所以数据库保存的值 应该和excel中看到的label值不一样。
所以,导出时,遍历数据源此字段,通过映射,重设单元格文本,在进行导出。
回复 使用道具 举报
gnip
高级会员   /  发表于:2024-11-11 14:06:09
9#
Ellia.Duan 发表于 2024-11-8 17:11
1、如果客户客户修改后的数据,不经过“提交”确认,直接导出为Excel ,我认为是不合理的。
导出Excel后查 ...

行的,这样可以,结贴吧
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-11-11 15:11:29
10#
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部