在web中js实现类似excel的表格控件


Posted in Javascript onSeptember 01, 2016

Execl功能非常强大,内置的很多函数或公式可以大大提高对数据的加工处理能力。那么在web中有没有类似的控件呢?经过一番搜寻,发现handsontable具备了基本的excel功能支持公式,同时能对数据进行实时编辑。另外支持拖动复制、Ctrl+C 、Ctrl+V 等等。在浏览器支持方面,它支持以下的浏览器: IE7+, FF, Chrome, Safari, Opera。

首先引入相关库文件,公式支持不包含在handsontable.full.js中,需要单独引入: 

<script src="http://handsontable.github.io/handsontable-ruleJS/lib/jquery/jquery-1.10.2.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/handsontable/handsontable.full.js"></script>
<link rel="stylesheet" media="screen" href="http://handsontable.github.io/handsontable-ruleJS/lib/handsontable/handsontable.full.css">
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/lodash/lodash.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/underscore.string/underscore.string.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/moment/moment.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/numeral/numeral.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/numericjs/numeric.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/js-md5/md5.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/jstat/jstat.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/lib/formulajs/formula.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/js/parser.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/RuleJS/js/ruleJS.js"></script>
<script src="http://handsontable.github.io/handsontable-ruleJS/lib/handsontable/handsontable.formula.js"></script>

在HTML中放置一个Div容器来存放handsontable控件:

<body>
  <div id="handsontable-code"></div>
 </body>

在javascript代码中,首先获取div容器,然后创建表格控件: 

<script type="text/javascript">
   $(document).ready(function () {

 var data1 = [
  ['=$B$2', "Maserati", "Mazda", "return 1+2;", 'return DataAccess.getScalar("select top 1 name from Cloud_Users where cellPhone=15895211486");', "=A$1"],
  [2009, 0, 2941, 4303, 354, 5814],
  [2010, 5, 2905, 2867, '=SUM(A4,2,3)', '=$B1'],
  [2011, 4, 2517, 4822, 552, 6127],
  [2012, '=SUM(A2:A5)', '=SUM(B5,E3)', '=A2/B2', 12, 4151]
 ];


      function negativeValueRenderer(instance, td, row, col, prop, value, cellProperties) {
        Handsontable.renderers.TextRenderer.apply(this, arguments);

        var escaped = Handsontable.helper.stringify(value),
        newvalue;

        if (escaped.indexOf('return') === 0) {
          //计算列为只读
          //cellProperties.readOnly = true;
          td.style.background = '#EEE';
          newvalue = document.createElement('span');
          $.ajax({
            //提交数据的类型 POST GET
            type: "POST",
            //提交的网址
            url: "/services/CSEngine.ashx",
            //提交的数据
            data: { code: value, code2: escaped },
            //返回数据的格式
            datatype: "html",//"xml", "html", "script", "json", "jsonp", "text".
            //在请求之前调用的函数
            //beforeSend: function () { $("#msg").html("logining"); },
            //成功返回之后调用的函数       
            success: function (data) {
              // $("#msg").html(decodeURI(data));
              newvalue.innerHTML = decodeURI(data);
            },
            //调用执行后调用的函数
            complete: function (XMLHttpRequest, textStatus) {
              //alert(XMLHttpRequest.responseText);
              // alert(textStatus);
              //HideLoading();
            },
            //调用出错执行的函数
            error: function () {
              //请求出错处理
              // alert('error')
            }
          });
         

          Handsontable.Dom.addEvent(newvalue, 'mousedown', function (e) {
            e.preventDefault(); // prevent selection quirk
          });

          Handsontable.Dom.empty(td);
          td.appendChild(newvalue);
        }
        // if row contains negative number
        if (parseInt(value, 10) < 0) {
          // add class "negative"
          td.className = 'negative';
        }

       
      }



 //类似excel进行拖放,公式会变
 var container1 = $('#handsontable-code');
 Handsontable.renderers.registerRenderer('negativeValueRenderer', negativeValueRenderer);
 container1.handsontable({
  data: data1,
  minSpareRows: 1,
  colHeaders: true,
  rowHeaders: true,
  contextMenu: true,
  manualColumnResize: true,
  formulas: true,
   cells: function (row, col, prop) {
          var cellProperties = {};
          var escaped = Handsontable.helper.stringify(this.instance.getData()[row][col]);
          if (escaped.indexOf('return')===0) {
            cellProperties.renderer = "negativeValueRenderer"; 
          }
  

          return cellProperties;
        }
 });
 
});
   
  </script>

其中 =SUM(B5,E3)的公式是RuleJs提供的,return 1+2是自己实现的C#代码脚本,需要单击解析:

public class CSEngine : IHttpHandler {
  private static int count = 0;
  public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "text/plain";

    try
    {
      count++;
      string ret = "";
      string code = context.Request["code"].ToString();
      if (string.IsNullOrEmpty(code))
      {
        ret = "参数错误";
      }
      else
      {
        ScriptOptions options = ScriptOptions.Default
         .AddReferences(
           Assembly.GetAssembly(typeof(DBServices.DataAccess))
          )
         //.AddImports("System.Data")
         //.AddImports("System.Data.SqlClient")
         .AddImports("DBServices");
        var state = CSharpScript.RunAsync(code, options).Result.ReturnValue;
        ret = state.ToString();

        state = null;
        options = null;
      }
      Console.WriteLine(count);
      context.Response.Write(ret);
    }
    catch(Exception ex)
    {
      //error
      Console.WriteLine(count);
    }
  }

  public bool IsReusable {
    get {
      return false;
    }
  }

}

运行代码,如下:

在web中js实现类似excel的表格控件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
老鱼 浅谈javascript面向对象编程
Mar 04 Javascript
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
js判断元素是否隐藏的方法
Jun 09 Javascript
Javascript window对象详解
Nov 12 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
jquery checkbox的相关操作总结
Oct 17 Javascript
jQuery的$.extend 浅拷贝与深拷贝
Mar 08 Javascript
Angular directive递归实现目录树结构代码实例
May 05 Javascript
vue实现学生录入系统之添加删除功能
Jul 11 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
May 20 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
Nov 16 Javascript
Javascript点击按钮随机改变数字与其颜色
Sep 01 #Javascript
AngularJs 指令详解及示例代码
Sep 01 #Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
Sep 01 #Javascript
JS实现列表的响应式排版(推荐)
Sep 01 #Javascript
利用Jquery队列实现根据输入数量显示的动画
Sep 01 #Javascript
JavaScript中子对象访问父对象的方式详解
Sep 01 #Javascript
浅谈JavaScript 数据属性和访问器属性
Sep 01 #Javascript
You might like
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
javascript 学习之旅 (2)
2009/02/05 Javascript
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
ES6 十大特性简介
2020/12/09 Javascript
使用grappelli为django admin后台添加模板
2014/11/18 Python
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
pyenv命令管理多个Python版本
2017/03/26 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Django保护敏感信息的方法示例
2019/05/09 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
详解matplotlib绘图样式(style)初探
2021/02/03 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
关于工资低的辞职信
2014/01/14 职场文书
优秀共产党员先进事迹
2014/01/27 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
事业单位考察材料范文
2014/12/25 职场文书