找回密码
 立即注册

QQ登录

只需一步,快速开始

cmbsjdev
金牌服务用户   /  发表于:2024-10-24 09:26  /   查看:376  /  回复:15
1金币
本帖最后由 Wilson.Zhang 于 2024-10-30 14:41 编辑

产品:SpreadJS
版本:17.1.7
调研编号:SJS-26958,SJS-26968
Last Review:2024-10-25
当前进展:非功能问题,设计使然。
SJS-26958,Excel无单元格类型概念,仅保存单元格内容。
SJS-26968,复选框单元格类型回显时先通过逗号分隔符切分内容。

cc76afdeab7c3e685a5cb0509fd0956.jpg896220397.png
1.导出excel再导入spread设计器,文件名丢失

image.png539955749.png
2.还有这个选项本来是勾选的,重新导入来就不勾选了

15 个回复

正序浏览
Wilson.Zhang
超级版主   /  发表于:2024-10-30 14:40:24
16#
您好!由于您较长时间未回复,且从跟帖回复中了解到问题已得到有效解答,那就结帖了。如有新问题,欢迎发新帖沟通。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-29 16:19:28
15#
您好!请问下您的问题是否已得到解决?
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-25 17:42:02
14#
cmbsjdev 发表于 2024-10-25 15:44
函数代码如下:看看有没有优化空间

从您提供的代码中,了解到存在异步响应调用,这里是否存在网络访问?您可以排查下。
回复 使用道具 举报
cmbsjdev
金牌服务用户   /  发表于:2024-10-25 15:44:05
13#
Wilson.Zhang 发表于 2024-10-25 15:39
首先,不这样处理的话导入后无法复原,因此,还得保留这样的处理方式。
其次,如果在数据量较多的情况下 ...

函数代码如下:看看有没有优化空间
  1. checkBoxUpload() {
  2.       const spread = this.designer.getWorkbook();
  3.       queryHeadConfig({
  4.         taskId: this.params.taskId,
  5.       }).then((res) => {
  6.         if (!res.data.length) {
  7.           return;
  8.         }
  9.         spread.suspendPaint();
  10.         res.data.forEach((item) => {
  11.           const sheet = spread.getSheetFromName(item.sheetName);
  12.           // 添加多选框
  13.           if (!sheet) {
  14.             return;
  15.           }
  16.           const range = sheet.getRange(
  17.             `${item.columnLocate}${item.headerRows + 1}:${item.columnLocate}${sheet.getRowCount()}`,
  18.           );
  19.           if (item.columnType === 'CHECKBOX' && item.checkboxList.length) {
  20.             // 添加多选项
  21.             const radio = new GC.Spread.Sheets.CellTypes.CheckBoxList();
  22.             radio.items(
  23.               item.checkboxList.map((checkItem) => {
  24.                 return {
  25.                   text: checkItem,
  26.                   value: checkItem,
  27.                 };
  28.               }),
  29.             );
  30.             range.cellType(radio);
  31.             for (let i = item.headerRows + 1; i < sheet.getRowCount(); i++) {
  32.               const value = sheet.getValue(i, item.columnIndex);
  33.               if (value && typeof value === 'string' && value.split(',').length > 1) {
  34.                 console.log(value);
  35.                 sheet.setValue(i, item.columnIndex, value.split(','));
  36.               }
  37.             }
  38.             // 列宽自适应
  39.             sheet.autoFitColumn(range.col);
  40.           }
  41.           if (item.columnType === 'FILE_UPLOAD') {
  42.             // 添加上传文件入口
  43.             const style2 = new GC.Spread.Sheets.Style();
  44.             style2.vAlign = GC.Spread.Sheets.VerticalAlign.center;
  45.             style2.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
  46.             range.setStyle(style2);

  47.             const fileUpload = new GC.Spread.Sheets.CellTypes.FileUpload();
  48.             fileUpload.accept('.xlsx');
  49.             fileUpload.maxSize(item.maxFileSize * 1024);
  50.             fileUpload.valuePath('dataUrl');
  51.             range.cellType(fileUpload);
  52.             sheet.setColumnWidth(range.col, 200);
  53.             const rowCount = sheet.getRowCount();
  54.             for (let i = item.headerRows + 1; i < rowCount; i++) {
  55.               sheet.setRowHeight(i, 70);
  56.             }
  57.           }
  58.         });
  59.         spread.resumePaint();
  60.       });
  61.     },
复制代码


回复 使用道具 举报
cmbsjdev
金牌服务用户   /  发表于:2024-10-25 15:41:01
12#
Wilson.Zhang 发表于 2024-10-25 15:39
首先,不这样处理的话导入后无法复原,因此,还得保留这样的处理方式。
其次,如果在数据量较多的情况下 ...

这个加过了,因为外层还有一个forEach,是在forEach前后加的
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-25 15:39:30
11#
cmbsjdev 发表于 2024-10-25 14:59
这样修改以后,相较于其他的选一个的,在1w行的数据情况下,会有一个延时显示的效果,延时了5s左右,有点 ...

首先,不这样处理的话导入后无法复原,因此,还得保留这样的处理方式。
其次,如果在数据量较多的情况下存在延时显示的现象,可以尝试在复原前后的代码处用暂停绘制和恢复绘制代码包围。如下代码所示:
  1. sheet.getRange(0, 1, sheet.getRowCount(), 1).cellType(radio);
  2.             sheet.suspendPaint();
  3.             for(var i=0;i<sheet.getRowCount();i++){
  4.     var value = sheet.getValue(i,1);
  5.     if(value && typeof value === 'string' && value.split(',').length > 1){
  6.         sheet.setValue(i,1,value.split(','));
  7.     }
  8.             }
  9.             sheet.resumePaint();
  10.             sheet.autoFitColumn(1);
复制代码




回复 使用道具 举报
cmbsjdev
金牌服务用户   /  发表于:2024-10-25 14:59:48
10#
Wilson.Zhang 发表于 2024-10-25 11:58
1. 一般base64码中只包含文件内容,而不包含文件名等元数据。Excel只是SpreadJS可以兼容导出的一种文件类 ...

这样修改以后,相较于其他的选一个的,在1w行的数据情况下,会有一个延时显示的效果,延时了5s左右,有点久
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-25 11:58:50
9#
cmbsjdev 发表于 2024-10-25 11:17
1.应该可以从base64字符串解析到文件名吧
2.设计器里显示就是逗号隔开的,实际是个数组吗

1. 一般base64码中只包含文件内容,而不包含文件名等元数据。Excel只是SpreadJS可以兼容导出的一种文件类型,而SpreadJS更建议的序列化文件类型是ssjson和sjs,这些文件类型可以保存在SpreadJS电子表格中设置的所有内容。

2. CheckBoxList多选后的数据内容由逗号隔开,这个与当前情况一致。在读入xlsx文件将单元格文本内容复原为复选框选择内容时,需要根据逗号先将文本内容切割为字符串数组,将字符串数组赋值给复选框单元格方能复原。所以需要修改读入后的代码,如下图所示。
复选单元格.png558898925.png
回复 使用道具 举报
cmbsjdev
金牌服务用户   /  发表于:2024-10-25 11:17:59
8#
本帖最后由 cmbsjdev 于 2024-10-25 11:34 编辑
Wilson.Zhang 发表于 2024-10-25 09:44
您好!现将调研结果同步给您。

1. MS Excel中没有SpreadJS中单元格类型的概念,在导出为xlsx文件时,Exc ...

1.应该可以从base64字符串解析到文件名吧
2.设计器里显示就是逗号隔开的,实际是个数组吗
image.png530529479.png
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-24 16:50:27
6#
cmbsjdev 发表于 2024-10-24 15:51
选多项的时候会有问题

使用您提供的demo复现了问题现象,正在调研,调研编号为SJS-26968。需要一些时间,之后会及时向您同步结论,请您耐心等候。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部