vlistEx+com.excel读取表格的日期和浮点型字符问题2025-8-8

zhhyit 6天前 161

结果数据展示,如何把表格里的日期、浮点型数据,平滑通过vlistEx.setTable进行转换

我看通过com.excel获取的Table的表的值也是有问题的



代码部分

import win.ui;
import com.excel;
import godking.vlistEx;
import console;
/*DSG{{*/
var mainForm = win.form(text="表格测试";right=438;bottom=487)
mainForm.add(
button={cls="button";text="读取表格数据";left=13;top=452;right=109;bottom=480;z=2};
vlist={cls="vlistEx";left=9;top=17;right=434;bottom=445;ah=1;aw=1;border=1;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

var excel,err = com.excel(); 
excel.alerts = false; //关闭界面提示与屏幕更新
var book = excel.Open( "D:\test.xlsx" );
var sheet = excel.ActiveWorkbook.Sheets(1);
var t ={"序号","水果","重量","开售日期","备注"};
//var tt ={};
var tt = sheet.Range("A1:E11").Value2;

console.dumpTable(tt)
mainForm.vlist.setTable(tt,table.remove(tt),{scale =true,5,5,5,10,10},1);

//console.pause(true)
excel.Quit(); //退出

mainForm.show();
win.loopMessage();

最新回复 (8)
  • 光庆 6天前
    0 2

    45877 转 08-08 的方法:

    tostring(..time.ole(45877,"%m-%d"))


    45877 转 08月08日 的方法:

    tostring(..time.ole(45877,"%m月%d日"))



  • 光庆 6天前
    0 3

    重量获取,我感觉要看数据类型,看看是不是float和double的问题。我这里测试,获取小数没问题。

  • zhhyit 6天前
    0 4
    光庆 45877 转 08-08 的方法:tostring(..time.ole(45877,"%m-%d"))45877 转 08月08日 的方法:tostring(. ...
    光庆,大佬 能不能统一通过vlistEx库,搞个函数 1、统一对某列数值进行统一转换日期; 2、统一对某列数值进行统一四舍五入、小数点调整;
  • zhhyit 6天前
    0 5
    光庆 重量获取,我感觉要看数据类型,看看是不是float和double的问题。我这里测试,获取小数没问题。

    统一对单元格的格式调整之后,也是没啥效果

  • zhhyit 6天前
    0 6
    光庆 重量获取,我感觉要看数据类型,看看是不是float和double的问题。我这里测试,获取小数没问题。

    表格的单元格里用了RAND(),所以每次获取的数值不一样,我看小数点好长,想着能统一在vlistEx库中统一对获取的数据进行格式调整

  • 光庆 6天前
    0 7
    zhhyit 光庆,大佬 能不能统一通过vlistEx库,搞个函数 1、统一对某列数值进行统一转换日期; 2、统一对某列数值进行统一四舍五入、小数点调整;
    import time.ole
    winform.vlist.onDrawCellContent = function(row,col,hdc,rect,bkcolor,text){
    	if col===5 and text return false,null,tostring(time.ole(tonumber(text),"%m月%d日")); 
    	if col===4 and text return false,null,..string.format("%.2f", tonumber(text)); 
    }


  • zhhyit 6天前
    0 8
    光庆 import time.ole winform.vlist.onDrawCellContent = function(row,col,hdc,r ...


    我试了下确实可以,注意删除掉返回值:是否跳过原绘制过程、新bkcolor、新text。均可选。不要跳过原绘制过程,设置false,或者不要返回值。

    没想到要在这么早期的绘制阶段,处理数值,那这个想象力就大了,第一次接触这么早期的一个函数

    多谢光庆大佬的vlistEx库

    完整代码如下

    import win.ui;
    import com.excel;
    import godking.vlistEx;
    import console;
    import time.ole;
    /*DSG{{*/
    var mainForm = win.form(text="表格测试";right=438;bottom=487)
    mainForm.add(
    ImportExcelDate={cls="button";text="读取表格数据";left=13;top=452;right=109;bottom=480;z=2};
    vlist={cls="vlistEx";left=9;top=17;right=434;bottom=445;ah=1;aw=1;border=1;db=1;dl=1;dr=1;dt=1;z=1}
    )
    /*}}*/
    
    var excel,err = com.excel(); 
    excel.alerts = false; //关闭界面提示与屏幕更新
    
    var book = excel.Open( "D:\test.xlsx" );
    var sheet = excel.ActiveWorkbook.Sheets(1);
    var t ={"序号","水果","重量","开售日期","备注"};
    var tt ={};
    var tt = sheet.Range("A2:E11").Value2;
    
    //console.dumpTable(tt)
    mainForm.vlist.setTable(tt,t/*table.remove(tt)*/,{scale =true,5,5,5,10,10},1);
    
    //console.pause(true)
    
    mainForm.ImportExcelDate.oncommand = function(id,event){
    	//var tt = sheet.Range("A1:E11").Value2;
    	console.dumpTable(tt)
    	mainForm.vlist.setTable(tt,t/*table.remove(tt)*/,{scale =true,5,5,5,10,10},1);	
    }
    
    mainForm.onClose = function(hwnd,message,wParam,lParam){
       excel.Quit(); //退出 
    }
    mainForm.vlist.onDrawCellContent = function(row,col,hdc,rect,bkcolor,text){
    	/*绘制单元格背景后,开始【绘制单元格有效区域,含第一列中的选择框和树形线】前,触发该事件。
    	  rect为单元格全部区域(含CellRect和padding)。CellRect部分会被有效区域背景遮盖。
    	  返回值:是否跳过原绘制过程、新bkcolor、新text。均可选。
    	  上一事件:onDrawCellBg()  下一事件:onDrawCellRect() */
    	if col===4 and text return false,null,tostring(time.ole(tonumber(text),"%m月%d日")); 
        if col===3 and text return false,null,..string.format("%.2f", tonumber(text)); 
    	return false,newbklolor,newtext;
    }
    
    mainForm.show();
    win.loopMessage();


  • 光庆 5天前
    1 9
    zhhyit 我试了下确实可以,注意删除掉返回值:是否跳过原绘制过程、新bkcolor、新text。均可选。不要跳过原绘制过程,设置false,或者不要返回值。没想到要在这么早期的绘制阶段,处理数值,那这个想象力就 ...

    更新到最新版本,增加了一个事件函数,可以更方便的处理原始数据:

    winform.vlist.onGetData = function(row,col,data){
    	if col===5 and data return time.ole(data,"%m月%d日"); 
    	if col===4 and data return ..string.format("%.2f", data); 	
    	return data; 
    }


返回