对于layui导出所有数据 , 和数据中有15位以上纯数字 或者是数字 + 字母E 的情况下会便成为科学计数问题的解决 [06.28 底部补充]

原理就是我们可以自定义一个点击事件 , 去调用接口拿到我们需要的数据 . 

 

下面就是我自定义了一个按钮 

 

 如图下去调用这个自定义事件 

 

 下面是我把调用的函数进行了简单的封装 ,当然更多的判断也可以灵活的加进去 

 

 代码如下  fun这个函数我这里主要用于判断拿到的数据是不是空的,还有一些特殊的判断

function getTableAll(tableName ,  url,  urlType , data , fun) {
					$.ajax({
						url: url,
						type: urlType,
						headers: {
							"Authorization-Key": tdUserInfos.getUserTokenKey(),
							"Authorization": tdUserInfos.getUserToken()
						},
						data: data || {},
						async: false,
						dataType: 'json',
						success: function(res) {
							if(fun) {
								fun(res.data.record) ;
							}
							table.exportFile(tableName , res.data.record);
						}
					});
				}

 这样子我们的数据就可以拿到所有的了, 当然还得取决于单页这个参数的值是多少,或者后端通过一些条件也许我们拿到所有的数据 

 

那数据拿到了, 但是我们会发现如果是15位以上的纯数字 , 或者是在一定条件下, 我们的值是数字 + 字母E的情况下 , 他还是会转为科学计数的 ,  这个解决的方法如下图 :

 

 其实主要就是红框那个判断  为了方便 我把代码直接复制下来 , 找到  d.exportFile [没有的话 找到 c.exportFile 来覆盖就可以了  ]

 c.exportFile = function (e, t, i) {
		                 t = t || d.clearCacheKey(d.cache[e]), i = i || "csv";
		                 var a = c.config[e] || {},  // 分页按钮
		                     l = {csv: "text/csv", xls: "application/vnd.ms-excel"}[i], // meta格式
		                     n = document.createElement("a"), // a 标签
		                     type = i,
		                     meta = l,
		                     title = a.title
		  
		                 layui.each(t, function (ks, vs) {
		                     var inner = {}
		                     layui.each(vs, function (k, v) {
								 if(/^[0-9eE]+$/.test(v)){
									 vs[k] = vs[k] + '\t';
								 }
		                         inner[k] = vs[k]
		                     });
		                     t[ks] = inner
		                 })
		                 if (r.ie) {
		                     var i = [], a = [];
		                     layui.each(t, function (t, l) {
		                         var n = [];
		                         "object" == typeof e ? (layui.each(e, function (e, a) {
		                             0 == t && i.push(a || "")
		                         }), layui.each(c.clearCacheKey(l), function (e, t) {
		                             n.push(t)
		                         })) : c.eachCols(e, function (e, a) {
		                             a.field && "normal" == a.type && !a.hide && (0 == t && i.push(a.title || ""), 		      n.push(l[a.field]))
		                         }), a.push(n.join(","))
		                     });
		                     var data = i.join(",") + "\r\n" + a.join("\r\n")
		                     navigator.msSaveBlob(new Blob(['\ufeff' + data], {type: meta + ';charset=utf-8;'}), title + '.' + type)
		                 } else {
		                     return n.href = "data:" + l + ";charset=utf-8,\ufeff" + encodeURIComponent(function () {
		                         var i = [], a = [];
		                         return layui.each(t, function (t, l) {
		                             var n = [];
		                             "object" == typeof e ? (layui.each(e, function (e, a) {
		                                 0 == t && i.push(a || "")
		                             }), layui.each(c.clearCacheKey(l), function (e, t) {
		                                 n.push(t)
		                             })) : c.eachCols(e, function (e, a) {
		                                 a.field && "normal" == a.type && !a.hide && (0 == t && i.push(a.title || ""), n.push(l[a.field]))
		                             }), a.push(n.join(","))
		                         }), i.join(",") + "\r\n" + a.join("\r\n")
		                     }()), n.download = (a.title || "table_" + (a.index || "")) + "." + i, document.body.appendChild(n), n.click(), void document.body.removeChild(n)}
		             },

  

 如果覆盖的是c.exportFile ,在当前函数体内 ,有一些东西是没有的 , 会报错的 ,把所有的d.变量/函数 修改为 c.变量/函数 就可以了 ,这样的话就没问题了。 

 

 

06.28----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 之前判断太多了, 要考虑 特殊字符串 例如 1111E  : 依然是科学计算 , 02-10-1 会转译为日期 2002/10/01的 , 还要考虑 ,和,的替换, 所以把可以直接转义的直接转义, 把之前正则判断直接去掉了。

之所以还要判断 null 是因为 , 如果直接转义的话 , 你会拿到null , 貌似不合理 , 但是已经做了 类型判断. 如果是object类型的话会调用自定义函数, 但是null并不是可遍历的一个对象, 所以再加上一个null的判断。

 

如果有一些  数字代表的意义 例如 srrData = 1    // 1 代表 完成 , 2代表进行中, 目前只能自定义好数据格式, 在layui的表格里面我暂时拿不到已经写好的逻辑和回显。

 

posted @ 2022-06-24 14:16  小小潜力股i  阅读(352)  评论(0编辑  收藏  举报