找回密码
 立即注册

QQ登录

只需一步,快速开始

nobt

论坛元老

86

主题

4846

帖子

5782

积分

论坛元老

积分
5782

微信认证勋章

nobt
论坛元老   /  发表于:2020-10-28 10:15  /   查看:4204  /  回复:9
1. 在Excel中对着某个单元格设置单元格格式:数值、两位小数
2. 在上面对应单元格上键入:1.60
3. 从Excel上复制这个1.60,粘贴至spreadjs表格
4. 只有1.6

怎么解决

9 个回复

正序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-9 16:05:01
11#
好的,那本帖就先结帖了,有新问题可以另开新帖
回复 使用道具 举报
nobt
论坛元老   /  发表于:2020-11-9 15:23:19
10#
lynn512 发表于 2020-11-9 15:20
“这个代码能满足需求了,再加个spreadNS.Events.ActiveSheetChanged的事件,切换sheet页也支持这样复制”
...
  1. // 定制监听粘贴事件,解决Excel复制粘贴数值精度丢失问题
  2.                             GC.Spread.Sheets.Designer.wrapper.spread.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (sender, args) {
  3.                                 var activeSheet = GC.Spread.Sheets.Designer.wrapper.spread.getActiveSheet();
  4.                                 var row = args.cellRange.row;
  5.                                 var col = args.cellRange.col;
  6.                                 // GC.Spread.Sheets.Designer.wrapper.spread.getActiveSheet().getCell(row, col).formatter("0.00");// 0.00 就是将当前单元格不管你是几位,粘贴后都按两位有效数值填充
  7.                                 var pasteData = args.pasteData.text;
  8.                                 var pasteDataArray = pasteData.split("\n");
  9.                                 for (var i = 0; i < args.cellRange.rowCount; i++) {
  10.                                     for (var j = 0; j < args.cellRange.colCount; j++) {
  11.                                         var rowNumArray = pasteDataArray[i];
  12.                                         var colNumArray = rowNumArray.split("\t");
  13.                                         var num = colNumArray[j].trim();
  14.                                         if(!isNaN(num)){
  15.                                             var x = String(num).indexOf(".") + 1;//得到小数点的位置
  16.                                             var y = String(num).length - x;//小数点的位数
  17.                                             var formatterStr = "0.";
  18.                                             if(x == 0){
  19.                                                 activeSheet.getCell(args.cellRange.row + i, args.cellRange.col + j).formatter("0");
  20.                                                 continue;
  21.                                             }
  22.                                             
  23.                                             if(y > 0) {
  24.                                                 for(var k=0; k < y; k++){
  25.                                                     formatterStr += "0";
  26.                                                 }
  27.                                                 activeSheet.getCell(args.cellRange.row + i, args.cellRange.col + j).formatter(formatterStr);
  28.                                                 continue;
  29.                                             }
  30.                                         }
  31.                                     }
  32.                                 }
  33.                             });
复制代码


没什么意思,用以上代码可以结贴了
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-9 15:20:18
9#
这个代码能满足需求了,再加个spreadNS.Events.ActiveSheetChanged的事件,切换sheet页也支持这样复制
请问您想表述的意思是什么呢?
回复 使用道具 举报
nobt
论坛元老   /  发表于:2020-11-9 13:31:39
8#
本帖最后由 nobt 于 2020-11-9 14:22 编辑
ClarkPan 发表于 2020-11-9 10:40
SpreadJS 和 Excel这里都有一个autoformatter的机制,会根据传入的数值,自动匹配一个formatter格式。这个 ...
  1. GC.Spread.Sheets.Designer.wrapper.spread.getActiveSheet().bind(GC.Spread.Sheets.Events.ClipboardPasted, function (sender, args) {
  2.                                 var activeSheet = GC.Spread.Sheets.Designer.wrapper.spread.getActiveSheet();
  3.                                 var row = args.cellRange.row;
  4.                                 var col = args.cellRange.col;
  5.                                 // GC.Spread.Sheets.Designer.wrapper.spread.getActiveSheet().getCell(row, col).formatter("0.00");// 0.00 就是将当前单元格不管你是几位,粘贴后都按两位有效数值填充
  6.                                 var pasteData = args.pasteData.text;
  7.                                 var pasteDataArray = pasteData.split("\n");
  8.                                 for (var i = 0; i < args.cellRange.rowCount; i++) {
  9.                                     for (var j = 0; j < args.cellRange.colCount; j++) {
  10.                                         var rowNumArray = pasteDataArray[i];
  11.                                         var colNumArray = rowNumArray.split("\t");
  12.                                         var num = colNumArray[j].trim();
  13.                                         if(!isNaN(num)){
  14.                                             var x = String(num).indexOf(".") + 1;//得到小数点的位置
  15.                                             var y = String(num).length - x;//小数点的位数
  16.                                             var formatterStr = "0.";
  17.                                             if(x == 0){
  18.                                                 activeSheet.getCell(args.cellRange.row + i, args.cellRange.col + j).formatter("0");
  19.                                                 continue;
  20.                                             }
  21.                                             
  22.                                             if(y > 0) {
  23.                                                 for(var k=0;k<y;k++){
  24.                                                     formatterStr += "0";
  25.                                                 }
  26.                                                 activeSheet.getCell(args.cellRange.row + i, args.cellRange.col + j).formatter(formatterStr);
  27.                                                 continue;
  28.                                             }
  29.                                         }
  30.                                     }
  31.                                 }
  32.                             });
复制代码


这个代码能满足需求了,再加个spreadNS.Events.ActiveSheetChanged的事件,切换sheet页也支持这样复制
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-11-9 10:40:25
7#
SpreadJS 和 Excel这里都有一个autoformatter的机制,会根据传入的数值,自动匹配一个formatter格式。这个您可以在Excel中测试在记事本中输入0.60然后粘贴到Excel上查看结果,结果也是0.6。这个功能是内置的,无法关闭也无法修改。
建议监听ClipboardPasted事件,在事件中给对应的单元格设置格式,例如上述例子可以在ClipboardPasted给对应单元格设置"0.00"这个formatter即可。
回复 使用道具 举报
nobt
论坛元老   /  发表于:2020-11-9 10:35:14
地板
lynn512 发表于 2020-11-9 10:32
您好,SJS与Excel一致,单元格格式默认是”常规“,所以您复制来的数据 0.60 粘贴后为0.6。如果需求是粘贴 ...

这个默认的的格式我自己不能复写事件或者通过什么api让它不默认?我就是想从Excel复制0.60的文本单元格格式过来到SJS也显示0.60,不管是显示文本还是当做数值单元格,可以做吗
回复 使用道具 举报
nobt
论坛元老   /  发表于:2020-11-9 10:04:52
板凳
ClarkPan 发表于 2020-10-28 11:40
Excel中的格式不能被粘贴到SpreadJS中,因为Excel中复制的时候不会将格式写在剪切板中,并且粘贴本身会改变 ...

从Excel拷贝文本单元格格式的值“0.60”,粘贴出来是“0.60”,但是粘贴到SpreadJS是0.6,也就是像你说的粘贴改变了单元格格式,针对这个我能不能让粘贴不改变单元格格式?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-10-28 11:40:29
沙发
Excel中的格式不能被粘贴到SpreadJS中,因为Excel中复制的时候不会将格式写在剪切板中,并且粘贴本身会改变单元格的格式。
可以考虑在粘贴后重新设置单元格的格式
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-10-28 11:33:11
楼主

您从excel复制来的值只是单元格显示的text值,不带有单元格格式。
SJS与EXCEL一致,单元格格式默认是”常规“,这种格式下,小数末尾只显示到非零位。所以您复制的 1.60,粘贴到SJS显示为 1.6。
如果想要显示为1.60,需要再次设置单元格格式。
您可以试下,从SJS复制1.60 到Excel,显示的也是 1.6。
请问您的需求是什么呢?


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部