对于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的表格里面我暂时拿不到已经写好的逻辑和回显。