
以下代码,因缺少必要文件,无法直接运行,仅供参考:
import win.ui;
import godking.vlistEx
/*DSG{{*/
var winform = win.form(text="aardio form";right=959;bottom=679;maximize=1)
winform.add(
plus={cls="plus";text="提取豆包价格";left=184;top=616;right=320;bottom=664;db=1;dl=1;notify=1;z=2};
plus2={cls="plus";text="计算明日价格";left=352;top=616;right=488;bottom=664;db=1;dl=1;dr=1;notify=1;z=3};
plus3={cls="plus";text="导出明日价格表";left=520;top=616;right=656;bottom=664;db=1;dr=1;notify=1;z=4};
plus4={cls="plus";text="复制豆包查询语句";left=16;top=616;right=152;bottom=664;db=1;dl=1;notify=1;z=5};
vlistEx={cls="vlistEx";text="自定义控件";left=8;top=8;right=952;bottom=600;border=1;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/
import godking.message
import console
winform.vlistEx.padding=0;
winform.vlistEx.setRowHeight(30);
var 豆包查询 = `今日蔬菜以下品种的批发价格:白萝卜、胡萝卜、马铃薯、大蒜、姜、大葱、黄洋葱、红洋葱、大白菜、结球甘蓝、菜花、西兰花、芹菜、黄瓜、青冬瓜、长南瓜、红南瓜、绿南瓜、西葫芦、大红西红柿、樱桃西红柿、长茄、圆茄、甜椒、尖椒、菜豆、油菜、青萝卜、小黄瓜、丝瓜、苦瓜、菠菜。`
//生成列数据
var day = time.now().addDays(1);
var 明日价格日期 = day.format("YYYY-MM-DD");
var 昨日价格日期 = time.now().format("YYYY-MM-DD");
var 明日价格列 = 0;
var 昨日价格列 = 0;
var 豆包列 = 10;
var count3=0;
var firstday;
do{
var week = day.dayofweek;
if week==3 count3++;
if count3==2 {
firstday = time(day);
break;
}
day.addDays(-1);
} while(1);
var fields = {"品种"};
var weeks = {"周三","周四","周五","周六","周日","周一","周二","平均涨跌","豆包价","周三","周四","周五","周六","周日","周一","周二"}
var files = {};
var days = {};
for(i=1,7,1){
var day = firstday.format("YYYY-MM-DD");
if day === 昨日价格日期 {
昨日价格列 = i+1;
}
..table.push(days,day);
..table.push(fields,weeks[i]++'\n'++day)
var file = "\每日价格表\"++firstday.year++"年\"++firstday.month++"月\"++"每日价格_"++firstday.format("YYYYMMDD")++".xls";
..table.push(files,file);
firstday.addDays(1)
}
..table.push(days,"");
..table.push(fields,'平均价 周涨跌')
..table.push(files,"");
..table.push(days,"");
..table.push(fields,'豆包价')
..table.push(files,"");
for(i=10,16,1){
var day = firstday.format("YYYY-MM-DD");
if day === 明日价格日期 {
明日价格列 = i+1;
}
if day === 昨日价格日期 {
昨日价格列 = i+1;
}
..table.push(days,day);
..table.push(fields,weeks[i]++'\n'++day)
var file = "\每日价格表\"++firstday.year++"年\"++firstday.month++"月\"++"每日价格_"++firstday.format("YYYYMMDD")++".xls";
..table.push(files,file);
firstday.addDays(1)
}
winform.vlistEx.setColumns(fields /*列标题*/,90/*列宽*/,1/*0左1中2右*/);
//生成行数据
var shucai = string.split("白萝卜,胡萝卜,马铃薯,大蒜,姜,大葱,黄洋葱,红洋葱,大白菜,结球甘蓝,菜花,西兰花,芹菜,黄瓜,青冬瓜,长南瓜,红南瓜,绿南瓜,西葫芦,大红西红柿,樱桃西红柿,长茄,圆茄,甜椒,尖椒,菜豆,油菜",",");
import godking.libxl
//统计上周均价
var jiages,上周均价 = {},{};
for(i=1,#shucai,1){
jiages[i] = {shucai[i]};
}
for(i=1,7,1){ //上周数据
var file = ..io.exist(files[i]);
if !file return winform.msgErr("上周价格文件缺失,无法形成对比数据:"++files[i]);
var book = godking.libxl.open(file /*文件*/,/*表名或索引*/,/*文件密码*/);
var sheet = book.sheet(/*表名称或索引*/);
var tb = sheet.getTable("D3","D30",/*字段表*/,/*空文本替代符*/,/*是否转文本*/,/*是否数字格式化*/,/*是否计算公式*/,/*公式空默认值*/);
book.close();
if #tb!==28 return winform.msgErr("品种价格缺失:"++files[i]);
table.remove(tb,27);
tb = table.flat(tb);
for(n=1,#tb,1){
上周均价[n]:=0;
上周均价[n] += tb[n];
table.push(jiages[n],tb[n]);
}
}
for(n=1,#上周均价,1){
上周均价[n] = ..math.round(上周均价[n]/7,2);
}
//涨跌列数据
for(n=1,#jiages,1){
table.push(jiages[n],"0%");
table.push(jiages[n],0);
}
//统计本周价格数据
var 本周均价,本周数量 = {},0;
for(i=10,16,1){ //上周数据
var file = ..io.exist(files[i]);
if !file break;
本周数量 ++;
var book = godking.libxl.open(file /*文件*/,/*表名或索引*/,/*文件密码*/);
var sheet = book.sheet(/*表名称或索引*/);
var tb = sheet.getTable("D3","D30",/*字段表*/,/*空文本替代符*/,/*是否转文本*/,/*是否数字格式化*/,/*是否计算公式*/,/*公式空默认值*/);
book.close();
if #tb!==28 return winform.msgErr("品种价格缺失:"++files[i]);
table.remove(tb,27);
tb = table.flat(tb);
for(n=1,#tb,1){
本周均价[n]:=0;
本周均价[n]+=tb[n];
table.push(jiages[n],tb[n]);
}
}
for(n=1,27,1){
if 本周数量 {
本周均价[n] = ..math.round(本周均价[n]/本周数量,2);
} else {
本周均价[n] = 0;
}
}
winform.vlistEx.setTable( jiages /*数据表*/, false/*列标题*/,/*列宽*/,/*0左1中2右*/,/*转数组*/,/*转Utf8*/,/*克隆表*/,/*恢复设置*/);
winform.vlistEx.setColumnWidth(9 /*列号*/,140 /*宽度*/)
var getjunjia = function(row){
var count,all=0,0;
for(i=11,17,1){
var s = winform.vlistEx.getCellData(row /*行号*/,i/*列号或字段key*/);
if s!==null {
count ++ ;
all += s;
} else {
本周均价[row] = all?(..math.round(all/count,2)):0;
}
}
}
winform.vlistEx.onDrawCellRectBg = function(row,col,hdc,rect,bkcolor,text,font,align,valign,recall){
if col>=2 and col<=8 { //上周价格
gdi.fillRect(hdc,bkcolor,rect)
rect.top += (1-上周均价[row]/10)*rect.height
gdi.fillRect(hdc,0xFFBBBB,rect)
return true;
}
if col===豆包列 { //doubao
var rect1 = rect.clone();
rect1.inflate(-5,-5);
var p = godking.paint.fromHdc(hdc);
p.smoothMode = false;
p.offsetMode = false;
p.drawRect(rect1 /*绘制范围RECT*/,0xFF32CD32,/*线宽*/,/*线型*/);
p.close()
return true;
}
if col>=11 { //本周价格
var rect1 = rect.clone();
rect1.inflate(-5,-5);
gdi.fillRect(hdc,bkcolor,rect)
rect.top += (1-本周均价[row]/10)*rect.height
gdi.fillRect(hdc,0xBBFFBB,rect)
if 明日价格列===col {
var p = godking.paint.fromHdc(hdc);
p.smoothMode = false;
p.offsetMode = false;
p.drawRect(rect1 /*绘制范围RECT*/,0xFFFF4500,/*线宽*/,/*线型*/);
p.close()
}
return true;
}
}
import godking.paint
winform.vlistEx.onDrawCellRectContent = function(row,col,hdc,rect,bkcolor,text,font,align,valign){
if col===9 {
var p = godking.paint.fromHdc(hdc);
p.textAntiAlias = 5;
var y1 = rect.top + (1-上周均价[row]/10)*rect.height;
var y2 = rect.top + (1-本周均价[row]/10)*rect.height;
var pots = {{rect.left,y1},{rect.right,y2},{rect.right,rect.bottom},{rect.left,rect.bottom}};
p.fillPolygon(pots /*多点数组*/,0xFFFFBBBB);
p.drawText(rect /*文本范围RECT*/,'\u2000'++上周均价[row],::LOGFONT(name="宋体";h=12*owner.dpi;color=0xFF000000;brush=null),0/*格式*/,0/*水平*/,1/*垂直*/,false/*截短*/);
p.drawText(rect /*文本范围RECT*/,本周均价[row]++'\u2000',::LOGFONT(name="宋体";h=12*owner.dpi;color=0xFF000000;brush=null),0/*格式*/,2/*水平*/,1/*垂直*/,false/*截短*/);
var 涨跌 = math.round((本周均价[row]-上周均价[row])*100/上周均价[row],2);
var w = rect.width/3.5;
rect.inflate(-w,-5);
if 涨跌>=0 {
p.fillRoundRect(rect /*绘制范围RECT*/,60,0xFFFF4500);
} else {
p.fillRoundRect(rect /*绘制范围RECT*/,60,0xFF32CD32);
}
p.drawText(rect /*文本范围RECT*/,涨跌++"%",::LOGFONT(name="宋体";h=12*owner.dpi;color=0xFFFFFFFF;bold=0),0/*格式*/,1/*水平*/,1/*垂直*/,false/*截短*/);
p.close();
return true;
}
if col===明日价格列 and #text { //本周价格
var rect1 = rect.clone();
rect1.inflate(-7,-7);
var p = godking.paint.fromHdc(hdc);
p.textAntiAlias = 5;
p.drawText(rect1 /*文本范围RECT*/,text,font,0/*格式*/,0/*水平*/,1/*垂直*/,false/*截短*/);
var v = tonumber(text);
var v1 = winform.vlistEx.getCellData(row /*行号*/,昨日价格列/*列号或字段key*/);
var cha = ..math.round((v-v1)/v1*100,1);
rect1.left = rect1.left + rect1.width/2-5;
if cha>=0 {
p.fillRoundRect(rect1 /*绘制范围RECT*/,0/*圆角半径*/,0xFFFF4500);
} else {
p.fillRoundRect(rect1 /*绘制范围RECT*/,0/*圆角半径*/,0xFF32CD32);
}
p.drawText(rect1 /*文本范围RECT*/,cha++"%",::LOGFONT(name="宋体";h=12*owner.dpi;color=0xFFFFFFFF),0/*格式*/,1/*水平*/,1/*垂直*/,false/*截短*/);
p.close()
return true;
}
}
winform.vlistEx.onResizeCol = false;
winform.vlistEx.onEditBegin = {true,10,明日价格列};
winform.vlistEx.onEditEnd = function(row/*行*/,col/*列*/,text/*内容*/,endType/*结束类型*/){
/*单元格编辑完毕事件。注意:只有onEditBegin事件返回true,此事件才会触发。若不定义此事件,则等同于返回true。
endType为触发编辑结束的事件类型,_vlistEx_endType开头的常量,定义如下:
1、失去焦点;2:按了回车;3:按了TAB;4:点击编辑框以外区域;5:下拉框选择了项目;
返回值可以有多个:
1、是否允许修改。false不允许,true允许,返回文本则改为新文本;
2、事件处理完毕后需继续执行的函数;
从第3个往后:给返回值2函数传递的参数;
*/
var jiage = tonumber(text);
if !jiage return false;
var zuori = winform.vlistEx.getCellData(row /*行号*/,昨日价格列/*列号或字段key*/);
if !zuori return false;
if ..math.abs((jiage-zuori)/zuori)>0.1 return false;
return true;
}
import win.clip
winform.plus.oncommand = function(id,event){
var text = win.clip.read();
text = ..string.replace(text,' ','');
var 蔬菜 = {"白萝卜","胡萝卜",{"马铃薯","土豆"},"大蒜",{"姜","生姜"},"大葱","黄洋葱","红洋葱",
"大白菜",{"结球甘蓝","包菜"}, "菜花","西兰花","芹菜",{"黄瓜","普通黄瓜"},"青冬瓜","长南瓜","红南瓜","绿南瓜","西葫芦",
"大红西红柿",{"樱桃西红柿","千禧"},"长茄","圆茄",{"甜椒","彩椒","圆椒"},{"尖椒","青椒"},{"菜豆","芸豆"},{"油菜","上海青"}}
var t = {};
var ss = ..string.split(text,'\r\n');
for(i=1,#ss,1){
var sss = ..string.split(ss[i],"<:>");
if #sss=2 {
sss[2] = tonumber(sss[2])
if sss[2] {
var s = ..string.split(sss[1],"((");
sss[1] = s[1];
..table.push(t,sss);
}
}
}
for(i=1,27,1){
var s = 蔬菜[i];
if type(s)===type.table {
for(n=1,#t,1){
for(j=1,#s,1){
if t[n][1]===s[j] {
winform.vlistEx.setCellText( i/*行号*/,10/*列号或字段key*/,t[n][2]/*单元格数据*/);
continue;
}
}
}
} else {
for(n=1,#t,1){
if t[n][1]===s {
winform.vlistEx.setCellText( i/*行号*/,10/*列号或字段key*/,t[n][2]/*单元格数据*/);
continue;
}
}
}
}
}
winform.plus2.oncommand = function(id,event){
for(i=1,27,1){
zuori = winform.vlistEx.getCellData(i /*行号*/,昨日价格列/*列号或字段key*/);
doubao = winform.vlistEx.getCellData(i /*行号*/,豆包列/*列号或字段key*/);
if !zuori or ! doubao {
winform.vlistEx.setCellText(i /*行号*/,明日价格列/*列号或字段key*/,0/*单元格数据*/);
continue;
}
var mingri;
if doubao>=zuori { //价格上涨
mingri = zuori*(1+math.random(1,6)/100);
} else { // 价格下跌
mingri = zuori*(1-math.random(1,6)/100);
}
mingri = math.round(mingri,2);
winform.vlistEx.setCellText(i /*行号*/,明日价格列/*列号或字段key*/,mingri/*单元格数据*/);
getjunjia(i);
}
}
var getliang = function(min,max,base){
if !min or !max or !base return 0;
var v = 0;
do{
v = base * (1+math.random(-10,10)/100);
} while(v<min or v>max);
return math.round(v,0);
}
winform.plus3.oncommand = function(id,event){
var zuoriwenjian = files[昨日价格列-1];
var mingriwenjian = files[明日价格列-1];
if !mingriwenjian {
var day = time.now().addDays(1);
mingriwenjian ="\每日价格表\"++day.year++"年\"++day.month++"月\"++"每日价格_"++day.format("YYYYMMDD")++".xls";
..io.createDir("\每日价格表\"++day.year++"年");
..io.createDir("\每日价格表\"++day.year++"年\"++day.month++"月");
}
if io.exist(mingriwenjian) {
if !winform.msgAsk('文件已存在,是否覆盖?\n'++mingriwenjian) return ;
}
var book = godking.libxl.open(zuoriwenjian /*文件*/,/*表名或索引*/,/*文件密码*/);
var sheet = book.sheet(/*表名称或索引*/);
//标题
sheet.setCellStr(1/*行号*/,1/*列号*/,days[明日价格列-1]++"价格指数数据"/*文本*/,/*单元格格式*/,/*合并单元格处理方式*/);
//正常品种
for(i=1,26,1){
var jiage = winform.vlistEx.getCellData(i /*行号*/,明日价格列/*列号或字段key*/);
sheet.setCellValue(i+2/*行号*/,4/*列号*/,jiage/*写入值*/,/*单元格格式*/,/*合并单元格处理方式*/);
var base = sheet.getCellNum(i+2/*行号*/,5/*列号*/,/*合并单元格处理方式*/):0;
var min = sheet.getCellNum(i+2/*行号*/,6/*列号*/,/*合并单元格处理方式*/):0;
var max = sheet.getCellNum(i+2/*行号*/,7/*列号*/,/*合并单元格处理方式*/):0;
shuliang = getliang(min,max,base);
sheet.setCellValue(i+2/*行号*/,5/*列号*/,shuliang/*写入值*/,/*单元格格式*/,/*合并单元格处理方式*/);
}
//油菜
var jiage = winform.vlistEx.getCellData(27 /*行号*/,明日价格列/*列号或字段key*/);
sheet.setCellValue(30/*行号*/,4/*列号*/,jiage/*写入值*/,/*单元格格式*/,/*合并单元格处理方式*/);
//保存
mingriwenjian = ..io.fullpath(mingriwenjian);
book.save(mingriwenjian);
book.close();
winform.msgOk('已保存完至:\n'++mingriwenjian,1000);
}
winform.plus4.oncommand = function(id,event){
win.clip.write(豆包查询);
winform.msgOk("已复制到剪贴板",1000);
}
import godking.skin
godking.skin.setBlue(winform,/*排除列表*/,50/*圆角半径*/,/*渐变方向*/,/*文本颜色*/);
winform.show();
winform.vlistEx.redraw(/*是否强制*/);
win.loopMessage();