使用UEditor富文本编辑器提取table数据

之前有一个功能是做导入商品,但是不是使用excel或者文档之类的直接导入,然后后台解析数据。此次采用的是用户直接复制excel中的数据到文本域中,前端再解析数据,解析为一个二维数组的方式,再传给后台查询完整信息。(项目比较老,使用jsp+jq完成的)。每行数据列数不确定(但对于前端不重要,有多少传多少,反正每一行的列数是相同的),但是列信息不一定全必录。

为适应项目,首先想到了采用如下的方式去显示和处理数据

页面显示部分如下:

<textarea type="text" id="inputInfo" value="">xxx</textarea>

关于数据处理:

// 把复制过来的数据转换为二维数组
 formaterValToJSON() {
    var _fmt = /\t/;
    var val = this.$_inputInfo.val() || _fmt;
    if (val == this.$_inputInfo[0].defaultValue) {
      return false;
    }
    var rowArr = val.split('\n');
    var _rowArr = [];
    for (var i = 0, lenR = rowArr.length; i < lenR; i++) {
      if (rowArr[i] == '' || rowArr[i].replace(/\t/g, '') == '') {
        continue;
      }
      var colArr = rowArr[i].split(_fmt);
      var _colArr = [];
      for (var j = 0, lenC = colArr.length; j < lenC; j++) {
        _colArr.push(colArr[j]);
      }
      _rowArr.push(_colArr);
    }
    if (_rowArr.length == 0) {
      return false;
    }
    return _rowArr;
}

这种方式能够很快的达到预期效果,只是关于导入完成后的数据处理在项目中比较麻烦,但这一步操作开发是很快的。

但同时也具有局限性,只考虑了用户从excel复制过来的数据,当时也没有测试从word过来的表格是不是一个效果,没有注意,需求也没有讲到这里,就跳过了。用户复制到文本域的内容也是不规则的,毕竟只是一个textarea,没有样式相关显示操作处理,只是简单实现一下就结束了。

可见,简单的完成,导致的结果是局限性太大,而且交互体验也不是很好,用户没办法在文本域中检查数据,因为列不是必录,也可能长短不一,所以每一列没有对齐,根本没有办法检查数据,只能点击导入之后再看看是不是正确的了........

于是,为了好看,我选择了曾经使用过的UEditor富文本编辑器,开开心心地去一步一步实现...

先引入必要的文件:

<script type="text/javascript" charset="utf-8" src="../ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="../ueditor/ueditor.all.min.js"> </script>
<script type="text/javascript" charset="utf-8" src="../ueditor/lang/zh-cn/zh-cn.js"></script>

然后还是加一个文本域(重要的是id,标签的话,应该是块标签就可以吧,以前我用的div):

<textarea id="inputInfo" type="text/plain"></textarea>

然后就去初始化我们的富文本编辑器了:

ueditor = UE.getEditor('inputInfo', {
  toolbars: [
    ['fullscreen', 'undo', 'redo', 'selectall', 'searchreplace', 'cleardoc', 'preview']
  ],
  autoHeightEnabled: false,
  autoFloatEnabled: true,
  initialFrameWidth: 850,
  elementPathEnabled: false,
  wordCount: false,
  enableContextMenu: true,
  autotypeset: {
    removeEmptyline: true,
    clearFontSize: true,
    clearFontFamily: true
  },
  retainOnlyLabelPasted: true,
  initialContent: 'xxx',
  autoClearinitialContent: true
});
ueditor.ready(function() {
  var height = $(window).height() - $("#inputInfo").offset().top - 50;
  ueditor.setHeight(height);
  $(".edui-editor-messageholder.edui-default").css({ "visibility": "hidden" });
  UE.dom.domUtils.on(ueditor.body, 'keydown', function(e) {
    var keyCode = e.keyCode || e.which;
    if (e.ctrlKey && keyCode == 86) {
      ctrlV = true;
    }
  });
});

UE.getEditor('inputInfoShow').addListener('contentChange', function() {
  // 如果内容改变就去触发事件,不太友好,所以只在粘贴内容的时候再去触发比较合适
  if (ctrlV) {
    THISPAGE.formaterValToHTML();
    ctrlV = !ctrlV;
  }
});

我只保留了很少的工具栏工具,因为我这里用不上,所以选了几个可以用得上的,初始化配置也是配置了需要用的东西。关于配置可以看文档编辑器初始化配置工具栏配置

完了之后一切ok。

对了中间有监听键盘事件,因为我只想在用户复制的时候去处理一下数据,因为在这里显示必须是表格,所以我想也不会有人无聊到去弄这个玩,而是为了功能使用达到目的即可。所以即使想添加数据,那也可以插入行,后面我提取table里面的数据就好了。不是复制的时候去改变数据,那就不用再继续去触发事件了,没必要。

一切ok,复制过来显示都ok,但是提交数据的时候才觉得难受,以前使用把样式保存一下就好,没必要做数据处理,毕竟我们显示的时候直接拿然后显示html就好,不用处理什么的。

现在却需要去处理table数据,内置的getContentTxt()不能达到要求,因为它只能取到文本,而我需要的是数组....

所以,我又开启了处理数据的代码编写......

var val = ueditor.getContent();
// 从word复制过来的表格里面会自动带出一系列样式及其他标签,先给过滤掉,只保留table类标签,便于提取数据
val = val.replace(/<(\/)?(p|br|span|strong|div)(\/)?>/g, '');
console.log(val)
var inputData = [];
val.replace(/<tr.*<\/tr>/g, function() {
  var trArr = arguments[0].split('</tr>');
  for (var i = 0, lenTR = trArr.length; i < lenTR; i++) {
    var flag = false;
    _trDataArr = [];
    var item = trArr[i];
    if (item == '') {
      continue;
    }
    item.replace(/<td.*<\/td>/g, function() {
      var tdArr = arguments[0].split('</td>');
      for (var j =0, lenTD = tdArr.length; j < lenTD; j++) {
        var ele = tdArr[j];
        if (ele == '') {
          continue;
        }
        var str = ele.replace(/<td.*>/ig, '');
        if (!flag && str != '') {
          flag = true;
        }
        _trDataArr.push(str);
      }
    });
    // 空行跳过
    if (flag) {
      inputData.push(_trDataArr);
    }
  }
});
return inputData;

就采用这样的方式去提取table里面的数据并且格式化为二维数组......

 

但是同样有局限性,只适用于从各处复制来的表格,如果不是表格,还是需要在之前的监听函数那里先格式化为二维数组,再拼接出一个html显示回去才行.......同时,复制的格式需要限定,否则根本没必要做除了表格之外的复制数据处理.....

就这样了,只做了表格的,别的还在思考中,想想其实也没必要做~~~用excel就能处理好,而且还很方便,我想也没人选择用一大块不规则的 文本 来存自己的多行多列信息吧~~~

关于有看到有大佬说用 form 提交之类的,我想了想,可能不太适合这种场景,也就没去试了。。。

希望各位大佬指教,这样就可以优化了,O(∩_∩)O哈哈~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下步骤在Spring Boot中集成UEditor富文本编辑器: 1.下载UEditor插件,将其解压缩到项目的静态资源目录(如:src/main/resources/static/ueditor)中。 2.在Spring Boot的配置文件application.properties或application.yml中添加如下配置: ```properties spring.resources.static-locations=classpath:/static/ ``` 或 ```yaml spring: resources: static-locations: classpath:/static/ ``` 3.编写一个Controller来访问UEditor插件,代码如下: ```java @Controller @RequestMapping("/ueditor") public class UeditorController { @GetMapping("/") public String index() { return "ueditor/index"; } @PostMapping("/upload") @ResponseBody public String upload(HttpServletRequest request) { String result = ""; try { // 获取UEditor上传的文件 MultipartFile file = ((MultipartHttpServletRequest) request).getFile("upfile"); // 获取文件名 String fileName = file.getOriginalFilename(); // 获取文件后缀 String suffix = fileName.substring(fileName.lastIndexOf(".")); // 生成新的文件名 String newFileName = UUID.randomUUID().toString() + suffix; // 获取文件保存路径 String savePath = "src/main/resources/static/ueditor/upload/"; File saveFile = new File(savePath + newFileName); // 保存文件 file.transferTo(saveFile); // 返回文件访问路径 result = "{\"state\":\"SUCCESS\",\"url\":\"/ueditor/upload/" + newFileName + "\",\"title\":\"" + fileName + "\",\"original\":\"" + fileName + "\"}"; } catch (Exception e) { e.printStackTrace(); result = "{\"state\":\"ERROR\"}"; } return result; } } ``` 4.在静态资源目录中创建一个index.html文件,代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>UEditor Demo</title> <!-- 引入UEditor --> <script type="text/javascript" src="/ueditor/ueditor.config.js"></script> <script type="text/javascript" src="/ueditor/ueditor.all.min.js"></script> <script type="text/javascript" src="/ueditor/lang/zh-cn/zh-cn.js"></script> </head> <body> <!-- 编辑器容器 --> <script id="editor" type="text/plain"></script> <!-- 实例化编辑器 --> <script type="text/javascript"> var editor = UE.getEditor('editor'); </script> </body> </html> ``` 5.启动应用,访问http://localhost:8080/ueditor/,即可看到UEditor富文本编辑器。 注意:在上传文件时,需要先创建一个文件夹(如:upload),并将其放在静态资源目录中。同时,需要对文件保存路径进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值