微信小程序有个限制,不能用eval()函数或者new function函数。就是动态执行代码不行。网上搜了一下有个eval5,作为替换
具体查看:
eval5: 基于 TypeScript 编写的 JavaScript 解释器,支持完整 ES5 语法
小程序eval/Function终极替代方案:eval5 | 微信开放社区--这里有小程序版本和案例
--本人基于eval5,写了个复制就是结果的工具。(微信小程序名字,复制就好)
需求:Excel处理数据有缺陷,特别是公示不够多,字符串切分比较麻烦。比如一个 123abc甲乙123de;这样一个包含数字和字符的,中文的,要提取数字,提取字母,相对而言比较累。
解决方案:用JS公式来解决。
可编程的js轻量解决工具就来了,借鉴小程序的复制功能(输入),粘贴功能(输出)就可以方便获取输入数据(复制),处理数据后,输出(粘贴)。
对于普通用户来说,就是复制粘贴等于完成。对于会编程的,还可以修改公式,自己写公式来解决个性化的需求。
下面已经编辑了以下公式:去除字母,去除数字,保留字母,保留数字等公式,后续个性化的需求可以直接处理。比如每次都要替换的,那么写个替换数组,每次都要删除的,写个删除数组。
总结以下 数据处理的基本步骤
1、删除,把不要的信息删除掉
2、替换,把数据标准化,比如有人输入i,其实想输入1,有人输入一,其实就是1;
3、分割处理,字符可以一个一个的处理,判断;
下面是一个案例,用于处理微信接龙的数据,有个高手用excel写了个插件;
开发一个社区团购微信接龙报表自动生成的Excel插件 - yycoding
我认为可以用一些更加轻量的工具处理,当然本身来说用群报数、接龙助手等这种小程序能更好的收集统计信息。
我这里用这个做案例的意思就是,给你一堆有规律但是也有错误的数据,如何能够快速整理并把它结构化;然后导入到excel里边做二次加工,excel的数据透视图还是不错的,展现加打印,自己写一个看起来难度很大。
代码如下:是js写的,可以在小程序中用,let app=this
var result =['ok']
let copyStr=app.data.copyStr
let outstr='序号;房号;产品;数量;单价;金额'
let colData=[]
let value=''
let vline=0;
let louno='';
let lno='';
let n1=0
let str1='';
let num1='';
let del=['1号','1-','份','包','*',',','1一','盒','袋',',','。',';']
let rp1=['i','I','l','一','二']
let rp2=['1','1','1','1','2']
let rowData0=copyStr.split("\r\n")
for(let i=0;i<del.length;i++)
{
copyStr=replaceall(copyStr,del[i],'')
}
for(let i=0;i<rp1.length;i++)
{
copyStr=replaceall(copyStr,rp1[i],rp2[i])
}
let rowData=copyStr.split("\r\n")
if(rowData[rowData.length-1]==""){rowData.pop()}
console.log(rowData)
for(let i=0;i<rowData.length;i++)
{
outstr=outstr+'\r\n'+'\r\n'+rowData0[i]
value=rowData[i]
n1=value.indexOf('.');
vline=value.slice(0,n1);//序号
value=value.slice(n1+1);
console.log(value)
let del2=['先生','女士','小姐']//去掉x先生等,3个字符
for(let m=0;m<del2.length;m++)
{
if(value.indexOf(del2[m])!==-1)
{n1=value.indexOf(del2[m])
if(n1-1>0||!isNum(value.charAt(n1-1)))
{
value=replaceall(value,value.charAt(n1-1)+del2[m],'')
}
}
}
for(let j=0;j<value.length;j++)
{//获取房间号
lno='';
if(!isNum(value.charAt(j)))
{
if(louno!==''){
value=value.slice(j);
lno=louno;
console.log(value+'aaa'+lno)
louno='';
break;}
}
else
{
louno=louno+''+value.charAt(j);
}
}
for(let j=0;j<value.length;j++)
{
if(!isNum(value.charAt(j)))
{
if(num1!==''){outstr=outstr+'\r\n'+vline+';'+lno+';'+str1.trim()+';'+num1; str1='';}
str1=str1+value.charAt(j);
num1='';
}
else
{
num1=num1+''+value.charAt(j);
}
// console.log(str1+'aa'+num1)
if(j==value.length-1){outstr=outstr+'\r\n'+vline+';'+lno+';'+str1.trim()+';'+num1;num1='';str1='';}
}
}
console.log(outstr)
app.data.outStr=outstr;
function replaceall(str, substr, newstr) {
var p = -1;
var s = 0;
while((p = str.indexOf(substr, s)) > -1) {
s = p + newstr.length;
str = str.replace(substr, newstr);
}
return str;
};
function isNum(val){
var regPos = /^[0-9]+.?[0-9]*/;
if(regPos.test(val)){
return true;
}else{
return false;
}
};
var idx = 1;
var timer = setInterval(function(){
app.setData({
result: result.join(','),
idx: idx++
});
if(idx > 10) {
clearInterval(timer);
idx = 1;
app.setData({
isRunning: false
});
}
}, 200);
result;
复制详细信息里边的数据,点运行,粘贴到excel就是如下的数据
数据结构是 标题行+空格行+原数据行+有结构数据行(可能多行)+空格行
因为最终还是要核对一下数据,毕竟是不规则的数据,程序可能处理不完整
WPS的分列功能用一下。
如果没有问题,把不要行都删除
序号 | 房号 | 产品 | 数量 | 单价 | 金额 |
1 | 904 | 蔬菜 | 1 | ||
2 | 1002 | 牛肉酱 | 1 | ||
2 | 1002 | 白糖 | 1 | ||
2 | 1002 | 鸡蛋 | 1 | ||
3 | 1004 | 白糖 | 1 | ||
3 | 1004 | 牛肉酱 | 1 | ||
3 | 1004 | 盐 | 1 | ||
4 | 503 | 蔬菜 | 1 |
然后用vlookup获取一下单价,金额=单价*数量
序号 | 房号 | 产品 | 数量 | 单价 | 金额 |
1 | 904 | 蔬菜 | 1 | 2 | 2 |
2 | 1002 | 牛肉酱 | 1 | 10 | 10 |
2 | 1002 | 白糖 | 1 | 1 | 1 |
2 | 1002 | 鸡蛋 | 1 | 4 | 4 |
3 | 1004 | 白糖 | 1 | 1 | 1 |
3 | 1004 | 牛肉酱 | 1 | 20 | 20 |
3 | 1004 | 盐 | 1 | 1 | 1 |
4 | 503 | 蔬菜 | 1 | 2 | 2 |
数据透视图
求和项:数量 | 产品 | |||||
房号 | 白糖 | 鸡蛋 | 牛肉酱 | 蔬菜 | 盐 | 总计 |
503 | 1 | 1 | ||||
904 | 1 | 1 | ||||
1002 | 1 | 1 | 1 | 3 | ||
1004 | 1 | 1 | 1 | 3 | ||
总计 | 2 | 1 | 2 | 2 | 1 | 8 |
求和项:金额 | 产品 | |||||
房号 | 白糖 | 鸡蛋 | 牛肉酱 | 蔬菜 | 盐 | 总计 |
503 | 2 | 2 | ||||
904 | 2 | 2 | ||||
1002 | 1 | 4 | 10 | 15 | ||
1004 | 1 | 20 | 1 | 22 | ||
总计 | 2 | 4 | 30 | 4 | 1 | 41 |